1.4 Ribbon负载均衡原理

一、负载均衡原理

  1. 负载均衡流程

    1. 发起请求

    2. LoadBalancerInterceptor负载均衡拦截器,得到请求服务地址

    3. 将地址交给RibbonLoadBanlancerClient

    4. 获取url中的服务id,交给DynamicServerListLoadBalance

    5. 从注册中心中拉取对应服务列表

    6. 将列表中的内容交给IRule,进行负载均衡计算,选定最终服务

    7. 将最选择的服务交给RibbonLoadBanlancerClient,替换原请求,得到真实请求地址

    8. 发送请求,结束

二、负载均衡策略(IRule)

  1. 负载均衡策略

    1. Ribbon的负载均衡规则是一个叫IRule的接口来定义的,每一个字借口都是一种规则

    2. 规则继承关系图

       IRule-接口
         |-AbstractLoadBalancerRule
         |  |-RetryRule-重试机制的选择逻辑
         |  |-ClientConfigEnableRoundRobinRule-轮询方案
         |  |  |-BestAvailablerule-忽略短路的服务器,并选择并发数比较低的服务器
         |  |  |-PredicateBasedRule
         |  |  |  |-AvailabilityFilteringRule-对短路与并发高的服务器进行忽略,然后轮询
         |  |  |  |-ZoneAvoidanceRule-次区域可用的服务器为基础进行服务器的选择
         |  |-RoundRobinRule-简单轮询服务列表来选择
         |  |  |-WeightedResponseTimeRule-为每一个服务器赋予权重
         |  |-RandomRule-随机选择一个可用的服务器
    3. 如何调整负载均衡规则

      1. 代码方式:

         @Bean
         public IRule randomRule() {
             return new RandomRule(); // 这里只是举个例子,RandomRule可以为上面的任意一个方式
         }

        备注:此方法修改后,对任意请求均生效

      2. yml配置的方式

         user-server:
             ribbon:
                 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

        备注:此方法只针对某个微服务生效,上面的表示对user-server服务修改生效

三、饥饿加载

  1. Ribbon默认采用蓝加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长,而饥饿加载则会在项目启动时候创建,降低第一次访问的耗时,通过下面的配置开启饥饿加载

     ribbon:
         eager-load:
             enable: true # 开启饥饿加载服务
             clients: 
                 - user-server # 指定对某个服务进行饥饿加载

最后更新于

这有帮助吗?