本文主要基於 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.EurekaServerConfig
,Eureka-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. 彩蛋
涉及到配置,內容初看起來會比較多,慢慢理解後,就會變得很“囉嗦”,請保持耐心。
胖友,分享一個朋友圈可好。