Spring Cloud Alibaba教程——基于Java配置Ribbon

教程仓库:github Spring-Cloud-Alibaba-Learning


教程索引页:index Spring-Cloud-Alibaba-Learning



源码地址

本篇内容的项目地址为:基于Java配置Ribbon

目标

  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的一个小坑,对应的具体知识点是父子上下文的问题,有兴趣可以自行百度。

  2. 添加针对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

补充

Ribbon配置类RibbonConfiguration除了放在与启动类不同的文件夹下外,也可以去除@Configuration注解后,与启动类放在同一个文件夹。详细可以参考service-a2



上篇:Spring Cloud Alibaba教程——引入Ribbon
下篇:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。 主要功能服务限流降级:默认支持 WebServlet、 WebFlux, OpenFeign、 RestTemplate、 Spring CloudGateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。分布式配置管理:支持分布式系统中的外部化配置配置更改时自动刷新。消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有Worker(schedulerx-client)上执行。阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值