Eureka的服務注冊類配置
在實際使用Spring Cloud Eureka的過程中,我們所做的配置内容幾乎都是對Eureka用戶端配置進行操作,是以了解這部配置設定置内容,對于用好Eureka非常有用。
Eureka用戶端的配置主要分下面兩個方面。
服務注冊相關配置資訊,包括服務注冊中心的位址、服務擷取的間隔時間、可用區域等。
服務執行個體相關配置資訊,包括服務執行個體名稱、IP位址、端口号、健康檢查路徑等。
關于服務注冊的配置資訊,我們看看org.springframework.cloud.netflix.eureka.EurekaClientConfigBean的源碼可獲得比官方文檔更為詳盡的說明,這些配置内容都以Eureka.client為字首。
一 指定注冊中心
通過在配置檔案中配置eureka.client.serviceUrl參數來實作。
該參數定義如下,它的配置值存儲在HashMap類型中,并且設定了一組預設值,預設值的key為defaultZone、value為http://localhost:8761/eurek/
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 static final String DEFAULT_ZONE = "defaultZone";
當建構了高可用的服務注冊中心叢集時,我們可以為參數的value值配置多個注冊中心的位址(通過逗号分隔)。
比如下面例子:
eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/
另外,為了服務注冊中心的安全考慮,很多時候我們都會為服務注冊中心加入安全校驗。這個時候,在配置serviceUrl時,需要在value值的URL中加入相應的安全校驗資訊,比如:
eureka.client.serviceUrl.defaultZone=http://:<[email protected]:1111/eureka。其中為安全校驗資訊的使用者名,為該使用者的密碼。
二 其他配置
這些配置都是以eureka.client為字首。

Eureka服務執行個體類配置
關于服務執行個體類的配置資訊,可以通過檢視org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的源碼來擷取詳細内容,這些配置資訊都是以eureka.instance為字首,下面針對一些常用的配置資訊做一些詳細的說明。
一 中繼資料
在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的配置資訊中,有一大部分内容都是針對服務執行個體中繼資料的配置,那麼什麼是服務執行個體的中繼資料呢?它是Eureka用戶端向服務注冊中心發送請求時,用來描述自身服務資訊的對象,其中包含了一些标準的中繼資料;以及一些用于負載均衡政策或是其他用途的自定義中繼資料資訊。
在使用Spring Cloud Eureka的時候,所有的配置資訊都是通過org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean進行加載,但在真正進行服務注冊的時候,還是會包裝成com.netfilx.appinfo.Instanceinfo對象發送給Eureka服務端。這兩個類的定義非常相似,可以直接檢視com.netfilx.appinfo.Instanceinfo類中的詳細定義來了解原始Eureka對中繼資料的定義。
可以通過eureka.instance.=的格式對标準定義中繼資料直接進行配置,其中就是EurekaInstanceConfigBean對象中的成員變量名。而對于自定義的中繼資料,可以通過eureka.instance.metadataMap.=的格式進行配置,比如:
eureka.instance.metadataMap.zone=shanghai
二 執行個體名配置
執行個體名,即instanceInfo中的instanceId參數,它是區分同一執行個體的唯一辨別。在Netflix Eureka的原生實作中,執行個體名采用主機名作為預設值,這樣的設定使得同一主機上無法啟動多個相同的服務執行個體。但在Spring Cloud Eureka的配置中,針對同一主機中啟動多個執行個體的情況,對執行個體名的預設命名做了更為合理的擴充,它采用了如下預設的規則:
s p r i n g . c l o u d . c l i e n t . h o s t n a m e : {spring.cloud.client.hostname}: spring.cloud.client.hostname:{spring.application.name}:KaTeX parse error: Expected '}', got 'EOF' at end of input: …on.instance_id:{server.port}}
對于執行個體名的命名規則,我們可以通過eureka.instance.instanceId參數來進行配置。
比如在本地進行用戶端負載均衡調試時,需要啟動同一服務的多個執行個體,如果我們直接啟動同一個應用必然會産生端口沖突。雖然可以在指令行中指定不同的server.port來啟動,但是這樣還是比較麻煩。實際上,我們可以直接通過設定server.port=0或者使用随機數server.port=${random.int[10000,19999]}來讓Tomcat啟動時候采用随機端口。但是這個時候我們發現注冊到Eureka Serve的執行個體名都是相同的,這會使得隻有一個服務執行個體能夠正常提供服務。對于這個問題,我們就可以通過設定執行個體名規則來輕松解決:
eureka.instance.instanceId= s p r i n g . a p p l i c a t i o n . n a m e : {spring.application.name}: spring.application.name:{random.int}
通過上面的配置,利用應用名加随機數的方式來區分不同的執行個體,進而實作在同一主機上,不指定端口就能啟動多個執行個體的效果。
三 端點配置
在InstanceInfo中,可以看到一些URL的配置資訊,比如homePageUrl、statusPageUrl、healthCheckUrl。它們分别代表了應用首頁的URL、狀态頁的URL、健康檢查的URL。其中,狀态頁和監控檢查的URL在Spring Cloud Eureka中預設使用了spring-boot-actuator子產品提供的/info端點和/health端點。為了服務的正常運作,必須确認Eureka用戶端的/health端點在發送中繼資料的時候,是一個能夠被注冊中心通路的位址,否則服務注冊中心不會根據應用的健康狀态來更改狀态(僅當開啟了healthcheck功能時,以該端點資訊作為健康檢查标準)。而/info端點如果不正确的話,會導緻在Eureka面闆單擊服務執行個體時,無法通路到服務執行個體提供的資訊接口。
在一些特殊的情況下,比如,為應用設定了context-path,這時,所有spring-boot-actuator子產品的監控端點都會增加一個字首。是以,我們就需要做類似如下的配置,為/info和/health端點也加上類似的字首:
management.context-path=/hello
eureka.instance.statusPageUrlPath=${management.context-path}/info
eureka.instance.healthCheckUrlPath=${management.context-path}/health
另外,有時候為了安全考慮,也有可能會修改/info和/health端點的原始路徑。這個時候,我們也需要做一些特殊配置,例如:
endpoints.info.pah=/appinfo
endpoints.health.path=/cheakHealth
eureka.instance.statusPageUrlPath=/${endpoints.info.pah}
eureka.instance.healthCheckUrlPath=/${endpoints.health.path}
上面執行個體使用的是相對路徑。
由于Eureka的服務注冊中心預設會以HTTP的方式來通路和暴露這些端點,是以當用戶端應用以HTTPS的方式來暴露服務和監控端點時,相對路徑的配置方式就無法滿足要求了。是以,Spring Cloud Eureka還提供了絕對路徑的配置參數,例如:
eureka.instance.homePageUrl=https://${eureka.instance.homename}
eureka.instance.statusPageUrlPath=https://${eureka.instance.homename}/info
eureka.instance.healthCheckUrlPath=https://${eureka.instance.homename}/health
四 健康檢查
預設情況下,Eureka中各個服務執行個體的健康檢查并不是通過spring-boot-actuator子產品的/health端點來實作的,而是依靠用戶端心跳的方式保持服務執行個體的存活,在Eureka的服務續約與剔除機制下,用戶端的監控狀态從注冊到注冊中心開始都會處于UP狀态,除非心跳終止一段時間之後,服務注冊中心将其剔除。預設的心跳實作方式可以有效檢查用戶端程序是否正常運作,但卻無法保證用戶端應用能夠正常提供服務。由于大多數的應用都會有一些其他的外部資源依賴,比如資料庫。緩存、消息代理等,如果應用與這些外部資源無法聯通的時候,實際上已經不能提供正常的對外服務了,但此時心跳依然正常,是以它還是會被服務消費者調用,而這樣的調用實際上并不能獲得預期的結果。
在Spring Cloud Eureka中,我們可以通過簡單的配置,把Eureka用戶端的監控檢查交給spring-boot-actuator子產品的/health端點,以實作更加全面的健康狀态維護。
詳細步驟如下:
1 在pom.xml中加入spring-boot-starter-actuator子產品的依賴。
2 在application.properties中增加參數配置eureka.client.healthcheck.enabled=true
五 其他配置
這些配置均以eureka.instance為字首