我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringCloud Netflix Ribbon源码解析(推荐)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringCloud Netflix Ribbon源码解析(推荐)

SpringCloud Netflix Ribbon源码解析

首先会介绍Ribbon 相关的配置和实例的初始化过程,然后讲解Ribbon 是如何与OpenFeign 集成的,接着讲解负载均衡器LoadBalancerCli ent , 最后依次讲解ILoadB alancer的实现和负载均衡策略Rule 的实现。

在这里插入图片描述

配置和实例初始化

@RibbonClient 注解可以声明Ribbon 客户端,设置Ribbon 客户端的名称和配置类,configuration 属性可以指定@Configuration 的配置类,进行Ribbon 相关的配置。@RibbonClient还会导入( import ) RibbonClientConfigurationRegistrar 类来动态注册Ribbon 相关的BeanDefinition。
RibbonClientConfigurationRegistrar 是ImportBeanDefinitionRegistrar 的实现类,ImportBeanDefinitionRegistrar 是Spring 动态注册BeanDefinition 的接口, 可以用来注册Ribbon 所需的BeanD的iition , 比如说Ribbon客户端实例( Ribbon Client ) lmportBeanDefinitionRegistrar的registerBeanDefinitions 方法可以注册Ribbon 客户端的配置类, 也就是@RibbonClient 的configuration 属性值

与OpenFeign 的集成

FeignCJientFactoryBean 是创造FeignClient 的工厂
类,在其getObject 方法中有一个分支判断,当请求URL 不为空时, 就会生成一个具有负载均衡的FeignClient 。在这个过程中, OpenFeign 就默认引入了Ribbon 的负载均衡实现.

在这里插入图片描述

LoadBalancerFeignClient#execute 方法会将普通的Request 对象转化为RibbonRequest , 并使用FeignLoadBalancer 实例来发送RibbonRequest。execute 方法会首先将Request 的URL转化为对应的服务名称,然后构造出RibbonRequest 对象,接着调用lbClient 方法来生成FeignLoadBalancer 实例,最后调用FeignLoadBalancer 实例的executeWithLoadBalancer 方法来处理网络请求。


//LoadBalancerFeignClient java
public Response execute(Reqest reqi且est, Request .Options options) throws 工OException {
try {
// :负载均衡时, host 就是需要调用的服务的名称
URI asurn= URI . create(request.url()) ;
String clientName = asur. getHost();
URI ur 工WithoutHost = cleanUrl(reqi且est . url(), cl 工entName) ;
//构造RibbonRequest,delegate 一般就是真正发送网络请求的客户端,比如说OkHttpClient
和ApacheClient
Fe 工gnLoadBalancer . R 工bbonRequest ribbonRequest = new FeignLoadBalancer .
RibbonRequest(
this . delegate , re 守uest , ur 工WithoutHost) ;
IClientConfig requestConfig = getClientConfig(options, clientName) ;
//executeWithLoadBalancer是进行负载均衡的关键
return lbClient(clientName) . executeWithLoadBalancer(ribbonRequest ,
requestConfig) . toResponse () ;
catch (ClientException e) {
IOException io = findIOException(e) ;
if ( io ! = null) {
throw io;
throw new RuntimeException(e) ;
private FeignLoadBalancer lbCl 工ent(Str 工ng cl 工entName) {
//调用CachingSpringLoadBalancerFactory 类的create方法。
return this . lbClientFactory . create(clientName) ;

lbClientFactory 的参数是CachingSpringLoadBalancerFactory 的实例, 它是带有缓存机制的FeignLoadBalancer 的工厂类。

create 方法的clientName 参数是指HTTP 请求对应的服务端名称, 它会首先使用这个名称去缓存中查找是否已经存在对应的实例。如果没有, 再根据系统是否支持请求重试来创建出不同的F eignLoadBalancer 实例, 最后将该实例存储到缓存中.

在这里插入图片描述

FeignLoadBalancer 是OpenFeign 在不需要重试机制的情况下默认的负载均衡实现。它的execute 方法的实现很简单,使用RibbonRequest 对象的客户端来发送网络请求,然后
将Response 包装成RibbonResponse 进行返回。RibbonRequest 的request 方法返回的对象就是构造RibbonRequest 对象时传入的delegate 参数。该参数是Client 接口的实例, Client接口是OpenFeign 真正发送网络请求的客户端, 比如说OkHttpClient 和ApacheClient 。FeignLoadBalancer 的execute 方法如下所示:


//Fe i gnLoadBalancer. ] ava
public RibbonResponse execute(RibbonRequest request , IClientConfig configOverride)
throws IOException {
Request.Options options ;
if (configOverride ! = null) {
RibbonPropert 工es override = RibbonPropertes . from(configOverride);
options = new Request.Options(
else {
override . connectTimeout(th 工s . connect Timeout),
override . readTimeout(this . readT 工meout));
options = new Request . Options(th 工s.connectTimeout, this readTimeout);
Response response = request . client() . execute(request . toReqest(), options) ;
return new RibbonResponse(request . getUri() , response) ;

FeignLoadBalancer 是AbstractLoadBalancerAwareC!ient 的子类,其executeWithLoadBalance方法会首先创建一个LoadBalancerCommand 实例,然后在该实例的submit 方法的回调中调用子类的execute方法

在这里插入图片描述

其中, buildLoadB a lan cerCommand 方法使用了LoadBalancerCommand.Builder 来创建LoadBalancerCornmand 实例,并将AbstractLoadBalancerAwareC!ient 作LoadBalancerContext接口的实例设置给LoadBalancerCommand 实例

LoadBalancerContext 的getServerFromLoadBalancer 方法调用了ILoadBalancer 的chooseServer方法,从而完成了负载均衡中服务器的选择。

负载均衡器LoadBalancerClient

LoadBalancerClient是Ribbon 项目的核心类之一,可以在RestTemplate 发送网络请求时替代RestTemplate 进行网络调用

LoadBalancerClient 接口继承了ServicelnstanceChooser 接口,其choose 方法可以从服务器列表中依据负载均衡策略选出一个服务器实例

RibbonLoadBalancerClient 是LoadBalancerClient 的实现类之一, 它的execute 方法会首先使用ILoadBa lancer 来选择服务器实例( Server ),然后将该服务器实例封装成RibbonServer 对象, 最后再调用LoadBalancerRequest 的apply 方法进行网络请求的处理。

ILoadBalancer

ILoadBalancer 是Ribbon 的关键类之二, 它是定义负载均衡操作过程的接口。Ribbon通过SpringClientFactory 工厂类的getLoadBalancer 方法可以获取ILoadBalancer 实例。根据Ribbon 的组件实例化机制, ILoadBalnacer 实例是在RibbonAutoConfiguration 中被创建生成的。

SpringClientFactory 中的实例都是RibbonClientConfiguration 或者自定义C onfiguration配置类创建的Bean 实例。RibbonClientConfiguration 还创建了Rule 、IPing 和S e rver List
等相关组件的实例。使用者可以通过自定义配置类给出上述几个组件的不同实例。

负载均衡策略实现

lRule 是定义Ribbon 负载均衡策略的接口,你可以通过实现该接口来自定义自己的负载均衡策略, Ribbon ClientConfiguration 配置类则会给出!Rule 的默认实例,Rule 接口的choose 方法就是从一堆服务器中根据一定规则选出一个服务器。Rule 有很多默认的实现类,这些实现类根据不同的算法和逻辑来进行负载均衡。

在这里插入图片描述

在大多数情况下, 这些默认的实现类是可以满足需求的,如果有特殊需求,可以自己实现。Ribbon 内置的Rule 子类如下所示。

  • BestAvailableRule :选择最小请求数的服务器。
  • ClientConfigEnabledRoundRobinRule :使用RandomRobinRule 随机选择一个服务器。
  • RoundRobinRul e :以RandonRobin 方法轮询选择服务器。
  • RetryRule : 在选定的负载均衡策略上添加重试机制。
  • WeightedResponseTimeRule :根据响应时间去计算一个权重( we ight ) ,响应时间越
  • 长,权重越低,权重越低的服务器,被选择的可能性就越低。
  • ZoneAvoidanceRule :根据服务器所属的服务区的整体运行状况来轮询选择。

到此这篇关于SpringCloud Netflix Ribbon源码解析(推荐)的文章就介绍到这了,更多相关SpringCloud Netflix Ribbon源码内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringCloud Netflix Ribbon源码解析(推荐)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringCloud负载均衡组件Ribbon源码分析

本文小编为大家详细介绍“SpringCloud负载均衡组件Ribbon源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud负载均衡组件Ribbon源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
2023-07-02

futuretask源码分析(推荐)

FutureTask只实现RunnableFuture接口: 该接口继承了java.lang.Runnable和Future接口,也就是继承了这两个接口的特性。 1.可以不必直接继承Thread来生成子类,只要实现run方法,且把实例传入到
2023-05-31

《Spring Boot源码解读与原理分析》书籍推荐

Spring Boot 1.0.0 早在2014年就已经发布,只不过到了提倡“降本增效”的今天,Spring Boot才引起了越来越多企业的关注。Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring F
2023-08-17

java使用websocket,并且获取HttpSession 源码分析(推荐)

一:本文使用范围此文不仅仅局限于spring boot,普通的spring工程,甚至是servlet工程,都是一样的,只不过配置一些监听器的方法不同而已。本文经过作者实践,确认完美运行。二:Spring boot使用websocket2.1
2023-05-31

SpringCloud@RefreshScope注解源码层面深入分析

@RefreshScope注解能帮助我们做局部的参数刷新,但侵入性较强,需要开发阶段提前预知可能的刷新点,并且该注解底层是依赖于cglib进行代理的,所以不要掉入cglib的坑,出现刷了也不更新情况
2023-05-15

nacos注册中心单节点ap架构源码解析(最新推荐)

这篇文章主要介绍了nacos注册中心单节点ap架构源码解析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-01-03

SpringBoot整合SpringSecurity过滤器链加载执行流程源码分析(最新推荐)

SpringBoot对于SpringSecurity提供了自动化配置方案,可以使用更少的配置来使用SpringSecurity,这篇文章主要介绍了SpringBoot整合SpringSecurity过滤器链加载执行流程源码分析,需要的朋友可以参考下
2023-02-23

Spring源码解析之推断构造方法的示例分析

小编给大家分享一下Spring源码解析之推断构造方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring推断构造方法贴个测试代码直接开干,这只是个
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录