SpringCloud Consul choose server 选取 与 serverList 更新机制
SpringCloudserver 更新 机制 Consul 选取 choose
2023-09-27 14:24:03 时间
(SpringCloud Consul 2.2.3)
ribbon-loadbalancer-2.3.0.jar
1. feign 调用时,server 选取的流程:(借助 ribbon 实现的)
可以加一个 feign.RequestInterceptor ,然后在 inteceptor 上打断点,找到下面的调用关系
1 1. feign接口 2 1.1 org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute() 3 1.1.1 com.netflix.client.AbstractLoadBalancerAwareClient#executeWithLoadBalancer() 4 1.1.1.1 com.netflix.loadbalancer.reactive.LoadBalancerCommand#selectServer() 5 1.1.1.1.1 com.netflix.loadbalancer.ZoneAwareLoadBalancer#chooseServer() // 它自己维护了一个 serverList 列表,每 30s 更新一次
// 从 ILoadBalancer#getServerList() 中选取一个 server com.netflix.loadbalancer.ZoneAwareLoadBalancer#chooseServer() // 获取可用的服务 ILoadBalancer#getServerList com.netflix.loadbalancer.BaseLoadBalancer#getServerList()
2. SpringCloud Consul : serverList 更新机制
com.netflix.loadbalancer.PollingServerListUpdater#start() // 定时任务,30s 更新一次最新的服务列表信息 --> org.springframework.cloud.consul.discovery.ConsulServerList#getUpdatedListOfServers() // 断点打在这里,会发现隔段时间就会被调用
com.netflix.loadbalancer.PollingServerListUpdater#start()
1 public synchronized void start(final UpdateAction updateAction) { 2 if (isActive.compareAndSet(false, true)) { 3 final Runnable wrapperRunnable = new Runnable() { 4 @Override 5 public void run() { 6 if (!isActive.get()) { 7 if (scheduledFuture != null) { 8 scheduledFuture.cancel(true); 9 } 10 return; 11 } 12 try { 13 updateAction.doUpdate(); // 更新 serverList 14 lastUpdated = System.currentTimeMillis(); 15 } catch (Exception e) { 16 logger.warn("Failed one update cycle", e); 17 } 18 } 19 }; 20 21 scheduledFuture = getRefreshExecutor().scheduleWithFixedDelay( 22 wrapperRunnable, 23 initialDelayMs, 24 refreshIntervalMs, // 默认 30*1000ms 25 TimeUnit.MILLISECONDS 26 ); 27 } else { 28 logger.info("Already active, no-op"); 29 } 30 }
参考:
https://www.iflym.com/index.php/code/202003190001.html
相关文章
- springcloud(六):配置中心git示例
- 《SpringCloud实战项目》系列目录
- springcloud(八):配置中心服务化和高可用
- springcloud(三):服务提供与调用
- 吐血推荐--SpringBoot与SpringCloud的版本对应说明,兼容说明
- Consul作为SpringCloud配置中心
- SpringCloud组件和概念介绍
- 【微服务】SpringCloud Alibaba版本确认完成,开始传统方式安装Nacos
- SpringCloud、dubbo 和 druid 问题总结
- springcloud config 分布式配置中心
- SpringCloud学习笔记(二)
- 微服务开发框架-SpringCloud
- SpringCloud Config Server中{application}等占位符使用场景设置默认拉去分支
- SpringCloud Zipkin快速开始
- 微服务SpringCloud容器化案例