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

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

spring cloud源码解读(3)-ribbon

2。此类内处重点位置:

spring cloud源码解读(3)-ribbon

标注1说明

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

标注2说明

1.org.springframework.cloud.netflix.ribbon.SpringClientFactory#SpringClientFactory重点注意此类中的
spring cloud源码解读(3)-ribbon
2。此方法org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonLoadBalancer生成ILoadBalancer
spring cloud源码解读(3)-ribbon

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

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

回到上面的这org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient#execute(java.lang.String, org.springframework.cloud.client.loadbalancer.LoadBalancerRequest, java.lang.Object)方法里:
spring cloud源码解读(3)-ribbon
最终调用com.netflix.loadbalancer.BaseLoadBalancer#chooseServer:
spring cloud源码解读(3)-ribbon

相关文章:

  • 2021-10-08
  • 2021-09-06
  • 2021-03-31
  • 2021-11-24
  • 2022-01-22
  • 2019-10-21
猜你喜欢
  • 2022-01-26
  • 2021-12-20
  • 2021-10-04
  • 2021-11-24
  • 2021-10-20
  • 2021-10-23
  • 2021-04-08
相关资源
相似解决方案