Ribbon核心源码剖析

Ribbon工作原理

重点:Ribbon给restTemplate添加了一个拦截器 

 思考:Ribbon在做什么:

        当我们访问http://lagou-service-resume/resume/openstate/的时候,ribbon应该根据服务名lagou-service-resume获取到该服务的实例列表并按照一定的负载均衡策略从实例列表中获取⼀个实例Server,并最终通过RestTemplate进行请求访问。

Ribbon细节结构图(涉及到底层的⼀些组件/类的描述)

  • 获取服务实例列表
  • 从列表中选择⼀个server

        图中核心是负载均衡管理器LoadBalancer(总的协调者,相当于大脑,为了做事情,协调四肢),围绕它周围的多有IRule、IPing等 

  • IRule:是在选择实例的时候的负载均衡策略对象
  • IPing:是用来向服务发起心跳检测的,通过心跳检测来判断该服务是否可用
  • ServerListFilter:根据一些规则过滤传入的服务实例列表
  • ServerListUpdater:定义了一系列的对服务列表的更新操作

1、@LoadBalanced源码剖析

        我们在RestTemplate实例上添加了一个@LoadBalanced注解,就可以实现负载均衡,很神奇,我们接下来分析这个注解背后的操作(负载均衡过程)

(1)查看@LoadBalanced注解,那这个注解是在哪里被识别到的呢?

(2)LoadBalancerClient类(实现类RibbonLoadBalancerClient,待用) 

public interface LoadBalancerClient extends ServiceInstanceChooser
{
    // 根据服务执⾏请求内容
    <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException;
    // 根据服务执⾏请求内容
    <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
    // 拼接请求⽅式 传统中是ip:port 现在是服务名称:port 形式
    URI reconstructURI(ServiceInstance instance, URI original);
}

(3)老规矩:SpringCloud充分利用了SpringBoot的自动装配特点,找spring.factories配置文件

2、研究LoadBalancerAutoConfiguration 

LoadBalancerAutoConfiguration里面的内容剖析 

第一处:注入resttemplate对象到集合待用

第二处:注入resttemplate定制器 

第三处:使用定制器给集合中的每一个resttemplate对象添加一个拦截器 

到这里,我们明白,添加了注解的RestTemplate对象会被添加一个拦截器LoadBalancerInterceptor,该拦截器就是后续拦截请求进行负载处理的。

所以,下一步重点我们该分析拦截器LoadBalancerInterceptor------>>>intercept()方法

分析LoadBalancerInterceptor.intercept()方法

        那么?RibbonLoadBalancerClient对象是在哪⾥注⼊的===》》回到最初的自动配置类RibbonAutoConfiguration中 

 OMG! 负载均衡的事情执行原来交给了我们最初看到的RibbonLoadBalancerClient对象 

非常核心的一个方法:RibbonLoadBalancerClient.execute()

回到主配置类RibbonAutoConfiguration 

RibbonClientConfiguration中装配了大脑和肢干

ZoneAwareLoadBalancer#chooseServer 

父类:com.netflix.loadbalancer.BaseLoadBalancer#chooseServer 

来到区域隔离策略的父类choose方法中com.netflix.loadbalancer.PredicateBasedRule#choose 

前文我们提到的关注点3 

AbstractClientHttpRequest#execute 

        此处,就已经到了RestTemplate底层执行的代码了,由此也将验证最终请求的调用还是靠的RestTemplate 

        接下来,在进行负载chooseServer的时候,LoadBalancer负载均衡器中已经有了serverList,那么这个serverList是什么时候被注入到LoadBalancer中的,它的一个机制大概是怎样的? 

  来到RibbonClientConfiguration 

把目光聚焦到使用这个空对象ServerList的地方

进入enableAndInitLearnNewServersFeature()方法 

3、RandomRule随机策略源码剖析 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠然予夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值