zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    图片轮显效果大全
    firefox 对WebRTC支持
    Android AES加密算法及事实上现
    怎样以学习单片机为契机,逐步成为优秀的project师
    HTML中Select的使用具体解释
    POJ 3602 Typographical Ligatures
    远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像
    blend
    POJ3187 Backward Digit Sums
    牛腩公布系统--HTTP 错误 403.14
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/13362057.html
Copyright © 2011-2022 走看看