Spring Cloud系列断更了有一段时间了,这段时间最近都在忙着项目上的事,天天修复bug以及调整需求,反正各种操劳,了解业务需求,然后开发相关功能,很久都没碰Spring Cloud系列的相关文章了,最近回头看看,发现Spring Cloud的Ribbon还没举例进行介绍,就光生成了一个注册中心服务罢了,今天就将这个坑填充一下。
说到Ribbon,我们应该了解到关于他的:
负载均衡:Ribbon是一个客户端负载均衡器,它可以将客户端请求分发到多个服务实例上。一个常见的案例是在微服务架构中使用Ribbon来实现服务间的负载均衡。通过配置Ribbon的负载均衡策略,可以根据不同的需求选择合适的负载均衡算法。
服务发现:Ribbon可以与服务注册中心(如Eureka)集成,实现服务的自动发现和注册。通过与Eureka等服务注册中心配合使用,Ribbon可以动态地获取可用的服务实例列表,并根据负载均衡策略进行请求分发。
自定义负载均衡策略:Ribbon提供了多种负载均衡策略,如轮询、随机、权重等。除了使用内置的负载均衡策略外,你还可以根据自己的需求实现自定义的负载均衡策略。例如,你可以根据服务实例的性能指标或其他因素来动态调整请求的分发策略。
故障转移和容错:Ribbon还提供了故障转移和容错的功能。当某个服务实例不可用时,Ribbon可以自动将请求转发到其他可用的实例上,以提高系统的可用性和容错能力。
那么我们根据写一个案例:
还是利用我们的Spring Cloud系列之前搭建的框架
application.yml文件
server:port: 2381spring:application:name: ribbon-demo# eureka客户端注册到Eureka注册中心,切记需要启动eureka服务eureka:client:service-url:defaultZone: http://localhost:1000/eureka# ribbonribbon-demo:ribbon:listOfServers: https://ribbon-demo, https://feign-demo, http://ribbon-demo3
PS:注意,ribbon-demo是指的我们具体启动的相关服务,且这个服务需要注册到注册中心去,下边的https://ribbon-demo, https://feign-demo, http://ribbon-demo3分别代表不同的服务实例的URL地址。每个URL地址对应一个具体的服务实例,只是我这边简化了,全用Ribbon-demo代替了。
格式如下:
my-service:ribbon:listOfServers: http://service1, http://service2, http://service3
"my-service"
是一个代表服务名称的占位符。实际上,”my-service”可以是微服务架构中的任何一个具体的服务名称。
在微服务架构中,通常会有多个独立的服务组成一个完整的应用。每个服务都有自己的功能和职责。为了实现服务间的通信和调用,每个服务都会注册一个唯一的服务名称。
"http://service1"、"http://service2"和"http://service3"
是代表服务实例的URL地址。每个URL地址对应一个具体的服务实例。
在微服务架构中,一个服务通常会有多个实例运行在不同的主机或容器中,以提高系统的可用性和性能。这些服务实例可以是相同的代码部署在不同的服务器上,也可以是不同的服务副本。
为了实现负载均衡和容错,Ribbon需要知道可用的服务实例列表。这些URL地址可以是服务注册中心(如Eureka)中注册的服务实例的URL,也可以是手动配置的服务实例的URL。
接下来我们创建一个RibbonConfig作为我们的配置类:
@Configurationpublic class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}
作为Ribbon客户端:在应用中创建Ribbon的客户端。可以使用@LoadBalanced
注解来标记RestTemplate
或FeignClient
,以启用Ribbon
的负载均衡功能。
之后我们在控制类中发起请求
发起请求:使用Ribbon客户端发起请求。在代码中使用RestTemplate或FeignClient来发起HTTP请求,Ribbon会根据配置的负载均衡策略选择合适的服务实例。例如,使用RestTemplate的示例:
@RestControllerpublic class MyController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/my-service")public String callMyService() {return restTemplate.getForObject("http://ribbon-demo/my-service", String.class);}}
本案例仅仅作为展示,所以我就在这里调用自己了,实际情况这边会使用负载均衡,调用别的服务里边的方法,别学我,最好启动其他服务并配置好相关控制层,方便调用。
启动类:
@SpringBootApplication@EnableEurekaClientpublic class RibbonApplication {public static void main(String[] args) {SpringApplication.run(RibbonApplication.class);}}
直接启动就可以了。因为Ribbon是作为Spring Cloud Netflix的一部分,它会与Spring Boot应用程序一起自动启动。
前端访问:
localhost:2381/my-service
控制台输出日志如下:
2023-12-27 14:58:05.914INFO 30188 --- [nio-2381-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2023-12-27 14:58:05.914INFO 30188 --- [nio-2381-exec-1] o.s.web.servlet.DispatcherServlet: Initializing Servlet 'dispatcherServlet'2023-12-27 14:58:05.917INFO 30188 --- [nio-2381-exec-1] o.s.web.servlet.DispatcherServlet: Completed initialization in 3 ms2023-12-27 14:58:06.011INFO 30188 --- [nio-2381-exec-1] c.netflix.config.ChainedDynamicProperty: Flipping property: ribbon-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 21474836472023-12-27 14:58:06.026INFO 30188 --- [nio-2381-exec-1] c.n.u.concurrent.ShutdownEnabledTimer: Shutdown hook installed for: NFLoadBalancer-PingTimer-ribbon-demo2023-12-27 14:58:06.027INFO 30188 --- [nio-2381-exec-1] c.netflix.loadbalancer.BaseLoadBalancer: Client: ribbon-demo instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ribbon-demo,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null2023-12-27 14:58:06.030INFO 30188 --- [nio-2381-exec-1] c.n.l.DynamicServerListLoadBalancer: Using serverListUpdater PollingServerListUpdater2023-12-27 14:58:06.043INFO 30188 --- [nio-2381-exec-1] c.netflix.config.ChainedDynamicProperty: Flipping property: ribbon-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 21474836472023-12-27 14:58:06.044INFO 30188 --- [nio-2381-exec-1] c.n.l.DynamicServerListLoadBalancer: DynamicServerListLoadBalancer for client ribbon-demo initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ribbon-demo,current list of Servers=[本机名称:2381],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;Instance count:1;Active connections count: 0;Circuit breaker tripped count: 0;Active connections per server: 0.0;]},Server stats: [[Server:本机名称:2381;Zone:defaultZone;Total Requests:0;Successive connection failure:0;Total blackout seconds:0;Last connection made:Thu Jan 01 08:00:00 CST 1970;First connection made: Thu Jan 01 08:00:00 CST 1970;Active Connections:0;total failure count in last (1000) msecs:0;average resp time:0.0;90 percentile resp time:0.0;95 percentile resp time:0.0;min resp time:0.0;max resp time:0.0;stddev resp time:0.0]]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@6cbc0c752023-12-27 14:58:07.041INFO 30188 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty: Flipping property: ribbon-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 21474836472023-12-27 15:00:25.390INFO 30188 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver: Resolving eureka endpoints via configuration