1.什么是Ribbon
Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
1.3 常见负载均衡算法
随机,通过随机选择服务进行执行,一般这种方式使用较少;
轮训,负载均衡默认实现方式,请求来之后排队处理;
加权轮训,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;
地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。 ip hash
最小连接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。 最小活跃数
nacos-discovery依赖了ribbon,可以不用再引入ribbon依赖
Ribbon相关接口
参考: org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration
IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。
IRule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。
IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。
ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。
ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该策略能够优先过滤出与请求方处于同区域的服务实例。
ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力。
3.2 Ribbon负载均衡策略
1.RandomRule: 随机选择一个Server。
2.RetryRule: 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。
3.RoundRobinRule: 轮询选择, 轮询index,选择index对应位置的Server。
4.AvailabilityFilteringRule: 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
5.BestAvailableRule: 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。
6.WeightedResponseTimeRule: 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低。
7.ZoneAvoidanceRule: 默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下,类似于轮询(RandomRule)
8.NacosRule: 同集群优先调用
3.1.2 @LoadBalanced 注解原理
参考源码: LoadBalancerAutoConfiguration
@LoadBalanced利用@Qualifier作为restTemplates注入的筛选条件,筛选出具有负载均衡标识的RestTemplate。
被@LoadBalanced注解的restTemplate会被定制,添加LoadBalancerInterceptor拦截器。
Ribbon首先会拦截所有标注@LoadBalance注解的RestTemplate,然 后 将 Ribbon 默 认 的 拦 截 器 LoadBalancerInterceptor 添 加 到RestTemplate的执行逻辑中,这样每次执行RestTemplate时都会拦截HTTP请求。当有请求发生时,Ribbon默认会创建一个IloadBalancer实例。ILoadBalance在RibbonClientConfiguration中完成自动配置,它可以实现定制化的IRule、IPing、ServerList。当发生HTTP请求时,IloadBalancer在服务集群中选择一个服务,然后发送请求到后端服务
3.2.1 修改默认负载均衡策略
全局配置:调用其他微服务,一律使用指定的负载均衡算法