5、Spring Cloud Eureka常用參數

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

參數名
說明
默認參數
enable
啓用Eureka客戶端
true
registryFetchIntervalSeconds
從Eureka服務端獲取註冊信息的間隔時間,單位爲秒
30
instanceInfoReplicationIntervalSeconds
更新實例信息的變化到Eureka服務端的間隔時間,單位爲秒
30
initialInstanceInfoReplicationIntervalSeconds
初始化實例信息到Eureka服務端的間隔時間,單位爲秒
40
eurekaServiceUrlPollIntervalSeconds
輪詢Eureka服務端地址更改的間隔時間,單位爲秒。當我們與SpringCloud Config配合,動態刷新Eureka 的 ServiceURL地址時需要關注該參數
300
eurekaServerReadTimeoutSeconds
讀取Eureka Server信息的超時時間,單位秒
8
eurekaServerConnectTimeoutSeconds
連接eureka Server的超時時間,單位爲秒
5
eurekaServerTotalConnections
從eureka客戶端到所有eureka服務端的連接總數(eureka客戶端允許所有eureka服務器連接的總數目
200
eurekaServerTotalConnectionsPerHost
從Eureka客戶端到每個Eureka服務端主機的連接總數
50
eurekaConnectionIdleTimeoutSeconds
Eureka服務端連接的空閒關閉時間,單位爲秒
30
HeartbeatExecutorThreadPoolSize
心跳連接池的初始化線程數
2
HeartbeatExecutorExponentialBackOffBound
心跳超時重試延遲時間的最大乘數值
10
cacheRefreshExecutorThreadPoolSize
緩存刷新線程池的初始化線程數
2
cacheRefreshExecutorExponentialBackOffBound
緩存刷新重試延遲時間的最大乘數值
10
useDnsForFetchingServiceUrls
使用DNS來獲取Eureka服務端的ServiceUrl
false
registerWhitEureka
是否要將自身的實例信息註冊到Eureka服務端
true
preferSameZoneEureka
是否偏好使用處於相同Zone的Eureka服務端
true
filterOnlyUpInstances
獲取實例時是否過濾,僅保留UP狀態的實例
true
fetchRegistry
是否從eureka服務端獲取註冊信息
true
region
設置地區
us-east-1
availability-zones
設置地帶(一個region可以有多個zone
defaultZone
service-url
設置eureka註冊連接
注意:我重新構建了一個Spring Cloud工程,具體代碼可以到:https://pan.baidu.com/s/1kWBeY8n 下載

二、服務實例類配置
關於服務實例類的配置,我們可以通過查看 org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean 的源碼獲取詳細內容,這些配置都是以 eureka.instance 爲前綴。下面我們針對一些常用配置信息做一些詳細的說明。
元數據:
org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean的配置信息中,有一大部分內容都是對服務實例元數據的配置,那麼什麼是元數據呢?他是eureka客戶端在向服務註冊中心發送註冊請求時,用來描述自身服務信息的對象,其中包含了一些標準化的元數據,比如:服務名、實例名、實例IP、實例端口等用於服務治理的重要信息。以及一些用於負載均衡策略或是其他特殊用途的自定義元數據信息。
在使用SpringCloud Eureka的時候,所有的配置信息都是通過org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean進行配置加載,但在真正進行服務註冊的時候,還是會包裝成com.netflix.appinfo.InstanceInfo對象發送給Eureka服務端。這兩個類的定義非常的相似,我們可以查看com.netflix.appinfo.InstanceInfo類來了解原生eureka對元數據的定義。其中private volatile Map<String, String> metadata = new ConcurrentHashMap<String, String>()(com.netflix.appinfo.InstanceInfo裏)是自定義的元數據信息,其他成員變量是標準化的元數據信息。Spring Cloud的EurekaInstanceConfigBean對原生數據對象做了一些配置優化處理,在後續中,我們會介紹!
通過eureka.instance.<properties>=<value>的格式對標準元數據直接進行配置,properties就是EurekaInstanceConfigBean對象中的成員變量名。而對於自定義元數據,可以通過 eureka.instance.metadataMap.<key>=<value>的格式來進行配置,比如(我們使用yml):


實例名配置:
實例名,即InstanceInfo中的InstanceId參數,他是區分同一個服務中不同實例的唯一標識。在Netflix Eureka的原生實現中,實例名採用主機名作爲默認值,這樣的設置無法使得在同一主機上啓動多個相同的服務實例。所以在Spring Cloud Eureka的配置中,針對同一主機啓動多個實例的情況,對實例名的默認命名做了更合理的擴展,他採用瞭如下默認規則:
${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
對於實例名的命名規則,我們可以通過 eureka.instance.instance-id 參數來進行配置。我們這裏配置的就是 IP:PORT


端點配置:
InstanceInfo中,我們可以看見一些URL的配置信息,比如homePageUrl,statusPageUrl、healthCheckUrl,他們分別代表了應用主頁的URL、狀態頁的URL、健康檢查的URL。其中狀態頁和健康檢查的URL在Spring Cloud Eureka中默認使用了spring-boot-actuator模塊提供的 /info 端點和 /health 端點。雖然我們之前並沒有對這些端點做具體的設置,但是實際上這些URL地址的配置非常重要。爲了服務的正常運作,我們必須確保Eureka客戶端的 /health 端點在發送元數據的時候,是一個能夠被註冊中心訪問到的地址,否則註冊中心不會根據應用的健康檢查來更改狀態(僅當開啓了 healthcheck 功能時,以該端點信息作爲健康檢查標準)。而 /info 端點如果不正確的話,會導致在Eureka面板中單擊服務實例時,無法訪問到服務提供的信息接口。
大多數情況下,我們並不需要修改這幾個URL的配置,但是在一些特殊情況下,比如爲應用設置了 context-path ,這時,所有的 spring-boot-actuator 模塊的監控端點都會增加一個前綴。所以,我們就需要做類似如下的配置,爲 /info 和 /health 端點也加上類型的前綴信息:

management.context-path 是 org.springframework.boot.actuate.autoconfigure.ManagementServerProperties 裏面的屬性
eureka.instance.status-page-url-path=${management.context-path}/info
eureka.instance.health-check-url-path=${management.context-path}/health
另外,有時候爲了安全考慮,也可能會修改 /info 和 /health 端點的原始路徑。這個時候,我們也需要一些特殊的配置:

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

健康檢查:
心跳機制的缺點
默認情況下,Eureka中各個服務實例的健康檢查並不是通過 spring-boot-actuator 模塊的 /health 端點來實現的,而是依靠客戶端心跳的方式來保持服務實例的存活。在Eureka的服務續約與剔除機制下,客戶端的健康狀態從註冊到註冊中心開始都會處於 UP 狀態,除非心跳終止一段時間之後,服務註冊中心將其剔除。默認的心跳實現方式可以有效檢查客戶端進程是否正常運作,但卻無法保證客戶端應用能夠正常提供服務。由於大多數微服務應用都會有一些其他的外部資源依賴,比如:數據庫、緩存、消息代理等,如果我們的應用無法與這些資源聯通的時候,實際上已經不能正常的提供服務了,但是客戶端的心跳依然在運行,所有他還是會被消費者調用,而這樣的調用實際上並不能獲得預期的結果。
解決方案
Spring Cloud Eureka中,我們可以通過簡單的配置,把Eureka客戶端的健康檢查交給 spring-boot-actuator 模塊的 /health 端點,以實現更加全面的健康維護。
詳細步驟如下:
  • Eureka Client pom.xml 中引入 spring-boot-starter-actuator 模塊的依賴。
  • 在 application.yml 或者 application.properties 中增加參數 eureka.client.healthcheck.enabled = true(注意:該配置IDE不會進行提示)
  • 如果客戶端的 /health 端點路徑做了一些特殊的處理,請參考前面介紹端點配置時的方法配置,讓服務註冊中心可以正確訪問到健康檢測端點。




注意:CQ 和 CY 是我們自定義的 Region 和 Zone,
http://${security.user.name}:${security.user.password}@localhost:${server.port}/eureka/ 如果不理解,請參考
4、Eureka詳解 那一章中的【註冊中心的安全機制】! 再次申明:eureka.client.healthcheck 屬性是沒有提示功能的

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

參數名
說明
默認值
preferIpAddress
是否優先使用IP地址作爲主機名的標識(等下我會解釋這個參數影響了什麼)
false
leaseRenewalIntervalInSeconds
Eureka客戶端向服務端發送心跳的時間間隔
30
leaseExpirationDurationInSeconds
Eureka 服務端在收到最後一次心跳之後等待的時間上限(就是下一次心跳的時間間隔),單位爲秒。超過該時間之後服務端會將該服務實例從服務清單中剔除,從而禁止服務消費者的請求發送到該實例上
90
nonSecurePort
非安全的通信端口號
80
nonSecurePortEnabled
是否開啓非安全的通信端口號
true
securePort
安全的通信端口號
443
securePortEnabled
是否啓用安全的通信端口號

appname
服務名,默認取 spring.application.name 的配置值,如果沒有則爲 unknown

hostname
主機名,不配置的時候將根據操作系統的主機名來獲取


在上面的配置中,一般我們只會關注前面3個配置選項,其他的參數使用默認值即可。nonSecurePortEnabled 和 securePortEnabled 我猜測應該是啓用 HTTP 或者 HTTPS 通信的配置,我未驗證,請讀者自行驗證!

以下摘抄於百度網:
註冊安全應用程序
如果您的應用程序想通過HTTPS聯繫,則可以分別在EurekaInstanceConfig,即 eureka.instance.[nonSecurePortEnabled,securePortEnabled]=[false,true] 中設置兩個標誌。這將使Eureka發佈實例信息顯示安全通信的明確偏好。Spring Cloud DiscoveryClient將始終爲以這種方式配置的服務返回一個https://…; URI,並且Eureka(本機)實例信息將具有安全的健康檢查URL。
由於Eureka內部的工作方式,它仍然會發布狀態和主頁的非安全網址,除非您也明確地覆蓋。您可以使用佔位符來配置eureka實例URL,例如
application.yml
eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/
(請注意,${eureka.hostname}是僅在稍後版本的Eureka中可用的本地佔位符,您也可以使用Spring佔位符實現同樣的功能,例如使用${eureka.instance.hostName}。
注意:如果您的應用程序在代理服務器後面運行,並且SSL終止服務在代理中(例如,如果您運行在Cloud Foundry或其他平臺作爲服務),則需要確保代理“轉發”頭部被截取並處理應用程序。Spring Boot應用程序中的嵌入式Tomcat容器會自動執行“X-Forwarded - *”標頭的顯式配置。你這個錯誤的一個跡象就是你的應用程序本身所呈現的鏈接是錯誤的(錯誤的主機,端口或協議)。





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