首页 > 其他分享 >Ribbon工作原理

Ribbon工作原理

时间:2022-12-14 14:48:06浏览次数:42  
标签:负载 服务 RestTemplate 工作 源码 均衡 原理 Ribbon

之前我们在使用RestTemplate进行服务交互的时候,在其注入的bean上添加了@LoadBalanced注解,这样它就默认是使用Ribbon进行负载均衡处理。

 

但是RestTemplate是Spring提供的,Bean跟Ribbon客户端负载均衡又有什么关系呢?

下面我们就来深入地研究Ribbon是如何结合RestTemplate实现客户端服务调用的负载均衡的。

既然RestTemplate是使用了@LoadBalanced注解才让其实现Ribbon的负载均衡的,那么我们就从这个注解开始着手研究。

按住“Ctrl”键并单击@LoadBalanced注解查看源码,我们发现这个注解里面没有什么特殊的内容,但是从源码的注释可以知道该注解是标记在RestTemplateWebClient Bean上的,从而配置为LoadBalancerClient。

 

 

 接着观察LoadBalancerClient的源码,可以发现它是一个定义了负载均衡方法的接口,如程序清单12-2所示。

除了上面源码中定义负载均衡的几种方法外,LoadBalancerClient还继承了ServiceInstance- Chooser接口中的chooser方法,如程序清单12-3所示。

 

 通过查看这几个功能方法的注释可以得知,choose方法是通过serviceId(服务ID)从负载均衡器中挑选出对应的服务实例的;

execute方法是使用从负载均衡器中挑选出来的服务来处理请求的;

reconstructURI方法表示为服务实例创建一个host:port的URI实例。

 

 从上图中可以看到,RibbonLoadBalancerClient是LoadBalancerClient的实现类,单击查看它的源码可知它是执行客户端负载均衡处理功能的子类。

 

RibbonLoadBalancerClient重写的choose功能方法中,内部通过getServer方法根据serviceId获取到服务,而从getServer方法中可以发现其是通过ILoadBalancer接口来实现的,如程序清单12-4所示。

 

 

ILoadBalancer是一个接口,所以它只定义了实现负载均衡的方法,如程序清单12-5所示。

 

 

 ILoadBalancer接口的实现类是AbstractLoadBalancer,但是它是一个抽象类,所以服务的获取、选择以及添加等操作主要在其子类BaseLoadBalancer和DynamicServerListLoadBalancer中实现。

 

ILoadBalancer接口的实现类是AbstractLoadBalancer,但是它是一个抽象类,所以服务的获取、选择以及添加等操作主要在其子类BaseLoadBalancer和DynamicServerListLoadBalancer中实现。这两个子类中还定义了负载均衡的客户端配置IClientConfig、获取服务的负载均衡策略IRule、通过IPing接口进行ping测试来判断服务是否可用以及从Eureka服务列表中获取服务列表Server集合对象等,这里就不再列出其源码。

 

通过上面的描述,我们知道负载均衡进行服务的添加、服务的获取、服务的选择等操作主要是通过LoadBalancerClient的子类RibbonLoadBalancerClient实现的,那么为什么我们在RestTemplate注入的Bean上添加@LoadBalanced注解就可以加载RibbonLoadBalancerClient进行负载均衡呢?这是因为Ribbon有一个自动配置类RibbonAutoConfiguration,而RibbonAutoConfiguration加载前会加载LoadBalancerAutoConfiguration配置类,在LoadBalancer- AutoConfiguration中有一个被@LoadBalanced修饰的RestTemplate集合,在进行初始化的时候使用RestTemplateCustomizer给每一个RestTemplate都添加了LoadBalancerInterceptor拦截器。

 

LoadBalancerAutoConfiguration部分源码如程序清单12-6所示。

 

LoadBalancerInterceptor 拦截器(其源码如程序清单12-7所示)负责拦截请求,并把请求交给LoadBalancerClient负载均衡类处理,因此RestTemplate就实现了负载均衡的功能。

标签:负载,服务,RestTemplate,工作,源码,均衡,原理,Ribbon
From: https://www.cnblogs.com/cnetsa/p/16982091.html

相关文章

  • Ribbon介绍和使用
    Ribbon是Netflix公司提供的一个在SpringCloud中免费使用的客户端负载均衡器组件。它在集群中为各个客户端之间的通信提供支持,可以控制、管理HTTP和TCP客户端的负载均衡。......
  • DNS服务器原理及搭建
    一、什么是域名、域名是什么从技术角度来说就是IP地址映射。域名(英语:DomainName),又称网域。是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于......
  • 图文并茂说明raid0,raid1, raid10, raid01, raid5等原理。
    RAID0  不具有防止数据丢失的功能,主要是能够并行存储,数据存储方式如下图:  RAID1  具有数据冗余的能力,能够一定保证其中一块硬盘坏掉,数据不会丢失,如果两块......
  • 【Python内置函数map和zip+上下文管理器及其实现原理】
    一、map作用map:自动将可迭代对象遍历,把遍历出来的数据,当成参数传入map第一个接口的函数中,将函数执行的结果,放到一个迭代器中进行返回语法map(function,iterable,...)第......
  • FTP服务器原理和搭建
    一、FTP服务FTP服务器默认使用TCP协议的20、21端口与客户端进行通信20端口用于建立数据连接,并传输文件数据21端口用于建立控制连接,并传输FTP控制命令 主动模式:服务......
  • 编译原理LR分析
    LR(0)分析存在问题及解决办法当LR(0)含有互相冲突的项目时,则需要向前展望符号串,检查下一个输入符号的状态例项目集I={X→α·bβ,A→α·,B→α·}当面临输入符号b......
  • Raw NAND FLASH原理及ONFI接口标准【转】
    转自:https://blog.csdn.net/ScilogyHunter/article/details/105995767一、NANDFlash类型1.1NANDFlash的两大分类NANDFlash是嵌入式世界里常见的存储器,对于嵌入式开发......
  • 【深入浅出SpringCloud原理及实战】「SpringCloud-Alibaba系列」微服务模式搭建系统基
    SpringCloudAlibabaNacosDiscoverySpringBoot应用程序在服务注册与发现方面提供和Nacos的无缝集成。通过一些简单的注解,您可以快速来注册一个服务,并使用经过双十......
  • 编译原理导论
    1.1什么是编译程序编译程序的必要性:计算机只能识别机器语言,但是编程语言有很多编译程序概念:最初定义:高级语言——>汇编语言或机器语言程序设计语言源程序的两种......
  • 写过vue自定义指令吗,原理是什么?.m
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......