spring cloud源码解读(3)-ribbon

请务必读完读明白前两节的源码,否则此篇你会蒙。

1.首先找到对应的配置类利用spi机制引入配置类:

在这里插入图片描述

2。此类内处重点位置:

在这里插入图片描述

标注1说明

1。此配置类对应方法:org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.RetryInterceptorAutoConfiguration#restTemplateCustomizer(把ribbon的interceptor加入到拦截器链路,为后面获取服务列表做准备。dubbo也是这样玩的利用拦截器)记住此拦截器
在这里插入图片描述

标注2说明

1.org.springframework.cloud.netflix.ribbon.SpringClientFactory#SpringClientFactory重点注意此类中的
在这里插入图片描述
2。此方法org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonLoadBalancer生成ILoadBalancer
在这里插入图片描述

配置类完成进入正题,开始进入代码

1。首先要在restTemplate上加入注解loadBalance:
在这里插入图片描述
2.示例分析:
在这里插入图片描述
3.最终会走入此类org.springframework.http.client.InterceptingClientHttpRequest.InterceptingRequestExecution#execute:
此处会进入之前我们在[标注1说明]里说的interceptor里去。
在这里插入图片描述
4.到org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor#intercept到此拦截器中后会内部再创建一个spring容器取到服务列表:
在这里插入图片描述
5.创建spring容器(主要是为了得到ILoadBalancer)之前(获取 )org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#execute(java.lang.String, org.springframework.cloud.client.loadbalancer.LoadBalancerRequest, java.lang.Object)
在这里插入图片描述
6.拿到spring容器对象:
org.springframework.cloud.context.named.NamedContextFactory#getInstance(java.lang.String, java.lang.Class)
在这里插入图片描述
7.代码重要位置:
org.springframework.cloud.context.named.NamedContextFactory#createContext此类会把ribbon在spring容器中需要的配置类导入到到spring中(configurations是标注2中注入的类)EurekaRibbonClientConfiguration此类为重点这里是把这些configuration类变成BeanDefinition对象供spring容器加载:
在这里插入图片描述
上图说明2:注意上面提到的org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration这个类并不是在上面加载到spring容器的,而是被此动态创建的springioc容器加载的:
在这里插入图片描述
8.进入org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration#ribbonServerList方法重点:
在这里插入图片描述
9。上面ILoadBalancer会调用com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList#obtainServersViaDiscovery此方法获取服务列表
在这里插入图片描述
10。此方法值得一提:
com.netflix.discovery.DiscoveryClient#getInstancesByVipAddress(java.lang.String, boolean, java.lang.String)
里面回顾eureka client拉取服务列表熟悉的变量又回来了。
在这里插入图片描述
12。上面两个org.springframework.cloud.netflix.ribbon.eureka.EurekaRibbonClientConfiguration#ribbonServerList

org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonLoadBalancer方法说明一下:
先调用ribbonServerList再(获取serverList------------->>>再调用ribbonLoadBalancer获取ribbonLoadBalancer对象。

上面11会再此对象的构造里的restOfInit方法调用com.netflix.loadbalancer.DynamicServerListLoadBalancer#DynamicServerListLoadBalancer(com.netflix.client.config.IClientConfig, com.netflix.loadbalancer.IRule, com.netflix.loadbalancer.IPing, com.netflix.loadbalancer.ServerList, com.netflix.loadbalancer.ServerListFilter, com.netflix.loadbalancer.ServerListUpdater)
在这里插入图片描述
调到这里:
在这里插入图片描述
最终调到上面提到的com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList#obtainServersViaDiscovery:
在这里插入图片描述
到此服务列表获取完成!!!

回到上面的这org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#execute(java.lang.String, org.springframework.cloud.client.loadbalancer.LoadBalancerRequest, java.lang.Object)方法里:
在这里插入图片描述
最终调用com.netflix.loadbalancer.BaseLoadBalancer#chooseServer:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值