歡迎光臨
每天分享高質量文章

註冊中心 Eureka 原始碼解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig

本文主要基於 Eureka 1.8.X 版本

  • 1. 概述

  • 2. EurekaClientConfig

    • 2.1 類關係圖

    • 2.2 配置屬性

    • 2.3 DefaultEurekaClientConfig

    • 2.4 DefaultEurekaClientConfigProvider

    • 2.5 小結

  • 3. EurekaTransportConfig

    • 3.1 類關係圖

    • 3.2 配置屬性

    • 3.3 DefaultEurekaTransportConfig

  • 666. 彩蛋


友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群討論技術和原始碼。
友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群討論技術和原始碼。
友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群討論技術和原始碼。

1. 概述

本文接《Eureka 原始碼解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》,主要分享 Eureka-Client 自身初始化的過程的第二部分 —— EurekaClientConfig,不包含 Eureka-Client 向 Eureka-Server 的註冊過程( ?後面會另外文章分享 )。

Eureka-Client 自身初始化過程中,涉及到主要物件如下圖:

  1. 建立 EurekaInstanceConfig物件

  2. 使用 EurekaInstanceConfig物件 建立 InstanceInfo物件

  3. 使用 EurekaInstanceConfig物件 + InstanceInfo物件 建立 ApplicationInfoManager物件

  4. 建立 EurekaClientConfig物件

  5. 使用 ApplicationInfoManager物件 + EurekaClientConfig物件 建立 EurekaClient物件

考慮到整個初始化的過程中涉及的配置特別多,拆分成三篇文章:

  1. (一)EurekaInstanceConfig)

  2. 【本文】(二)EurekaClientConfig

  3. (三)EurekaClient

下麵我們來看看每個的實現。

推薦 Spring Cloud 書籍

  • 請支援正版。下載盜版,等於主動編寫低階 BUG 。

  • 程式猿DD —— 《Spring Cloud微服務實戰》

  • 周立 —— 《Spring Cloud與Docker微服務架構實戰》

  • 兩書齊買,京東包郵。

2. EurekaClientConfig

com.netflix.discovery.EurekaClientConfigEureka-Client 配置介面

2.1 類關係圖

EurekaClientConfig 整體類關係如下圖:

  • 本文只解析紅圈部分類。

  • EurekaArchaius2ClientConfig 基於 Netflix Archaius 2.x 實現,目前還在開發中,因此暫不解析。

2.2 配置屬性

點選 EurekaClientConfig 檢視配置屬性簡介,已經新增中文註釋,可以對照著英文註釋一起理解。這裡筆者摘出部分較為重要的屬性:

  • Region、Zone 相關

    • x

    • #getRegion() :Eureka-Client 所在區域( region )。

    • #getAvailabilityZones() :Eureka-Client 所在地區( region ) 可用區( zone )集合。該引數雖然是陣列,第一個元素代表其所在的可用區。實現程式碼如下:

      // InstanceInfo.java
      public static String getZone(String[] availZones, InstanceInfo myInfo) {
         String instanceZone = ((availZones == null || availZones.length == 0) ? "default"
                 : availZones[0]);
         if (myInfo != null
                 && myInfo.getDataCenterInfo().getName() == DataCenterInfo.Name.Amazon) {
          String awsInstanceZone = ((AmazonInfo) myInfo.getDataCenterInfo())
                 .get(AmazonInfo.MetaDataKey.availabilityZone);
         if (awsInstanceZone != null) {
             instanceZone = awsInstanceZone;
         }

      }
      return instanceZone;

      }

  • 進步一步理解 Region、Zone 檢視《周立 —— Region、Zone解析》。

  • 使用 DNS 獲取 Eureka-Server URL 相關

    • #shouldUseDnsForFetchingServiceUrls() :是否使用 DNS 方式獲取 Eureka-Server URL 地址。

    • #getEurekaServerDNSName() :Eureka-Server 的 DNS 名。

    • #getEurekaServerPort() :Eureka-Server 的埠。

    • #getEurekaServerURLContext() :Eureka-Server 的 URL Context 。

    • #getEurekaServiceUrlPollIntervalSeconds() :輪詢獲取 Eureka-Server 地址變更頻率,單位:秒。預設:300 秒。

    • #shouldPreferSameZoneEureka() :優先使用相同區( zone )的 Eureka-Server。

  • 直接配合 Eureka-Server URL 相關

    • #getEurekaServerServiceUrls() : Eureka-Server 的 URL 集合。

  • 發現:從 Eureka-Server 獲取註冊資訊相關

    • 實現邏輯和 《Eureka 原始碼解析 —— 應用實體註冊發現 (六)之全量獲取》

    • 本系列暫時寫對它的原始碼解析,感興趣的同學可以看 com.netflix.discovery.shared.transport.EurekaHttpClient#getVip(String, String...) 和 com.netflix.eureka.resources.AbstractVIPResource 。

    • #shouldFetchRegistry() :是否從 Eureka-Server 拉取註冊資訊。

    • #getRegistryFetchIntervalSeconds() :從 Eureka-Server 拉取註冊資訊頻率,單位:秒。預設:30 秒。

    • #shouldFilterOnlyUpInstances() :是否過濾,只獲取狀態為開啟( Up )的應用實體集合。

    • #fetchRegistryForRemoteRegions() :TODO[0009]:RemoteRegionRegistry

    • #getCacheRefreshExecutorThreadPoolSize() :註冊資訊快取掃清執行緒池大小。

    • #getCacheRefreshExecutorExponentialBackOffBound() :註冊資訊快取掃清執行超時後的延遲重試的時間。

    • #getRegistryRefreshSingleVipAddress() :只獲得一個 vipAddress 對應的應用實體們的註冊資訊。

  • 註冊:向 Eureka-Server 註冊自身服務

    • #shouldRegisterWithEureka() :是否向 Eureka-Server 註冊自身服務。

    • #shouldUnregisterOnShutdown() :是否向 Eureka-Server 取消註冊自身服務,當行程關閉時。

    • #getInstanceInfoReplicationIntervalSeconds() :向 Eureka-Server 同步應用實體資訊變化頻率,單位:秒。

    • #getInitialInstanceInfoReplicationIntervalSeconds() :向 Eureka-Server 同步應用資訊變化初始化延遲,單位:秒。

    • #getBackupRegistryImpl() :獲取備份註冊中心實現類。當 Eureka-Client 啟動時,無法從 Eureka-Server 讀取註冊資訊(可能掛了),從備份註冊中心讀取註冊資訊。目前 Eureka-Client 未提供合適的實現。

    • #getHeartbeatExecutorThreadPoolSize() :心跳執行執行緒池大小。

    • #getHeartbeatExecutorExponentialBackOffBound() :心跳執行超時後的延遲重試的時間。

2.3 DefaultEurekaClientConfig

com.netflix.discovery.DefaultEurekaClientConfig,基於配置檔案的 Eureka-Client 配置實現類,實現程式碼如下:

public class DefaultEurekaClientConfig implements EurekaClientConfig {

   public static final String DEFAULT_ZONE = "defaultZone";

   /**
    * 名稱空間
    */

   private final String namespace;
   /**
    * 配置檔案物件
    */

   private final DynamicPropertyFactory configInstance;
   /**
    * HTTP 傳輸配置
    */

   private final EurekaTransportConfig transportConfig;

   public DefaultEurekaClientConfig(String namespace) {
       // 設定 namespace,為 "." 結尾
       this.namespace = namespace.endsWith(".")
               ? namespace
               : namespace + ".";
       // 初始化 配置檔案物件
       this.configInstance = Archaius1Utils.initConfig(CommonConstants.CONFIG_FILE_NAME);
       // 建立 HTTP 傳輸配置
       this.transportConfig = new DefaultEurekaTransportConfig(namespace, configInstance);
   }
}
  • 類似 PropertiesInstanceConfig,點選《Eureka 原始碼解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》「2.4 PropertiesInstanceConfig」檢視詳細解析。

  • 在 com.netflix.discovery.PropertyBasedClientConfigConstants 可以看到配置檔案的每個屬性 KEY 。

  • transportConfig 屬性,在 「3. EurekaTransportConfig」 詳細解析。

2.4 DefaultEurekaClientConfigProvider

com.netflix.discovery.providers.DefaultEurekaClientConfigProvider,建立 DefaultEurekaClientConfig 的工廠,實現程式碼如下:

public class DefaultEurekaClientConfigProvider implements Provider<EurekaClientConfig> {

   @Inject(optional = true)
   @EurekaNamespace
   private String namespace;

   private DefaultEurekaClientConfig config;

   @Override
   public synchronized EurekaClientConfig get() {
       if (config == null) {
           config = (namespace == null)
                   ? new DefaultEurekaClientConfig()
                   : new DefaultEurekaClientConfig(namespace);

           // TODO: Remove this when DiscoveryManager is finally no longer used
           DiscoveryManager.getInstance().setEurekaClientConfig(config);
       }

       return config;
   }
}

2.5 小結

推薦參考閱讀:

  • 程式猿DD —— 《Spring Cloud微服務實戰》 Spring Cloud Eureka —— 配置詳解

  • 風中程式猿 —— 《微服務架構:Eureka引數配置項詳解》

3. EurekaTransportConfig

3.1 類關係圖

EurekaTransportConfig 整體類關係如下圖:

  • 本文只解析紅圈部分類。

  • EurekaArchaius2TransportConfig 基於 Netflix Archaius 2.x 實現,目前還在開發中,因此暫不解析。

3.2 配置屬性

點選 EurekaTransportConfig 檢視配置屬性簡介,已經新增中文註釋,可以對照著英文註釋一起理解。這裡筆者摘出部分較為重要的屬性:

  • #getSessionedClientReconnectIntervalSeconds() :EurekaHttpClient 會話週期性重連時間,單位:秒。在 《Eureka 原始碼解析 —— 網路通訊》「5.4 SessionedEurekaHttpClient」》 有詳細解析。

  • #getRetryableClientQuarantineRefreshPercentage() :重試 EurekaHttpClient ,請求失敗的 Eureka-Server 隔離集合佔比 Eureka-Server 全量集合佔比,超過該比例,進行清空。在 《Eureka 原始碼解析 —— 網路通訊》「5.3 RetryableEurekaHttpClient」》 有詳細解析。

  • 非同步 EndPoint 叢集解析器 :

    • 在 《Eureka 原始碼解析 —— EndPoint 與 解析器》「3.6 AsyncResolver」》 有詳細解析。

    • #getAsyncResolverRefreshIntervalMs() :非同步解析 EndPoint 叢集頻率,單位:毫秒。

    • #getAsyncResolverWarmUpTimeoutMs() :非同步解析器預熱解析 EndPoint 叢集超時時間,單位:毫秒。

    • #getAsyncExecutorThreadPoolSize() :非同步解析器執行緒池大小。

  • TODO[0028]:寫入叢集和讀取叢集。Eureka 2.x 相容 :

    • #getApplicationsResolverDataStalenessThresholdSeconds()

    • #applicationsResolverUseIp()

    • #getWriteClusterVip()

    • #getReadClusterVip()

    • #getBootstrapResolverStrategy()

    • #useBootstrapResolverForQuery()

3.3 DefaultEurekaTransportConfig

com.netflix.discovery.shared.transport.DefaultEurekaTransportConfig,基於配置檔案網路傳輸配置實現類,實現程式碼如下:

public class DefaultEurekaTransportConfig implements EurekaTransportConfig {

   private static final String SUB_NAMESPACE = TRANSPORT_CONFIG_SUB_NAMESPACE + ".";

   /**
    * 名稱空間
    */

   private final String namespace;
   /**
    * 配置檔案物件
    */

   private final DynamicPropertyFactory configInstance;

   public DefaultEurekaTransportConfig(String parentNamespace, DynamicPropertyFactory configInstance) {
       // 名稱空間
       this.namespace = parentNamespace == null
               ? SUB_NAMESPACE
               : (parentNamespace.endsWith(".")
                   ? parentNamespace + SUB_NAMESPACE
                   : parentNamespace + "." + SUB_NAMESPACE);
       // 配置檔案物件
       this.configInstance = configInstance;
   }
}
  • 類似 PropertiesInstanceConfig,點選《Eureka 原始碼解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》「2.4 PropertiesInstanceConfig」檢視詳細解析。

  • 在 com.netflix.discovery.shared.transport.PropertyBasedTransportConfigConstants 可以看到配置檔案的每個屬性 KEY 。

666. 彩蛋

知識星球

涉及到配置,內容初看起來會比較多,慢慢理解後,就會變得很“囉嗦”,請保持耐心。

胖友,分享一個朋友圈可好。

贊(0)

分享創造快樂