Spring Cloud Eureka 配置詳解

在分析了Eureka的部分源碼之後,相信大家對Eureka的服務治理機制已經有了進一步的理解。在本節中,我們從使用的角度對Eureka中的一些常用配置內容進行詳細的介紹,以幫助我們根據自身環境與業務特點來進行個性化的配置調整。

在Eureka的服務治理體系中,主要分爲服務端與客戶端兩個不同的角色,服務端爲服務註冊中心,而客戶端爲各個提供接口的微服務應用。當我們構建了高可用的註冊中心之後,該集羣中所有的微服務應用和後續將要介紹的一些基礎類應用(如配置中心、API網關等)都可以視作該體系下的一個微服務(Eureka客戶端)。服務註冊中心也一樣,只是高可用環境下的服務註冊中心除了作爲客戶端之外,還爲集羣中的其他客戶端提供了服務註冊的特殊功能。所以,Eureka客戶端的配置對象存在於所有Eureka服務治理體系下的應用實例中。在實際使用Spring Cloud Eureka 的過程中,我們所做的配置內容幾乎都是對Eureka客戶端配置進行操作,所以瞭解這部分的配置內容,對於用好Eureka非常有幫助。

Eureka客戶端的主要配置分爲以下兩個方面。

  • 服務註冊相關的配置信息,包括服務註冊中心的地址、服務獲取的時間間隔、可用區域等。
  • 服務實例相關的配置信息,包括服務實例的名稱、IP地址,端口號,健康檢查路徑等。

而Eureka服務端更多地類似於一個現成產品,大多數情況下,我們不需要修改它的配置信息。所以在本書中,我們對此不進行過多的介紹,有興趣的讀者可以查看org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean類的定義來做進一步學習,這些參數均以eureka.server作爲前綴。另外值得一提的是,我們在學習本書內容進行本地調試的時候,可以通過設置該類中的enableSelfPerservation參數來關閉註冊中心的“自我保護”功能,以防止關閉的實例無法被服務註冊中心剔除的問題,這一點我們在“服務治理機制”一節中也有所介紹。

服務註冊配置

關於服務類的配置信息,我們可以通過查看org.springframework.cloud.netflix.eureka.EurekaClientConfigBean的源碼來獲得比官網文檔更爲詳盡的內容,這些配置信息都以eureka.client爲前綴,下面我們針對一些常用的配置信息做進一步的介紹和說明。

指定註冊中心

在本章第1節的示例中,我們演示瞭如何將一個Spring Boot應用納入Eureka的服務治理體系中,除了引入Eureka的依賴之外,就是在配置文件中指定註冊中心,主要通過eureka.client.serviceUrl參數實現,該參數的定義如下所示,他的配置值存儲在HashMap類型中,並且設有一組默認值,其默認值的key爲DefaultZone、value爲http://localhost:8761/eureka/。

private Map<String, String> serviceUrl = new HashMap<>();
{
    this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL);
}


public static final String DEFAULT_URL = "http://localhost:8761" + DEFAULT_PREFIX + "/";

public staitc final String DEFAULT_ZONE = "defaultZone";

由於之前實現的服務註冊中心使用了1111端口,所以我們做了如下的配置,來講應用註冊到對應的Eureka服務端中。

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

當我們構建了高可用服務註冊中心集羣時,我們可以爲參數的value配置多個註冊中心的地址(通過逗號分隔)。比如下面的例子:

eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/ ,http://peer2:1112/eureka/

另外,爲了服務註冊中心的安全考慮,很多時候我們都會爲服務註冊中心加入安全校驗,這個時候,在配置serviceUrl時,需要在value值的URL中加入相應的安全校驗信息,比如http://<username>:<password>@localhost:1111/eureka。其中,<username>爲安全信息校驗的用戶名,<password>爲該用戶的密碼。

其他配置

下面整理了org.springframework.cloud.netflix.eureka.EurekaClientConfigBean中定義的常量配置參數以及對應的說明和默認值,這些參數均以eureka.client爲前綴。

這些常用配置均已eureka.client爲前綴。

參數名 說明 默認值
enabled 啓用Eureka客戶端 true
registryFetchIntervalSeconds 從Eureka服務端獲取註冊信息的間隔時間,單位爲秒 30
instanceInfoReplicationIntervalSeconds 更新實例信息的變化到Eureka服務端的間隔時間,單位爲秒 30
initialInstanceInfoReplicationIntervalSeconds 初始化實例信息到Eureka服務端的間隔時間,單位爲秒 40
eurekaServiceUrlPollIntervalSeconds 輪詢Eureka服務端地址更改的間隔時間,單位爲秒。當我們與Spring CLoud Config整合,動態刷新Eureka的serviceURL地址時需要關注該參數 300
eurekaServerReadTimeoutSeconds 讀取Eureka Server信息的超時時間,單位爲秒 8
eurekaServerConnectTimeoutSeconds 鏈接Eureka Server的超時時間,單位爲秒 5
eurekaServerTotalConnections 從Eureka客戶端到所有Eureka服務端的連接總數 200
eurekaServerTotalConnectionsPerHost 從Eureka客戶端到每個Eureka服務端主機的連接總數 50
eurekaConnectionIdleTimeoutSeconds Eureka服務端連接的空閒關閉時間,單位爲秒 30
heartbeatExecutorThreadPoolSize 心跳連接池的初始化線程數 2
heartbeatExecutorExponentialBackOffBound 心跳超時重試延遲時間的最大乘數值 10
cacheRefreshExecutorThreadPoolSize 緩存刷新線程池的初始化線程數 2
cacheRefreshExecutorExponentialBackOffBound 緩存刷新重試延遲時間的最大乘數值 10
useDnsForFetchingServiceUrls 使用DNS來獲取Eureka服務端的serviceUrl false
registerWithEureka 是否要將自身的實例信息註冊到Eureka服務端 true
preferSameZoneEureka 是否偏好使用處於相同Zone的Eureka服務端 true
filterOnlyUpInstances 獲取實例時是否過濾,僅保留UP狀態的實例 true
fetchRegistry 是否從Eureka服務端獲取註冊信息 true

服務實例類配置

關於服務實例類配置信息,我們可以通過查看org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的源碼來獲取詳細內容,這些配置信息都以eureka.instance爲前綴。下面我們針對一些常用的配置信息做一些詳細的說明。

元數據

org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的配置實例中有一大部分內容是對服務實例元數據的配置,那麼什麼是服務實例的元數據呢?它是Eureka客戶端在向服務註冊中心發送註冊請求時,用來描述自身服務信息的對象,其中包含了一些標準化的元數據,比如服務名稱,實例名稱,實例IP,實例端口等用於服務治理的重要信息,以及一些用於負載均衡策略或是其他特殊用途的自定義元數據信息。

在使用SpringCloudEureka的時候,所有的配置信息都通過org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean進行加載,但在真正進行服務註冊的時候,還是會包裝成com.netflix.appinfo.InstanceInfo對象發送給Eureka服務端。這兩個的定義非常相似,我們可以直接查看com.netflix.appinfo.InstanceInfo類中的詳細定義來了解原生Eureka對元數據的定義。其中,Map<String, String> metadata = new ConcurrentHashMap<String, String>()是自定義的元數據信息,而其他成員變量則是標準化的元數據信息。Spring Cloud的EurekaInstanceConfigBean對原生數據對象做了一些配置優化處理,在後續的介紹中,我們也會提到這些內容。

我們可以通過eureka.instance.<properties>=<value>的格式對標準化元數據直接進行配置,其中<properties>就是EurekaInstanceConfigBean對象中的成員變量名,而對於自定義元數據,可以通過eureka.instance.metadataMap.<key>=<value>的格式來進行配置,比如:

eureka.instance.metadataMap.zone=shanghai

接下來,我們將針對一些常用元數據配置做進一步的介紹和說明。

實例名配置

實例名,即InstanceInfo中的instanceId參數,它是區分同一服務中不同實例的唯一標識。在Netflix Eurek的原生實現中,實例名採用主機名作爲默認值,這樣的設置是的在同一主機上無法同時啓動多個相同的服務實例。所以在Spring Cloud Eureka的配置中,針對同一主機啓動多個實例的情況,對實例名的默認命名做了更爲合理的擴展,它採用瞭如下默認規則:

${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id}:${server.port}

對於實例名的命名規則,我們可以通過eureka.instance.instanceId參數來進行配置。比如,在本地進行客戶端負載均衡調試時,需要啓動同一服務的多個實例,如果我們直接啓動同一個應用必然會導致端口衝突。雖然可以在命令行中指定不同的server.port來啓動,但這樣還是略顯麻煩。實際上,我們可以直接通過設置server.port=0或者使用隨機數server.port=${random.int[10000,19999]}來讓Tomcat啓動的時候採用隨機端口。但這個時候我們會發現註冊到Eureka Server的實例名都是相同的,這會使得只有一個服務實例能夠正常提供服務。對於這個問題,我們就可以通過這是實例名規則來輕鬆解決:

eureka.instance.instanceId=${spring.application.name}:${random.int}

通過上面的配置,利用應用名加隨機數的方式來區分不同的實例,從而實習那在同一主機上,不指定端口就能輕鬆啓動多個實例的效果。

端點配置

在InstanceInfo中,我們可以看到一些URL的配置信息,比如homePageUrl、statusPageUrl、healthCheckUrl,它們分別代表了應用主頁的URL、狀態頁的URL、健康檢查的URL。其中,狀態頁和健康檢查的URL在Spring Cloud Eureka中默認使用了spring-boot-actuator模塊提供的/info端點和/heath端點。雖然我們之前的示例中並沒有對這些端點做具體的設置,但實際上這些URL地址的配置非常重要。爲了服務的正常運作,我們必須確保Eureka客戶端的/heath端點在發送元數據的時候,是一個能夠被註冊中心訪問到的地址,否則服務註冊中心不會根據應用的健康檢查來更改狀態(僅當啓用了heathcheck功能時,以該端點信息作爲健康檢查標準)。而/info端點如果不正確的話,會導致Eureka面板中點擊服務實例時,我發訪問到服務實例提供的信息接口。

大多數情況下,我們並不需要修改這幾個URL的配置,但在一些特殊情況下,比如,爲應用設置了context-path,這時,所有spring-boot-actuator模塊的監控端點都會增加一個前綴。所以我們就需要做類似如下的配置,爲/info和/heath端點也加上類似的前綴信息:

management.context-path=/hello

eureka.instance.statusPageUrlPath=${management.context-path}/info

eureka.instance.healthCheckUrlPath=${management.context-path}/heath

另外,有時候爲了安全考慮,也可能會修改/info和/heath端點的原始路徑。這個時候,我們也需要做一些特殊的配置,比如像下面這樣:

endpoints.info.path=/appInfo

endpoints.heath.path=/checkHealth

eureka.instance.statusPageUrlPath=${endpoints.info.path}

eureka.instance.healthCheckUrlPath=${endpoints.heath.path}

在上面舉例的兩個示例中,我們使用了eureka.instance.statusPageUrlPath和eureka.instance.healthCheckUrlPath參數這兩個配置值有一個共同特點,它們都是用相對路徑來進行配置。由於Eureka的服務註冊中心默認會以HTTP的方式來訪問和暴露這些端點,因此當客戶端應用以HTTPS的方式來暴露服務和監控端點時,相對路徑的配置方式就無法滿足需求了。所以,Spring Cloud Eureka還提供了絕對路徑的配置參數,具體實例如下所示:

eureka.instance.statusPageUrl=https://${eureka.instance.hostname}/info

eureka.instance.healthCheckUrl=https://${eureka.instance.hostname}/heath

eureka.instance.homePageUrl=https://${eureka.instance.hostname}/

健康檢測

默認情況下,Eureka中各個服務實例的健康檢測並不是通過spring-boot-actuator模塊的/health端點來實現的,而是依靠客戶端心跳的方式來保持服務實例的存活。在Eureka的服務續約與服務剔除機制下,客戶端的健康狀態從註冊到註冊中心開始都會處於UP狀態,除非心跳終止一段時間之後,服務註冊中心將其剔除。默認的心跳的實現方式可以有效檢查客戶端進程是否正常運作,但卻無法保證客戶端應用能夠正常提供服務。由於大多數的應用與這些外部資源無法聯通的時候,實際上已經不能提供正常的對外服務了,但是因爲客戶端的心跳依然在運行,所以它還是會被服務消費者調用,而這樣的調用實際上並不能獲得預期的結果。

在Spring Cloud Eureka中,我們可以通過簡單的配置,把Eureka客戶端的健康檢測交給spring-boot-actouator模塊的/health端點,以實現更加全面的健康狀態維護。詳細的配置步驟如下所示:

  • 在pom.xml中引入spring-boot-starter-actuator模塊的依賴。
  • 在application.properties中增加參數配置eureka.client.healthcheck.enabled=true.
  • 如果客戶端的/health端點路徑做了一些特殊處理,請參考巧文介紹的端點配置時的方法進行配置,讓服務註冊中心可以正確訪問到健康檢測端點。

其他配置

除了上面介紹的配置參數外,下面整理了一些org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean中定義的配置參數以及對應的說明和默認值,這些參數均以eureka.instance爲前綴。

參數名 說明 默認值
preferIpAddress 是否優先使用IP地址作爲主機名的標識 false
leaseRenewalIntervalInSeconds Eureka客戶端向服務端發送心跳的時間間隔,單位爲秒 30
leaseExpirationDurationInSeconds Eureka服務端在收到最後一次心跳之後等待的時間上限,單位爲秒。超過該時間之後服務端會將該服務實例從服務清單中剔除,從而禁止服務調用請求被髮送到該實例上 90
nonSecurePort 非安全的通信端口號 80
securePort 安全的通信端口號 443
nonSecurePortEnabled 是否啓用非安全的通信端口號 true
securePortEnabled 是否啓用安全的通信端口號  
appname 服務名,默認取spring.application.name的配置值,如果沒有則爲unknown  
hostname 主機名,不配置的時候講根據操作系統的主機名來獲取

在上面的這些配置中,除了前三個配置參數在需要的時候可以做一些調整,其他的參數配置大多數情況下不需要進行配置,使用默認值即可。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章