负载均衡Ribbon源码追踪——RibbonLoadBalancerClient代替restTemplate执行execute方法

RibbonLoadBalancerClient初始化

1、先看下两个自动配置类
在这里插入图片描述
在这里插入图片描述

  • 其中RibbonAutoConfiguration配置类创建了SpringclientFactory和LoadBanlancerClient即RibbonLoadBalancerClient

注意:SpringClientFactory设置了configurations,这个configurations是配置类属性,且含有注解@Autowired,作用是加载RibbonClientSpecification类型的对象这个类型的对象和@RibbonClients注解相关,此注解在注册定义信息时更改了name
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

故在对factory设置congfigurations时数据如下
在这里插入图片描述

在这里插入图片描述
SpringClientFactory的setConfigurations方法其实调用的是父类的方法(NamedContextFactory)
在这里插入图片描述

  • LoadBalancerAutoConfiguration配置类中创建了SmartInitializingSingleton和RestTemplateCustomizer以及LoadBalancerInterceptor

在这里插入图片描述

在这里插入图片描述
对于spring中的SmartInitializingSingleton类型的对象创建后会调用其afterSingletonsInstantiated方法

restTemplates集合是根据 @LoadBalanced注解在spring容器中获取的,注解信息如下
在这里插入图片描述
在这里插入图片描述

至此,会将spring环境中的RestTemplate(含@LoadBalanced注解的)设置拦截器LoadBalancerInterceptor完成

LoadBalancerInterceptor的实例化

在这里插入图片描述
拦截器构造方法中的loadBalancer和requestFactory分别为上面自动配置类提供的
RibbonLoadBalancerClient和SpringClientFactory

使用RestTemplate调用服务时会调用拦截器的intercept方法,如上图,拦截方法中会调用loadBalancer的execute方法

RibbonLoadBalancerClient的execute方法

主图1
在这里插入图片描述

1、getLoadBalancer

在这里插入图片描述
调用了clientFactory的getLoadBalancer方法
在这里插入图片描述
进入父类方法(NamedContextFactory)
在这里插入图片描述

2、根据服务名称获取context,并将服务名称和context建立映射关系

在这里插入图片描述

会将RibbonEurekaAutoConfiguration中的configurations取出来进行注册到当前context,同时也会将defaultConfigType类型Class进行注册,defaultConfigType是在创建对象时传过来的(RibbonClientConfiguration)
在这里插入图片描述
下图表示两类注册过程
在这里插入图片描述
在这里插入图片描述
同时还会给这个context的环境变量赋值(propertyName是在创建对象是传过来的默认的ribbon.client.name),即查询服务的name
在这里插入图片描述

3、RibbonClientConfiguration配置类

在这里插入图片描述
name属性是和context相关的,每次都会创建新的context,且对应新的RibbonClientConfiguration配置类,以及新的环境变量${ribbon.client.name} ----查询的服务id(服务名称)
在这里插入图片描述
创建了ILoadBalancer对象(ZoneAwareLoadBalancer)即上面标题1中getLoadBalancer需要的对象类型,如下图,继续回到SpringClientFactory的getInstance方法

在这里插入图片描述
继续返回到RibbonLoadBalancerClient的execute方法(见上面主图1)
在这里插入图片描述

4、getServer(见上面主图1)

根据loadBalancer获取服务对象,进入代码
在这里插入图片描述

调用loadBalancer的chooseServer方法

进入ZoneAwareLoadBalancer对象的chooseServer方法

在这里插入图片描述
会判断可用服务数量,如果只有一个则直接调用父类chooseServer方法
在这里插入图片描述

此时的规则rule是默认的Round在这里插入图片描述
从loadBalance中选择一个服务,并返回
在这里插入图片描述

总结:RibbonLoadBalancerClient代替restTemplate执行execute方法的大致流程基本上是这样,写的可能有点乱,慢慢跟着代码基本都能看懂大致流程(注意:注册中心的服务信息是在创建loadBalance时加载的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值