本文為個(gè)人筆記,若要轉(zhuǎn)載,請注明作者。
1.元數(shù)據(jù)
org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 配置信息中有一大部分都是對服務(wù)實(shí)例元數(shù)據(jù)的配置。
元數(shù)據(jù)是什么?
元數(shù)據(jù)是:Eureka客戶端在向服務(wù)注冊中心發(fā)送注冊時(shí),用來描述自己服務(wù)信息的對象,包含了一些標(biāo)準(zhǔn)化的元數(shù)據(jù),比如服務(wù)名稱、是咧名稱、實(shí)例IP、實(shí)例端口等用于服務(wù)治理的重要信息;甚至有一些用于負(fù)載均衡策略或時(shí)其他用途自定義的元數(shù)據(jù)信息。
在使用 Spring Cloud Eureka 的時(shí)候,所有的配置信息都是通過 org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 進(jìn)行加載,但在真正服務(wù)注冊的時(shí)候會把數(shù)據(jù)存儲在 com.netflix.appinfo.InstanceInfo 對象發(fā)送給 Eureka 服務(wù)端。
這兩個(gè)類非常相似,我們可以通過查看 com.netflix.appinfo.InstanceInfo 類中的詳細(xì)定義來了解原生的 Eureka 對元數(shù)據(jù)的定義。其中,Map<String, String> metadata = new ConcurrentHashMap<String, String>()時(shí)自定義的元數(shù)據(jù)信息,其他變量則時(shí)標(biāo)準(zhǔn)化的元數(shù)據(jù)信息,也就是已經(jīng)界定好的數(shù)據(jù)信息。Spring Cloud 的 EurekaInstanceConfigBean 對原聲元數(shù)據(jù)對象做了一些配置優(yōu)化化處理。
我們可以通過eureka.instance.<properties>=<value>的格式對標(biāo)準(zhǔn)化元數(shù)據(jù)進(jìn)行配置,其中<properties>就是 EurekaInstanceConfigBean 對象中的成員變量。
若我們需要自定義元數(shù)據(jù),可以通過 eureka.instance.metadataMap.<key>=<value>的格式來進(jìn)行配置,例如:
eureka.instance.metadataMap.zone=yidongde130
下面我們針對一些常用的元數(shù)據(jù)配置做進(jìn)一步的介紹和說明。
1.1 實(shí)例名配置
實(shí)例名:就是 InstanceInfo 中的 instanceId 參數(shù), 它是區(qū)分同一服務(wù)中不同實(shí)例的唯一標(biāo)識。在 Netflix Eureka 的原生實(shí)現(xiàn)中,實(shí)例名采用主機(jī)名作為默認(rèn)值,這樣使得在同一主機(jī)中無法啟動多實(shí)例的情況。所以, Spring Cloud Eureka 對實(shí)例名的默認(rèn)命名做出了合理的擴(kuò)展。默認(rèn)規(guī)則如下:
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
對于實(shí)例名的命名股則,我們可以通過 eureka.instance.instanceId 參數(shù)來進(jìn)行配置。比如,在本地進(jìn)行客戶端負(fù)載均衡調(diào)試時(shí),需要啟動同一服務(wù)的多個(gè)實(shí)例,如果我們直接啟動一個(gè)應(yīng)用沒必然會產(chǎn)生端口沖突,雖然在命令行中制定不同的 server.port 來啟動,但是這種方式還是比較麻煩。那我們可以通過server.port=0 或者使用隨機(jī)數(shù) server.port=${random.int[10000,19999]} 來讓Tomcat 啟動的時(shí)候采用隨即端口。我們這個(gè)時(shí)候會發(fā)現(xiàn)注冊到 Eureka Server 的實(shí)例名都相同的,這會使得只有一個(gè)服務(wù)實(shí)力能夠正常提供服務(wù)。對于這個(gè)問題,我們可以同故宮設(shè)置實(shí)例名規(guī)則來輕松解決:
eureka.instance.instanceId=${spring.application.name}:${randmo.int}
通過以上的配置,利用應(yīng)用名加隨機(jī)數(shù)的方式來區(qū)分不同的實(shí)例,從而實(shí)現(xiàn)在同一主機(jī)上,不指定端口就能輕松啟動多個(gè)實(shí)例的效果。
1.2 端點(diǎn)配置
在 InstanceInfo 中,我們可以看到一些URL的配置信息,比如 homePageUrl、statusPageUrl、healthCheckUrl, 它們分別代表了應(yīng)用主頁的URL、狀態(tài)頁的URL、健康檢查的URL。其中,狀態(tài)頁和健康檢查頁的URL在Spring Cloud Eureka 中默認(rèn)使用了 spring-boot-actuator 模塊提供的/info端點(diǎn)和/health端點(diǎn)。雖然我們在之前的示例中并沒有對這些端點(diǎn)做具體的設(shè)置,但是實(shí)際上這些URL地址的配置非常重要。為了服務(wù)的正常運(yùn)作,我們必須確保Eureka客戶端的/health端點(diǎn)在發(fā)送元數(shù)據(jù)的時(shí)候,是一個(gè)能夠被注冊中心訪問到的地址,否則服務(wù)注冊中心不會根據(jù)應(yīng)用的健康檢查來更改狀態(tài)(僅當(dāng)開啟了healthcheck功能時(shí), 以該端點(diǎn)信息作為健康檢查標(biāo)準(zhǔn))。而/info端點(diǎn)如果不正確的話會導(dǎo)致在Eureka面板中單擊服務(wù)實(shí)例時(shí),無法訪問到服務(wù)實(shí)例提供的信息接口。