Spring Cloud_Ribbon
2021-06-09 本文已影响0人
山巅自相见
ribbon是什么?
- spring cloud ribbon是基于NetflixRibbon实现的一套客户端负载均衡的工具
- 简单地说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项,如:连接超时、重试等等。简单地说,就是在配置文件中列出LoadBalancer(简称LB:负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法!
ribbon能干嘛?
- LB,即负载均衡,在微服务或分布式集群中经常用的一种应用。
- 负载均衡简单地说就是将用户的请求平摊的分配到多个服务器上,从而达到系统的HA(高可用)。
- 常见的负载均衡软件有Nginx、Lvs等等
- dubbo、SpringCloud中均给我们提供了负载均衡,Spring Cloud的负载均衡算法可以自定义
- 负载均衡简单分类:
- 集中式LB
- 即在服务的消费方和提供方之间使用独立的LB设施,如Nginx:反向代理服务器,由该设施负责把访问请求通过某种策略转发至服务的提供方!
- 进程式LB
- 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器
-
Ribbon就属于进程内LB,他只是一个类库,集成与消费方进程,消费方通过它来获取到服务提供方的地址!
衔接上文
-
Ribbon就属于进程内LB,他只是一个类库,集成与消费方进程,消费方通过它来获取到服务提供方的地址!
使用Ribbon实现负载均衡
继续创建两个数据库:db02、db03,并创建表和填入数据。创建两个提供者服务:8002、8003。服务里的配置或其他代码和8001配置一样。
开启服务后,访问其中一个发现
图片.png
多了两个服务,三个服务全部都在上面展示。
启动消费者服务并访问
刷新一下
刷新一下
每刷新一下就换一个提供者,这就展示了负载均衡的简单轮询
自定义负载均衡算法
Ribbon核心组件IRule,会根据特定的算法中从服务列表中选取一个要访问的服务,SpringBoot自带七种算法:
- RoundRobinRule
轮询,依次执行(默认) - RandomRule
1.1 随机执行
在消费者的配置类中加入新的Bean覆盖默认轮询
@Configuration // spring applicationContext.xml
public class ConfigBean {
// 配置负载均衡实现RestTemplate
@Bean
@LoadBalanced // Ribbon
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
/* IRule
* RoundRobinRule 轮询
* RandomRule 随机
* AvailabilityFilteringRule 会先过滤掉跳闸、访问故障的服务,对剩下的服务进行轮询
* RetryRule 会先按照轮询获取服务,如果服务获取失败,则会在指定的时间内进行重试*/
@Bean
public IRule myIRule() {
return new RandomRule();
}
}
1.2 测试:
依次启动:Eureka注册中心(7001、7001、7001)-三个或以上提供者服务(8001、8002、8003)-消费者服务(80)
访问:http://localhost/consumer/dept/list
每次刷新都是随机的提供者提供的数据
- AvailabilityFilteringRule
3.1 会先过滤掉多次访问故障而处于断路器跳闸状态的服务
3.2 和过滤并发的连接数量超过阈值的服务,然后对剩余的服务列表安装轮询策略进行访问 - WeightedResponseTimeRule
4.1 根据平均响应时间计算所有的服务权重,响应时间越快服务权重越大,容易被选中的概率就越高
4.2 刚启动时,如果统计信息不中,则使用RoundRobinRule(轮询)策略,等统计的信息足够了会自动切换到WeightedResponseTimeRule - RetryRule
5.1 先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败,则在指定的时间会进行重试,进行获取可用的服务
5.2 如多次获取某个服务失败,这不会再再次获取该服务(如:高德地图上某条道路堵车,司机不会走那条道路) - BestAvailableRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 - ZoneAvoidanceRule
默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器