教程仓库:github Spring-Cloud-Alibaba-Learning
教程索引页:index Spring-Cloud-Alibaba-Learning
源码地址
本篇内容的项目地址为:基于Java配置Ribbon
目标
- 以java代码配置Ribbon的方式,把service-a调用service-b时调用的负载均衡算法修改为RandomRule(随机选择节点)
前置知识
-
了解Ribbon提供的几种负载均衡算法
规则名称 特点 AvailabilityFilteringRule 过滤掉那些一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。 BestAvailableRule 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。 RandomRule 随机选择一个Server。 RetryRule 在选定的负载均衡策略subRule的基础上添加重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。 RoundRobinRule 轮询选择, 轮询index,选择index对应位置的Server。 WeightedResponseTimeRule 根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低。 ZoneAvoidanceRule 默认选用的规则。复合判断Server所在区域的性能和Server的可用性选择Server。在没有Zone的环境下,类似于RoundRobinRule。
流程
在本节中,只涉及对service-a编码的修改,不涉及对service-b的修改。
-
添加一个Ribbon配置类
@Configuration public class RibbonConfiguration { @Bean public IRule iRule(){ return new RandomRule(); } }
tips:请注意这里的包结构:
- src
- main
- java
- com.jyannis.servicea
- ServiceAApplicaiton
- ribbonconfig
- RibbonConfiguration
- com.jyannis.servicea
- java
- main
换句话说,Ribbon配置类不能和启动类在同一文件夹下。否则会导致整个service-a对任何服务的远程调用都会调用相同配置的Ribbon。而我们现在只是想设置对service-b的访问的负载均衡而已。
这是spring的一个小坑,对应的具体知识点是父子上下文的问题,有兴趣可以自行百度。
- src
-
添加针对service-b的Ribbon配置类
/** * @RibbonClient指定该配置类是为哪个服务服务的 */ @Configuration @RibbonClient(name = "service-b",configuration = RibbonConfiguration.class) public class ServiceBRibbonConfiguration { }
测试
-
启动Nacos
-
启动service-a
-
启动若干个service-b实例(设为不同端口即可)
-
多次调用service-a下的remote服务,查看不同service-b节点的控制台日志输出:
本例中我调用了十次remote服务,两个service-b节点的控制台日志分别如下:
2020-04-04 14:19:49.719 INFO 10364 --- [nio-8182-exec-1] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:19:50.560 INFO 10364 --- [nio-8182-exec-8] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:19:52.982 INFO 10364 --- [nio-8182-exec-7] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:20:09.395 INFO 10364 --- [io-8182-exec-10] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:20:09.820 INFO 10364 --- [nio-8182-exec-4] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:20:10.171 INFO 10364 --- [nio-8182-exec-5] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:20:10.735 INFO 10364 --- [nio-8182-exec-9] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a
2020-04-04 14:19:49.715 INFO 5160 --- [nio-8183-exec-1] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:19:51.820 INFO 5160 --- [nio-8183-exec-2] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a 2020-04-04 14:20:10.468 INFO 5160 --- [nio-8183-exec-4] com.jyannis.serviceb.TestController : 请求的uri是:/test/argue%20from%20service-a
其中端口为8182的节点接收了七次请求,端口为8183的节点接收了三次请求。说明我们成功替换了Ribbon的负载均衡算法,从默认的ZoneAvoidanceRule替换为了RandomRule。
补充
Ribbon配置类RibbonConfiguration除了放在与启动类不同的文件夹下外,也可以去除@Configuration注解后,与启动类放在同一个文件夹。详细可以参考service-a2。
上篇:Spring Cloud Alibaba教程——引入Ribbon
下篇: