文章目录

  • 源码地址
  • 目标
  • 前置知识
  • 流程
  • 测试
  • 补充




 

目标

  1. java代码配置Ribbon的方式,把service-a调用service-b时调用的负载均衡算法修改为RandomRule(随机选择节点)

前置知识

  1. 了解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的修改。

  1. 添加一个Ribbon配置类
@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule iRule(){
        return new RandomRule();
    }

}

tips:请注意这里的包结构:

  • src
  • main
  • java
  • com.jyannis.servicea
  • ServiceAApplicaiton
  • ribbonconfig
  • RibbonConfiguration

换句话说,Ribbon配置类不能和启动类在同一文件夹下。否则会导致整个service-a对任何服务的远程调用都会调用相同配置的Ribbon。而我们现在只是想设置对service-b的访问的负载均衡而已。

这是spring的一个小坑,对应的具体知识点是父子上下文的问题,有兴趣可以自行百度。

  1. 添加针对service-bRibbon配置类
/**
 * @RibbonClient指定该配置类是为哪个服务服务的
 */
@Configuration
@RibbonClient(name = "service-b",configuration = RibbonConfiguration.class)
public class ServiceBRibbonConfiguration {
}

测试

  1. 启动Nacos
  2. 启动service-a
  3. 启动若干个service-b实例(设为不同端口即可)
  4. 多次调用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