Eureka 源碼解析 —— Eureka-Server 啓動(一)之 ServerConfig

摘要: 原創出處 http://www.iocoder.cn/Eureka/eureka-server-init-first/ 「芋道源碼」歡迎轉載,保留摘要,謝謝!

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

  • 1. 概述
  • 2. EurekaServerConfig

  • 1. 概述

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

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

    推薦 Spring Cloud 書籍

    2. EurekaServerConfig

    com.netflix.eureka.EurekaServerConfigEureka-Server 配置接口


    2.1 類關係圖


    2.2 配置屬性

    點擊 EurekaServerConfig 查看配置屬性簡介,已經添加中文註釋,可以對照着英文註釋一起理解。這裏筆者摘出部分較爲重要的屬性:

    • 請求認證相關

    • 請求限流相關

      • 《Eureka 源碼解析 —— 基於令牌桶算法的 RateLimiter》 有詳細解析。
      • #isRateLimiterEnabled() :請求限流是否開啓。
      • #isRateLimiterThrottleStandardClients() :是否對標準客戶端判斷是否限流。標準客戶端通過請求頭( 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-Server 遠程節點( 非集羣 )讀取相關

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

        • key :Eureka-Server 區域( region )
        • value :Eureka-Server 地址

      • #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);
    }
    }
    }
發佈了22 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章