SpringCloud Consul choose server 選取 與 serverList 更新機制


(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM