HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
  • 《k8s学习心得》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
  • 《k8s学习心得》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

      • Java基础

      • JVM

      • 牛客网题库

      • MySQL

      • Linux

      • 计算机网络

      • 操作系统

      • Java框架

        • Hibernate面试题
        • Mybatis面试题
        • Redis面试题
        • Servlet的生命周期
        • Spring

        • SpringBoot

        • SpringCloud

          • Ribbon的负载均衡策略有哪些?
          • SpringCloud面试题
        • Spring拦截器和过滤器有什么区别?
        • Struts面试题
    • 【中级】12k-26k档

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【初级】6~12k档
  • Java框架
  • SpringCloud
#Ribbon
HaC
2022-06-02
目录

Ribbon的负载均衡策略有哪些?

# 1、Ribbon的负载均衡策略有哪些?

com.netflix.loadbalancer.RandomRule #配置规则 随机 com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询 com.netflix.loadbalancer.RetryRule #配置规则 重试 com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重 com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略

Ribbon默认是 RandomRule 随机 轮询策略。

而Feign @FeignClient注解的时候 是默认使用了Ribbon进行客户端的负载均衡的,默认的是RoundRobinRule 轮询的策略

//使用FeignClient 告知发布方的应用名称 默认使用ribbon进行负载均衡
@FeignClient(name="stu-provide")
public interface TestFeign {
    @RequestMapping(value = "/getAll/{id}",method = RequestMethod.GET)
    public Student getAll(@PathVariable("id") Integer id);
}

# 2、Ribbon的实现原理是什么?

ribbon实现的关键点是为ribbon定制的RestTemplate,ribbon利用了RestTemplate的拦截器机制,在拦截器中实现ribbon的负载均衡。负载均衡的基本实现就是利用applicationName从服务注册中心获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行http调用。

Ribbon的RestTemplate

RestTemplate中有一个属性是List<ClientHttpRequestInterceptor> interceptors,如果interceptors里面的拦截器数据不为空,在RestTemplate进行http请求时,这个请求就会被拦截器拦截进行,拦截器实现接口ClientHttpRequestInterceptor,需要实现方法是

ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
      throws IOException;

也就是说拦截器需要完成http请求,并封装一个标准的response返回。

# 3、Ribbon几种负载均衡策略的原理是什么?

# 3.1、RandomRule

随机负载规则很简单,随机整数选择服务,最终达到随机负载均衡。

# 3.2、RoundRobinRule

线性轮询负载均衡策略。在类中维护了一个原子性的nextServerCyclicCounter成员变量作为当前服务的索引号,每次在所有服务数量的限制下,就是将服务的索引号加1,到达服务数量限制时再从头开始。

其实就是一个求余的过程。

# 3.3、WeightedResponseTimeRule

响应时间作为选取权重的负载均衡策略。

其含义就是,响应时间越短的服务被选中的可能性大。

假设有4个服务,每个服务的响应时间(ms):

A: 200

B: 500

C: 30

D: 1200

总响应时间:

200+500+30+1200=1930ms

接下来第二个for循环,计算每个服务的权重。

服务的权重=总响应时间-服务自身的响应时间:

A: 1930-200=1730

B: 1930-500=1430

C: 1930-30=1900

D: 1930-1200=730

总权重:

1730+1430+1900+730=5790

响应时间及权重计算结果示意图:

结果就是响应时间越短的服务,它的权重就越大。

再看一下choose方法。

重点在while循环的第3个if这里。

首先如果判定没有服务或者权重还没计算出来时,会采用父类RoundRobinRule以线性轮询的方式选择服务器。

有服务,有权重计算结果后,就是以总权重值为限制,拿到一个随机数,然后看随机数落到哪个区间,就选择对应的服务。

所以选取服务的结论就是:

响应时间越短的服务,它的权重就越大,被选中的可能性就越大。

参考:https://www.cnblogs.com/kongxianghai/p/8477781.html

#Ribbon
上次更新: 2026-06-21 17:47:53
最近更新
01
MySQL支持的锁有哪些
06-21
02
HTTP 是不保存状态的协议, 如何保存用户状态
06-21
03
WebSocket、短轮询、长轮询的区别
06-21
更多文章>
Theme by Vdoing | Copyright © 2020-2026 HaC
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式