开发者学堂课程【微服务框架 Spring Cloud 快速入门:Ribbon 核心组件 IRule】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/614/detail/9356
Ribbon核心组件IRule
目录:
一、上节总结
二、Ribbon 核心组件 IRule
一、上节总结
总结:Ribbon 其实就是一个软负载均衡的客户端组件,
他可以和其他所需请求的客户端结合使用,和 eureka 结合只是其中的一个实例
二、Ribbon 核心组件 IRule
lRule:根据特定算法中从服务列表中选取一个要访问的服务
其实就是 ribbon 的架构图:
Ribbon 在工作时分成两步
第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的 server.
第二步再根据用户指定的策略,在从 server 取到的服务注册列表中选择一个地其中 Ribbon 提供了多种策略:比如轮询、随机和根据响应时间加权。
这里提到 ribbon 提供了很多侧列其实就是 Ribbon 默认自带的七种算法:
1. RoundRobinRule 轮询
默认规则,复合判断 server 所在区域的性能和 server 的可用性选择服务器
因为 ribbon 主要负责 ribbon-loadbalancer 此时里面有 irule.java 此时说明 ribbon 的负载均衡算法自定义了一套策略:只要能实现她的接口就能定义自己的算法。lLoadBalapcer.java 这个接口里面的 service,可得到所有的服务列表。
public Service choose(ILoadBalancer lb,0bject key) 这个service
为了得到一个算法
int nextServerIndex = incrementAndGetModulo(serverCount);server = allServers.get(nextServerIndex);
这里有一个方法
List allServers =
l
b.getA11Servers();
得到有效的微服务
这里又得到server = al
l
Servers.get(nextServerIndex) ;
这里的源码体现了轮询。
2. RandomRule 随机
@Bean
public IRule(固定的接口) myRule()
{
//
return new RoundRobinRule()
;(此时还是轮询)
return new RandoTRule
(;//达到的目的,用我们重新选择的随机算法替代默认的轮询。
}
这里就是如果没有声明会默认使用轮询算法
(每启动一个微服务都要 run as)
3.AvailabilityFilteringRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,
还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
4. WeightedResponseTimeRul
根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。刚启动时如果统计信息不足,则使用 RoundRobinRule 策略,等统计信息足够,会切换到 WeightedResponseTimeRule
5. RetryRule
先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
如果故意让一个微服务故障,此时默认轮询,内部机制在一定时间内跳过这个故障的微服务并显示 error page。
@Bean
public IRule myRule()
{
Return new retryrule
}
6. BestAvailableRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
7.ZoneAvoidanceRule
默认规则,每合询断 server 所在区域的性能和 server 的可用性选择服务器
需要哪种算法只需要切换 return new+对应名称。