本文主要基於 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 自身初始化過程中,涉及到主要物件如下圖:
-
建立 EurekaInstanceConfig物件
-
使用 EurekaInstanceConfig物件 建立 InstanceInfo物件
-
使用 EurekaInstanceConfig物件 + InstanceInfo物件 建立 ApplicationInfoManager物件
-
建立 EurekaClientConfig物件
-
使用 ApplicationInfoManager物件 + EurekaClientConfig物件 建立 EurekaClient物件
考慮到整個初始化的過程中涉及的配置特別多,拆分成三篇文章:
-
(一)EurekaInstanceConfig)
-
【本文】(二)EurekaClientConfig
-
(三)EurekaClient
下麵我們來看看每個類的實現。
推薦 Spring Cloud 書籍:
-
請支援正版。下載盜版,等於主動編寫低階 BUG 。
-
程式猿DD —— 《Spring Cloud微服務實戰》
-
周立 —— 《Spring Cloud與Docker微服務架構實戰》
-
兩書齊買,京東包郵。
2. EurekaClientConfig
com.netflix.discovery.EurekaClientConfig
,Eureka-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. 彩蛋
涉及到配置,內容初看起來會比較多,慢慢理解後,就會變得很“囉嗦”,請保持耐心。
胖友,分享一個朋友圈可好。