SpringCloud Ribbon 负载均衡策略 和 listOfServers 柔情只为你懂 2022-12-20 15:57 211阅读 0赞 ## 介绍 ## 画了一个示意图,整体表达一下 Feign 和 Ribbon 在微服务调用中的关系和角色。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhdG9vcA_size_16_color_FFFFFF_t_70_pic_center] * Ribbon 是一个客户端负载均衡器,它可以在客户端配置 ribbonServerList(服务端列表)或者直接从注册中心获取服务列表,然后根据负载均衡规则(目前系统提供了7种规则)以实现均衡负载。 * Feign 是一个使用起来比较方便的 HTTP 客戶端,它用起來就好像调用本地方法一样,默认基于 RestTemplate 进行 HTTP 接口调用。 对于 Ribbon 的负载均衡策略,系统默认提供了7种规则(如下),当然你也可以扩展自定义规则进行负载均衡,比如通过自定义规则来实现微服务的灰度发布。 <table> <thead> <tr> <th align="left">策略Java类名</th> <th align="left">规则名称</th> <th align="left">规则描述</th> </tr> </thead> <tbody> <tr> <td align="left">RandomRule</td> <td align="left">随机策略</td> <td align="left">随机选择server</td> </tr> <tr> <td align="left">RoundRobinRule</td> <td align="left">轮询策略</td> <td align="left">按照顺序选择server(ribbon默认策略)</td> </tr> <tr> <td align="left">RetryRule</td> <td align="left">重试策略</td> <td align="left">在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server</td> </tr> <tr> <td align="left">BestAvailableRule</td> <td align="left">最低并发策略</td> <td align="left">逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server</td> </tr> <tr> <td align="left">AvailabilityFilteringRule</td> <td align="left">可用过滤策略</td> <td align="left">过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)</td> </tr> <tr> <td align="left">WeightedResponseTimeRule</td> <td align="left">响应时间加权重策略</td> <td align="left">根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间</td> </tr> <tr> <td align="left">ZoneAvoidanceRule</td> <td align="left">区域权重策略</td> <td align="left">综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server</td> </tr> </tbody> </table> 这些所有类都继承自抽象类 `AbstractLoadBalancerRule` 进而实现了顶层接口 `IRule` 和 `IClientConfigAware`。 **下面是类关系图:** ![类关系图][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhdG9vcA_size_16_color_FFFFFF_t_70_pic_center 1] ## 配置 ## 如上,了解清楚 Ribbon 的角色以及它支持的策略规则后,下面来看一下如何选择配置规则。 * 可以选择使用自带的策略进行配置 * 可以自定义实现自己的策略规则 * 可以进行全局配置或者针对访问某一个服务单独设置策略 > * 以下配置以微服务 `shanhy-svc1` 通过 feign+ribbon 调用微服务 `shanhy-svc2` 为例,所以配置中会出现 `shanhy-svc2` 这样的名称,`shanhy-svc2` 为该服务配置文件中 `spring.application.name` 的值。 > * Ribbon 客户端配置涉及的相关类:`@RibbonClient` 注解、默认配置类 `RibbonClientConfiguration`。 ### 全局配置 ### @Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule() { // 这里实例化你需要的全局负载均衡策略,可以是内置的7分之一,也可以是你自定义的 // 除此之外,你也可以在这个配置类中自定义IPing和ServerList return new RandomRule(); } } ### 指定服务配置 ### # 针对服务使用不同的负载均衡策略(shanhy-service-hello 和 shanhy-service-world 是2个服务名称 # 建议和服务自身的 spring.application.name 对应) shanhy-service-hello.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.BestAvailableRule shanhy-service-world.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RetryRule ### 自定义策略 ### 按照上面的类关系图,继承你需要扩展的类,并实现你需要重写的方法即可。 然后参照如上两点,使用全局配置或者指定具体的服务进行配置上即可。 ### 自定义负载均衡服务器列表 ### ribbon 默认从注册中心读取需要进行 feign 调用的服务器列表,有的时候我们想使用 ribbon 和 feign 进行基于声明式接口的 api 调用,但是调用的目标又不在注册中心里,我们可以通过手工设定服务清单的方式来实现,如下: # 服务名称为 myservice # 对于这个服务,需要先禁用从 eureka 中读取服务列表 myservice.ribbon.eureka.enabled=false # 为这个服务配置服务清单,可以是一个或N个 myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001 -------------------- (END) [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhdG9vcA_size_16_color_FFFFFF_t_70_pic_center]: /images/20221120/3fa576138bf24883b76f9329a5b89d6d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhdG9vcA_size_16_color_FFFFFF_t_70_pic_center 1]: /images/20221120/eec81fa73bad4affb7d8e21c7bfdd9ea.png
还没有评论,来说两句吧...