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

註冊中心 Eureka 原始碼解析 —— Eureka-Server 啟動(一)之 ServerConfig

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

  • 1. 概述

  • 2. EurekaServerConfig

  • 2.1 類關係圖

  • 2.2 配置屬性

  • 2.3 DefaultEurekaServerConfig

  • 666. 彩蛋


友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群和【芋艿】搞基嗨皮。
友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群和【芋艿】】搞基嗨皮。
友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群和【芋艿】】搞基嗨皮。


1. 概述

本文主要分享 Eureka-Server 啟動的過程

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

  • 【本文】ServerConfig

  • EurekaBootStrap

推薦 Spring Cloud 書籍

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

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

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

  • 兩書齊買,京東包郵。

推薦 Spring Cloud 影片

  • Java 微服務實踐 – Spring Boot

  • Java 微服務實踐 – Spring Cloud

  • Java 微服務實踐 – Spring Boot / Spring Cloud

2. EurekaServerConfig

com.netflix.eureka.EurekaServerConfigEureka-Server 配置介面

2.1 類關係圖

2.2 配置屬性

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

  • 請求認證相關

    • Eureka-Server 未實現認證。在 Spring-Cloud-Eureka-Server,透過 spring-boot-starter-security 模組支援。《spring cloud-給Eureka Server加上安全的使用者認證》有詳細解析。

    • #shouldLogIdentityHeaders() :列印訪問的客戶端名和版本號,配合 Netflix Servo 實現監控資訊採集。

  • 請求限流相關

    • 《Eureka 原始碼解析 —— 基於令牌桶演演算法的 RateLimiter》 有詳細解析。

    • #isRateLimiterEnabled() :請求限流是否開啟。

    • #isRateLimiterThrottleStandardClients() :是否對標準客戶端判斷是否限流。標準客戶端透過請求頭( essay-header )的 "DiscoveryIdentity-Name" 來判斷,是否在標準客戶端名集合裡。

    • #getRateLimiterPrivilegedClients() :標準客戶端名集合。預設包含"DefaultClient" 和 "DefaultServer" 。

    • #getRateLimiterBurstSize() :速率限制的 burst size ,使用令牌桶演演算法

    • #getRateLimiterRegistryFetchAverageRate() :增量拉取註冊資訊的速率限制。

    • #getRateLimiterFullFetchAverageRate() :全量拉取註冊資訊的速率限制。

  • 獲取註冊資訊請求相關

    • 《Eureka 原始碼解析 —— 應用實體註冊發現 (六)之全量獲取》 有詳細解析。

    • 《Eureka 原始碼解析 —— 應用實體註冊發現 (七)之增量獲取》 有詳細解析。

    • #shouldUseReadOnlyResponseCache() :是否開啟只讀請求響應快取。響應快取 ( ResponseCache ) 機制目前使用兩層快取策略。優先讀取只讀快取,讀取不到後讀取固定過期讀寫快取

    • #getResponseCacheUpdateIntervalMs() :只讀快取更新頻率,單位:毫秒。只讀快取定時更新任務只更新讀取過請求 (com.netflix.eureka.registry.Key),因此雖然永不過期,也會存在讀取不到的情況。

    • #getResponseCacheAutoExpirationInSeconds() :讀寫快取寫入後過期時間,單位:秒。

    • #getRetentionTimeInMSInDeltaQueue():租約變更記錄過期時長,單位:毫秒。預設值 : 3 * 60 * 1000 毫秒。

    • #DeltaRetentionTimerIntervalInMs():移除佇列裡過期的租約變更記錄的定時任務執行頻率,單位:毫秒。預設值 :30 * 1000 毫秒。

  • 自我保護機制相關

    • 在 《Eureka 原始碼解析 —— 應用實體註冊發現(四)之自我保護機制》 有詳細解析。

    • #shouldEnableSelfPreservation() :是否開啟自我保護樣式。

      FROM 周立——《理解Eureka的自我保護樣式》 
      當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護樣式。 
      一旦進入該樣式,Eureka Server就會保護服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務)。 
      當網路故障恢復後,該Eureka Server節點會自動退出自我保護樣式。

    • #getRenewalPercentThreshold() :開啟自我保護樣式比例,超過該比例後開啟自我保護樣式。

    • #getRenewalThresholdUpdateIntervalMs() :自我保護樣式比例更新定時任務執行頻率,單位:毫秒。

  • 註冊的應用實體的租約過期相關

    • 在 《Eureka 原始碼解析 —— 應用實體註冊發現(五)之過期》 有詳細解析。

    • #getEvictionIntervalTimerInMs() :租約過期定時任務執行頻率,單位:毫秒。

  • Eureka-Server 遠端節點( 非叢集 )讀取相關

    • key :Eureka-Server 區域( region )

    • value :Eureka-Server 地址

    • TODO[0009]:RemoteRegionRegistry

    • #getRemoteRegionUrlsWithName() :TODO[0009]:RemoteRegionRegistry。

    • #getRemoteRegionAppWhitelist() :TODO[0009]:RemoteRegionRegistry。

    • #getRemoteRegionRegistryFetchInterval() :TODO[0009]:RemoteRegionRegistry。

    • #getRegistrySyncRetries() :Eureka-Server 啟動時,從遠端 Eureka-Server 讀取失敗重試次數。

    • #getRegistrySyncRetryWaitMs() :Eureka-Server 啟動時,從遠端 Eureka-Server 讀取失敗等待( sleep )間隔,單位:毫秒。

    • #getRemoteRegionFetchThreadPoolSize() :TODO[0009]:RemoteRegionRegistry。

    • #disableTransparentFallbackToOtherRegion() :是否禁用本地讀取不到註冊資訊,從遠端 Eureka-Server 讀取。

  • Eureka-Server 叢集同步相關

    • 在 《Eureka 原始碼解析 —— Eureka-Server 叢集同步》

    • #getMaxThreadsForPeerReplication() :同步應用實體資訊最大執行緒數。

    • #getMaxElementsInPeerReplicationPool() :待執行同步應用實體資訊事件緩衝最大數量。

    • #getMaxTimeForReplication() :執行單個同步應用實體資訊狀態任務最大時間。

    • #shouldSyncWhenTimestampDiffers() :是否同步應用實體資訊,當應用實體資訊最後更新時間戳( lastDirtyTimestamp )發生改變。

    • #getWaitTimeInMsWhenSyncEmpty() :Eureka-Server 啟動時,從遠端 Eureka-Server 讀取不到註冊資訊時,多長時間不允許 Eureka-Client 訪問。

    • #getPeerEurekaNodesUpdateIntervalMs() :Eureka-Server 叢集節點更新頻率,單位:毫秒。

2.3 DefaultEurekaServerConfig

com.netflix.eureka.DefaultEurekaServerConfig,基於配置檔案的 Eureka-Server 配置實現類,實現程式碼如下:

public class DefaultEurekaServerConfig implements EurekaServerConfig {

   // ... 省略部分方法和屬性

   private static final String ARCHAIUS_DEPLOYMENT_ENVIRONMENT = "archaius.deployment.environment";
   private static final String TEST = "test";
   private static final String EUREKA_ENVIRONMENT = "eureka.environment";

   /**
    * 配置檔案物件
    */

   private static final DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory.getInstance();
   /**
    * 配置檔案
    */

   private static final DynamicStringProperty EUREKA_PROPS_FILE = DynamicPropertyFactory
           .getInstance().getStringProperty("eureka.server.props", "eureka-server");

   /**
    * 名稱空間
    */

   private String namespace = "eureka.";

   public DefaultEurekaServerConfig() {
       init();
   }

   public DefaultEurekaServerConfig(String namespace) {
       // 設定 namespace,為 "." 結尾
       this.namespace = namespace;
       // 初始化 配置檔案物件
       init();
   }

   private void init() {
       // 初始化 配置檔案物件
       String env = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT, TEST);
       ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, env);
       String eurekaPropsFile = EUREKA_PROPS_FILE.get();
       try {
           // ConfigurationManager
           // .loadPropertiesFromResources(eurekaPropsFile);
           ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);
       } catch (IOException e) {
           logger.warn("Cannot find the properties specified : {}. This may be okay if there are other environment "
                           + "specific properties or the configuration is installed with a different mechanism.", eurekaPropsFile);
       }
   }
}
  • 呼叫 #init() 方法,初始化配置檔案物件。類似 PropertiesInstanceConfig,點選《Eureka 原始碼解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig》「2.4 PropertiesInstanceConfig」檢視詳細解析。預設配置檔案名為 eureka-server

  • 無配置檔案的每個屬性 KEY 的列舉類。

666. 彩蛋

知識星球

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

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

贊(0)

分享創造快樂