请务必读完读明白前两节的源码,否则此篇你会蒙。
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: