• Spring Cloud alibaba Ribbon 负载调用说明(4)


    回顾

    前面已经集成了 nacos 作为注册中心的使用,并且也采用了使用 Ribbon 与 Feign 实现负载均衡的调用。这里就对 “负载均衡” 简单的说明下。

    什么是负载均衡

    于现在的公司项目来说,即使没有采用 微服务框架,也应该才用了 Nginx 作为反向代理来进行负载均衡。应该来说对于现在的软件服务来说,负载均衡是必不可少的。

    在分布式系统中,当访问的服务具有多个节点时,需要根据某种“均衡”的策略,将请求发送到具体的节点上面去。这个就是负载均衡。

    目的是将数据流量分摊到多个服务器执⾏,减轻每台服务器的压⼒,从⽽提⾼了数据的吞吐量。

    常见的负载均衡策略

    • 节点轮询:每个请求按顺序分配到不同的后端服务器
    • weight 权重配置: weight和访问⽐率成正⽐,数字越⼤,分配得到的流量越⾼
    • 固定分发:根据请求按访问ip的hash结果分配,这样每个⽤户就可以固定访问⼀个后端服务器
    • 随机选择、最短响应时间等

    负载调用源码分析

    我们通过源码来看下对应的逻辑,大致的流程是这样子的:

    • 第一步: 先从注册中心获取 provider 的列表
    • 第二步:通过一定的策略获取其中的的一个节点
    • 第三步:返回给 restTemplate 调用

    首先,我们看下 @LoadBalanced 注解源码:
    LoadbBalanced 注解源码
    通过代码注释说明可以看到

    注解标记一个 RestTemplate 或者 WebClient 对象被配置来使用 LoadBalancerClient。

    我们去找下 LoadBalancerClient

    public interface LoadBalancerClient extends ServiceInstanceChooser {
    	<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
    
    	<T> T execute(String serviceId, ServiceInstance serviceInstance,
    			LoadBalancerRequest<T> request) throws IOException;
    
    	URI reconstructURI(ServiceInstance instance, URI original);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    发现 LoadBalancerClient 是一个接口,并且继承于 ServiceInstanceChooser ,那我们看下 ServiceInstanceChooser 对应的源码:

    /**
     * Implemented by classes which use a load balancer to choose a server to send a request
     * to.
     *
     * @author Ryan Baxter
     */
    public interface ServiceInstanceChooser {
    
    	/**
    	 * Chooses a ServiceInstance from the LoadBalancer for the specified service.
    	 * @param serviceId The service ID to look up the LoadBalancer.
    	 * @return A ServiceInstance that matches the serviceId.
    	 */
    	ServiceInstance choose(String serviceId);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    通过源码注释会发现,choose() 方法会找一个对应的负载实例。 我们再看下对应的 LoadBalancerClient 的实现类,会发现只有一个实现类 RibbonLoadBalancerClient:
    RibbonLoadBalancerClient
    通过断点,我们会发现这个 ILoadBalancer 就是返回我们注册的服务列表:
    服务列表
    进一步跟踪
    选择规则
    这里可以看到默认的 rule 对象为 RoundRobinRule
    默认的 Rule 对象
    这里可以看到返回的服务地址
    返回服务地址
    当我们继续向下调试,最后会发现还是在 RestTemplate 里面进行的 http 调用
    继续向下调试

    Ribbon 负载均衡策略

    通过源码来看 IRule 相关的策略
    所有的策略类型

    Ribbon⽀持的负载均衡策略介绍

    策略类类型说明
    RandomRule随机策略随机选择server
    RoundRobinRule轮询策略按照顺序选择server(默认)
    RetryRule重试策略当选择server不成功,短期内尝试选择⼀个可⽤的
    AvailabilityFilteringRule可⽤过滤策略过滤掉⼀直失败并被标记为circuit tripped的server,过滤掉那些⾼并发链接的server(activeconnections超过配置的阈值)
    WeightedResponseTimeRule响应时间加权重策略根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越⼤,综合了各种因素,⽐如:⽹络,磁盘,io等,都直接影响响应时间
    ZoneAvoidanceRule区域权重策略综合判断server所在区域的性能,和server的可⽤性,轮询选择server

    实战:在项目上面配置策略

    在这里,我们需要区分,配置的位置是在哪边?
    服务调用
    从上面可以看到,我们是从 Order 服务调用到 Video 服务,所以我们的配置需要配置在 Order 这边。

    在 order 模块下的 application.yml 中增加:

    # 修改轮询策略
    demo-video:
      ribbon:
        # 这个是连接超时时间
        ConnectTimeout: 1000
        # 这个是服务处理请求超时时间
        ReadTimeout: 5000
        # 对所有的操作进行重试工作
        OkToRetryOnAllOperations: true
        # 当超时的时候,最大重试次数,这里是设置了3次,不包含第一次请求那次 ,这个请求重试是在超时服务上试
        MaxAutoRetries: 2
        # 如果在调用当前服务重试次数没了,就换个服务
        MaxAutoRetriesNextServer: 1
        #负载均衡策略
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    order application.yml
    最后,进行访问测试。

  • 相关阅读:
    【Linux】之如何卸载干净zabbix服务?(超详细)
    《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》全文翻译
    蓝桥杯双周赛算法心得——铺地板(质因数)
    集合和泛型
    计算机毕业设计之java+javaweb的大学运动场地管理系统
    聊一聊小程序单聊页面构思
    软考高级系统架构设计师系列之:案例分析典型试题四
    函数入门及C Primer Plus第五章编程题
    RISCV学习笔记7.12(开源虚拟机篇)--AlmaLinux虚拟机安装Questasim软件
    什么是RPC框架?
  • 原文地址:https://blog.csdn.net/qq_18948359/article/details/126241202