源码 - Ribbon源码解析
2022-02-09 21:32:07 0 举报
Ribbon源码解析
作者其他创作
大纲/内容
restOfInit(clientConfig)
从@LoadBalanced注解看起
有个 被@LoadBalanced注解的restTemplates,里面装了所有被@LoadBalanced注解的restTemplate
配置文件 > JavaConfig
遍历,然后customizer.customize(restTemplate);
初始化父类
遍历,然后定制
数据来源,从自动装配@Bean梳理
setServersList(ls);
ServerList接口上右键找AutoConfiguration @Bean
Optional.of(eligible.get(incrementAndGetModulo(eligible.size())))
@AutoConfigureBefore
作为Bean的初始化参数
restTemplate.setInterceptors(list);
enableAndInitLearnNewServersFeature();
那就找 ILoadBalancer(接口) 默认的接口实现类哪个地方初始化的 右键类,看哪里有初始化它, 重点看待Configuration的类
同一个Interceptor
重点看updateAction的的接口调用
@Bean IRule
initWithConfig
Nacos源码图
clientFactory.getLoadBalancer(serviceId)
allServerList = allServers;
updateAllServerList(servers);
LoadBalancerInterceptor ribbonInterceptor
RibbonAutoConfiguration
相当于@Autowired ServerList<Server>
updateListOfServers();
IRule
Ribbon + RestTemplate
@Bean初始化
@Bean
super.setServersList(lsrv);
同一个方法
ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
这里是调用的父类的方法,也是没问题的
1
PollingServerListUpdater
LoadBalancerClient#execute
RestTemplateCustomizer customizer
getRefreshExecutor().scheduleWithFixedDelay(font color=\"#fbc02d\
自动装配类
RibbonClientConfiguration
updateAction.doUpdate();
serverListUpdater.start(updateAction);
ILoadBalancer
getPredicate().chooseRoundRobinAfterFiltering(lb.getAllServers()font color=\"#000000\
设置Server的定时ping任务
setPingInterval(pingIntervalTime);
没有配置的话,就走默认的@Bean实例化的IRule
@Bean ILoadBalancer 看入参 有个服务列表 serverList
restTemplate.getForEntity(\"http://artisan-product-center/selectProductInfoById/\",ProductInfo.class)
将服务实例设置到BaseLoadBalancer的allServerList
LoadBalancerAutoConfiguration
2
方式二: 注解同包下的XXAutoCOnfiguration
springboot风格,当然找META-INF/spring.factories -- EnableAutoConfiguration下的自动装配类
DynamicServerListLoadBalancer
hostReactor.getServiceInfo
new Pinger(pingStrategy).runPinger()
super.chooseServer(key);
IPing
执行http请求
入口
两个套路1. 对应jar包META-INF/spring.factories -- EnableAutoConfiguration下的自动装配类 【正统】2. 当前类包下的XXXAutoConfiguration [经验]
ZoneAwareLoadBalancer#chooseServer
作为ILoadBalancer的初始化参数
PredicateBasedRule#choose
启动定时任务,定期获取nacos所有实例
Nacos
点击nacos源码图,找服务发现的地方
定时任务
LoadBalancerInterceptor#intercept
采用CAS 代替锁,提高性能取模的算法
ZoneAwareLoadBalancer
按照常规思路,就去找ServerList是哪里初始化的,一看在本类有个@Bean,这里是从配置文件加载 。 而我们要用的是从nacos获取,所以这个地方不是真正的来源
@LoadBalanced注解
setupPingTask()
BaseLoadBalancer
BaseLoadBalancer#chooseServer
ZoneAvoidanceRule extends PredicateBasedRule
1. ribbon定时更新nacos实例列表
ZoneAvoidanceRule 默认
implement ServerListUpdater
2. 负载均衡器loadBalancer根据负载均衡算法选出一个eserver
默认选择RoundRobin
定制RestTemplate (将LoadBalancerInterceptor封装到RestTemplate的拦截器集合里去)
wrapperRunnable#run
用RestTemplateCustomizer定制所有的RestTemplate
getServers()
RibbonLoadBalancerClient
作为RestTemplateCustomizer的参数
注入RibbonLoadBalancerClient
PingTask extends TimerTask
loadBalancer.chooseServer(hint != null ? hint : \"default\");
ServerList<Server> serverListnacos服务实例
2.获取nacos所有健康实例
获取所有Nacos上的健康实例
notifyServerStatusChangeListener(changedServers);
直接从loadbalance中获取了全部的Server, 那lb中的server从哪里来的呢? 得看lb的初始化,看看它是如何从nacos中获取服务列表的
servers = serverListImpl.getUpdatedListOfServers();
SmartInitializingSingleton
NacosServerList#getUpdatedListOfServers
调用开始
loadBalancer接口就是ZoneAwareLoadBalancer
正常的请求会被inteceptor拦截
定时调用,默认30秒
调用
rule.choose(key);
1. 获得负载均衡器
找LoadBalancerClient对应接口的实现类RibbonLoadBalancerClient,什么时候被实例化的
0 条评论
回复 删除
下一页