Spring Cloud Ribbon源码分析
2021-10-18 20:30:24 1 举报
通过图解分析Spring Cloud Ribbon的源码流程。
作者其他创作
大纲/内容
用户服务
serverListImpl.getUpdatedListOfServers()
updateListOfServers
ServiceRequestWrapper.getURI
IBalancer=getLoadBalancer(serviceId)
定时更新Eureka实例列表
LoadBalancerInterceptor
利用工厂模式,根据serviceId获得IBalancer实例
allServerList
request=ServiceRequestWrapper通过匿名内部类来构建
BaseLoadBalancer.chooseServer
RestTemplate.getForObject()
请求被拦截
restTemplate.getForObject(\"http://test-spring-cloud-user/user\")
AbstractServerPredicatechooseRoundRobinAfterFiltering
Ribbon
RibbonClientConfiguration
使用eurekaClient获取服务实例列表
Bean的装配
1. 获取负载均衡器
BaseLoadBalancer
serverListUpdater.start
LoadBalancerClient.execute()
InterceptingAsyncClientHttpRequest.executeAsync
request.getURI()
RibbonAutoConfiguration
initWithConfig
RibbonLoadBalancerClient.execute
enableAndInitLearnNewServersFeature
父类初始化
DiscoveryEnabledNIWSServerList.getUpdatedListOfServers
指向初始化的Bean
@AutoConfigureBefore
订单服务
1. 重构URI
通过配置文件可以指定负载均衡的规则
RibbonLoadBalancerClient
从本地配置获取服务列表
SmartInitializingSingleton
updateAllServerList
更多技术资料,请扫码关注公众号。
restOfInit(clientConfig)
DynamicServerListLoadBalancer
2.通过负载均衡器中配置的默认负载均衡算法挑选一个合适的Server
request.apply
2. 发起异步远程调用
rule.choose(key)
LoadBalancerInterceptor.intercept()
@LoadBalanced
默认采用轮询算法来实现请求的负载
保存更新后的服务列表
loadBalancer.chooseServer
bean指向
ServerListUpdater=PollingServerListUpdater
PredicateBasedRule
RestTemplateCustomizer
eurekaClient.getInstancesByVipAddress
setPingInterval
clientConfig.get(CommonClientConfigKey.ListOfServers);
每10s去检查一次服务列表是否正常运行(默认情况下不会去验证)
在构造方法中执行
IPing=DummyPing
ILoadBalancer=ZoneAwareLoadBalancer
LoadBalancerClient
每隔30s更新一次服务列表
RestTemplateCustomizer的作用是对修饰了@LoadBalanced注解的RestTemplate实例添加LoadBalancerInterceptor拦截器
用RestTemplateCustomizer定制所有被@LoadBalanced注解修饰的RestTemplate实例
调用真实的地址发起请求
RibbonLoadBalancerClient.reconstructURI
upServerList
AbstractAsyncClientHttpRequest.executeAsync
LoadBalancerAutoConfiguration
IRule=ZoneAvoidanceRule
setServersList
ConfigurationBasedServerList.getUpdatedListOfServers
clientFactory.getLoadBalancer(serviceId);
获取所有Eureka实例列表
初始化bean
从Eureka注册中心上动态获取服务列表
request.getURI();
0 条评论
下一页