Spring cloud Eureka 專題

什麼是Spring Cloud Eureka?

Spring Cloud Eureka 模塊提供的功能是被動式的服務發現.

什麼是服務發現?

服務發現就像聊天室一個,每個用戶來的時候去服務器上註冊,這樣他的好友們就能看到你,你同時也將獲取好友的上線列表.

大家先看下Eureka的一個圖例:

Spring cloud Eureka 專題

這邊有兩個應用分別是order service與customer service都註冊到Eureka,customer service在生產是由若干個部署實例(節點)構成的,對於order service來說只要知道customer這個服務名稱就可以拉取到註冊在上面的實例信息,那麼在客戶端如果使用Feign或者RestTemplate調用的時候你只要關心serviceId就行了(客戶端fegin與restTemplate默認集成的Ribbon組件),在下面會提到相關配置。

這邊按照上面的host: eureka-a,eureka-b,eureka-c

application.yml配置如下:

# java -jar eureka-server.jar -Dspring.profiles.active=primary,java -jar eureka-server.jar -Dspring.profiles.active=secondary,java -jar eureka-server.jar -Dspring.profiles.active=tertiary
---
spring:
application:
name: eureka-server-clustered
#redis:
# host: 192.168.2.28
#port: 6379
session:
store-type: hash-map
profiles: primary
server:
port: 8671
eureka:
instance:
hostname: eureka-a
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://superuser:HukIl20209293923@eureka-b:8672/eureka/,http://superuser:HukIl20209293923@eureka-c:8673/eureka/
---
spring:
application:
name: eureka-server-clustered
profiles: secondary
session:
store-type: hash-map
server:
port: 8672

eureka:
instance:
hostname: eureka-b
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://superuser:HukIl20209293923@eureka-c:8673/eureka/,http://superuser:HukIl20209293923@eureka-a:8671/eureka/
---
spring:
application:
name: eureka-server-clustered
profiles: tertiary
session:
store-type: hash-map
server:
port: 8673
eureka:
instance:
hostname: eureka-c
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://superuser:HukIl20209293923@eureka-a:8671/eureka/,http://superuser:HukIl20209293923@eureka-b:8672/eureka/
---
eureka:
server:
enable-self-preservation: true # 自我保護模式(缺省為打開,建議開啟)
eviction-interval-timer-in-ms: 5000 # 續期時間,即掃描失效服務的間隔時間(缺省為60*1000ms)
security:
basic:
enabled: true
path:
- /autoconfig
- /beans
- /configprops
- /dump
- /env
- /health
- /info
- /metrics
- /mappings
- /trace
- /
# 啟用http basic認證

user:
name: superuser
password: HukIl20209293923

三個應用分別啟動

java -jar eureka-server.jar -Dspring.profiles.active=primary
java -jar eureka-server.jar -Dspring.profiles.active=secondary
java -jar eureka-server.jar -Dspring.profiles.active=tertiary

就可以看到下面的界面

Spring cloud Eureka 專題

Eureka客戶端配置

eureka: 
client:
service-url:
defaultZone: http://superuser:HukIl20209293923@eureka-a:8673/eureka/,http://superuser:HukIl20209293923@eureka-b:8671/eureka/,http://superuser:HukIl20209293923@eureka-c:8673/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port} # 根據ip:port定義為實例名稱
prefer-ip-address: true #默認是使用hostname

客戶端參數詳細說明(可以從EurekaClientConfigBean類找到相關定義):

1、RegistryFetchIntervalSeconds

從eureka服務器註冊表中獲取註冊信息的時間間隔(s),默認為30秒

2、InstanceInfoReplicationIntervalSeconds

複製實例變化信息到eureka服務器所需要的時間間隔(s),默認為30秒

3、InitialInstanceInfoReplicationIntervalSeconds

最初複製實例信息到eureka服務器所需的時間(s),默認為40秒

4、EurekaServiceUrlPollIntervalSeconds

詢問Eureka服務url信息變化的時間間隔(s),默認為300秒

5、ProxyHost

獲取eureka服務的代理主機,默認為null

6、ProxyProxyPort

獲取eureka服務的代理端口, 默認為null

7、ProxyUserName

獲取eureka服務的代理用戶名,默認為null

8、ProxyPassword

獲取eureka服務的代理密碼,默認為null

9、GZipContent

eureka註冊表的內容是否被壓縮,默認為true,並且是在最好的網絡流量下被壓縮

10、EurekaServerReadTimeoutSeconds

eureka需要超時讀取之前需要等待的時間,默認為8秒

11、EurekaServerConnectTimeoutSeconds

eureka需要超時連接之前需要等待的時間,默認為5秒

12、BackupRegistryImpl

獲取實現了eureka客戶端在第一次啟動時讀取註冊表的信息作為回退選項的實現名稱

13、EurekaServerTotalConnections

eureka客戶端允許所有eureka服務器連接的總數目,默認是200

14、EurekaServerTotalConnectionsPerHost

eureka客戶端允許eureka服務器主機連接的總數目,默認是50

15、EurekaServerURLContext

表示eureka註冊中心的路徑,如果配置為eureka,則為http://x.x.x.x:x/eureka/,在eureka的配置文件中加入此配置表示eureka作為客戶端向註冊中心註冊,從而構成eureka集群。此配置只有在eureka服務器ip地址列表是在DNS中才會用到,默認為null

16、EurekaServerPort

獲取eureka服務器的端口,此配置只有在eureka服務器ip地址列表是在DNS中才會用到。默認為null

17、EurekaServerDNSName

獲取要查詢的DNS名稱來獲得eureka服務器,此配置只有在eureka服務器ip地址列表是在DNS中才會用到。默認為null

18、UseDnsForFetchingServiceUrls

eureka客戶端是否應該使用DNS機制來獲取eureka服務器的地址列表,默認為false

19、RegisterWithEureka

實例是否在eureka服務器上註冊自己的信息以供其他服務發現,默認為true

20、PreferSameZoneEureka

實例是否使用同一zone裡的eureka服務器,默認為true,理想狀態下,eureka客戶端與服務端是在同一zone下

21、AllowRedirects

服務器是否能夠重定向客戶端請求到備份服務器。 如果設置為false,服務器將直接處理請求,如果設置為true,它可能發送HTTP重定向到客戶端。默認為false

22、LogDeltaDiff

是否記錄eureka服務器和客戶端之間在註冊表的信息方面的差異,默認為false

23、DisableDelta(*)

默認為false

24、fetchRegistryForRemoteRegions

eureka服務註冊表信息裡的以逗號隔開的地區名單,如果不這樣返回這些地區名單,則客戶端啟動將會出錯。默認為null

25、Region

獲取實例所在的地區。默認為us-east-1

26、AvailabilityZones

獲取實例所在的地區下可用性的區域列表,用逗號隔開。

27、EurekaServerServiceUrls

Eureka服務器的連接,默認為http://XXXX:X/eureka/,但是如果採用DNS方式獲取服務地址,則不需要配置此設置。

28、FilterOnlyUpInstances(*)

是否獲得處於開啟狀態的實例的應用程序過濾之後的應用程序。默認為true

29、EurekaConnectionIdleTimeoutSeconds

Eureka服務的http請求關閉之前其響應的時間,默認為30 秒

30、FetchRegistry

此客戶端是否獲取eureka服務器註冊表上的註冊信息,默認為true

31、RegistryRefreshSingleVipAddress

此客戶端只對一個單一的VIP註冊表的信息感興趣。默認為null

32、HeartbeatExecutorThreadPoolSize(*)

心跳執行程序線程池的大小,默認為5

33、HeartbeatExecutorExponentialBackOffBound(*)

心跳執行程序回退相關的屬性,是重試延遲的最大倍數值,默認為10

34、CacheRefreshExecutorThreadPoolSize(*)

執行程序緩存刷新線程池的大小,默認為5

35、CacheRefreshExecutorExponentialBackOffBound

執行程序指數回退刷新的相關屬性,是重試延遲的最大倍數值,默認為10

36、DollarReplacement

eureka服務器序列化/反序列化的信息中獲取“$”符號的的替換字符串。默認為“_-”

37、EscapeCharReplacement

eureka服務器序列化/反序列化的信息中獲取“_”符號的的替換字符串。默認為“__”

38、OnDemandUpdateStatusChange(*)

如果設置為true,客戶端的狀態更新將會點播更新到遠程服務器上,默認為true

39、EncoderName

這是一個短暫的編碼器的配置,如果最新的編碼器是穩定的,則可以去除,默認為null

40、DecoderName

這是一個短暫的解碼器的配置,如果最新的解碼器是穩定的,則可以去除,默認為null

41、ClientDataAccept(*)

客戶端數據接收

42、Experimental(*)

當嘗試新功能遷移過程時,為了避免配置API汙染,相應的配置即可投入實驗配置部分,默認為null

Eureka服務端配置

1、AWSAccessId

獲取aws訪問的id,主要用於彈性ip綁定,此配置是用於aws上的,默認為null

2、AWSSecretKey

獲取aws私有秘鑰,主要用於彈性ip綁定,此配置是用於aws上的,默認為null

3、EIPBindRebindRetries

獲取服務器嘗試綁定到候選的EIP的次數,默認為3

4、EIPBindingRetryIntervalMsWhenUnbound(*)

服務器檢查ip綁定的時間間隔,單位為毫秒,默認為1 * 60 * 1000

5、EIPBindingRetryIntervalMs

與上面的是同一作用,僅僅是穩定狀態檢查,默認為5 * 60 * 1000

6、EnableSelfPreservation

自我保護模式,當出現出現網絡分區、eureka在短時間內丟失過多客戶端時,會進入自我保護模式,即一個服務長時間沒有發送心跳,eureka也不會將其刪除,默認為true

7、RenewalPercentThreshold(*)

閾值因子,默認是0.85,如果閾值比最小值大,則自我保護模式開啟

8、RenewalThresholdUpdateIntervalMs

閾值更新的時間間隔,單位為毫秒,默認為15 * 60 * 1000

9、PeerEurekaNodesUpdateIntervalMs(*)

集群裡eureka節點的變化信息更新的時間間隔,單位為毫秒,默認為10 * 60 * 1000

10、EnableReplicatedRequestCompression

複製的數據在發送請求時是否被壓縮,默認為false

11、NumberOfReplicationRetries

獲取集群裡服務器嘗試複製數據的次數,默認為5

12、PeerEurekaStatusRefreshTimeIntervalMs

服務器節點的狀態信息被更新的時間間隔,單位為毫秒,默認為30 * 1000

13、WaitTimeInMsWhenSyncEmpty(*)

在Eureka服務器獲取不到集群裡對等服務器上的實例時,需要等待的時間,單位為毫秒,默認為1000 * 60 * 5

14、PeerNodeConnectTimeoutMs

連接對等節點服務器複製的超時的時間,單位為毫秒,默認為200

15、PeerNodeReadTimeoutMs

讀取對等節點服務器複製的超時的時間,單位為毫秒,默認為200

16、PeerNodeTotalConnections

獲取對等節點上http連接的總數,默認為1000

17、PeerNodeTotalConnectionsPerHost(*)

獲取特定的對等節點上http連接的總數,默認為500

18、PeerNodeConnectionIdleTimeoutSeconds(*)

http連接被清理之後服務器的空閒時間,默認為30秒

19、RetentionTimeInMSInDeltaQueue(*)

客戶端保持增量信息緩存的時間,從而保證不會丟失這些信息,單位為毫秒,默認為3 * 60 * 1000

20、DeltaRetentionTimerIntervalInMs

清理任務程序被喚醒的時間間隔,清理過期的增量信息,單位為毫秒,默認為30 * 1000

21、EvictionIntervalTimerInMs

過期實例應該啟動並運行的時間間隔,單位為毫秒,默認為60 * 1000

22、ASGQueryTimeoutMs(*)

查詢AWS上ASG(自動縮放組)信息的超時值,單位為毫秒,默認為300

23、ASGUpdateIntervalMs

從AWS上更新ASG信息的時間間隔,單位為毫秒,默認為5 * 60 * 1000

24、ASGCacheExpiryTimeoutMs(*)

緩存ASG信息的到期時間,單位為毫秒,默認為10 * 60 * 1000

25、ResponseCacheAutoExpirationInSeconds(*)

當註冊表信息被改變時,則其被保存在緩存中不失效的時間,默認為180秒

26、ResponseCacheUpdateIntervalMs(*)

客戶端的有效負載緩存應該更新的時間間隔,默認為30 * 1000毫秒

27、UseReadOnlyResponseCache(*)

目前採用的是二級緩存策略,一個是讀寫高速緩存過期策略,另一個沒有過期只有只讀緩存,默認為true,表示只讀緩存

28、DisableDelta(*)

增量信息是否可以提供給客戶端看,默認為false

29、MaxIdleThreadInMinutesAgeForStatusReplication(*)

狀態複製線程可以保持存活的空閒時間,默認為10分鐘

30、MinThreadsForStatusReplication

被用於狀態複製的線程的最小數目,默認為1

31、MaxThreadsForStatusReplication

被用於狀態複製的線程的最大數目,默認為1

32、MaxElementsInStatusReplicationPool

可允許的狀態複製池備份複製事件的最大數量,默認為10000

33、SyncWhenTimestampDiffers

當時間變化實例是否跟著同步,默認為true

34、RegistrySyncRetries

當eureka服務器啟動時嘗試去獲取集群裡其他服務器上的註冊信息的次數,默認為5

35、RegistrySyncRetryWaitMs

當eureka服務器啟動時獲取其他服務器的註冊信息失敗時,會再次嘗試獲取,期間需要等待的時間,默認為30 * 1000毫秒

36、MaxElementsInPeerReplicationPool(*)

複製池備份複製事件的最大數量,默認為10000

37、MaxIdleThreadAgeInMinutesForPeerReplication(*)

複製線程可以保持存活的空閒時間,默認為15分鐘

38、MinThreadsForPeerReplication(*)

獲取將被用於複製線程的最小數目,默認為5

39、MaxThreadsForPeerReplication

獲取將被用於複製線程的最大數目,默認為20

40、MaxTimeForReplication(*)

嘗試在丟棄複製事件之前進行復制的時間,默認為30000毫秒

41、PrimeAwsReplicaConnections(*)

對集群中服務器節點的連接是否應該準備,默認為true

42、DisableDeltaForRemoteRegions(*)

增量信息是否可以提供給客戶端或一些遠程地區,默認為false

43、RemoteRegionConnectTimeoutMs(*)

連接到對等遠程地eureka節點的超時時間,默認為1000毫秒

44、RemoteRegionReadTimeoutMs(*)

獲取從遠程地區eureka節點讀取信息的超時時間,默認為1000毫秒

45、RemoteRegionTotalConnections

獲取遠程地區對等節點上http連接的總數,默認為1000

46、RemoteRegionTotalConnectionsPerHost

獲取遠程地區特定的對等節點上http連接的總數,默認為500

47、RemoteRegionConnectionIdleTimeoutSeconds

http連接被清理之後遠程地區服務器的空閒時間,默認為30秒

48、GZipContentFromRemoteRegion(*)

eureka服務器中獲取的內容是否在遠程地區被壓縮,默認為true

49、RemoteRegionUrlsWithName

針對遠程地區發現的網址域名的map

50、RemoteRegionUrls

遠程地區的URL列表

51、RemoteRegionAppWhitelist(*)

必須通過遠程區域中檢索的應用程序的列表

52、RemoteRegionRegistryFetchInterval

從遠程區域取出該註冊表的信息的時間間隔,默認為30秒

53、RemoteRegionFetchThreadPoolSize

用於執行遠程區域註冊表請求的線程池的大小,默認為20

54、RemoteRegionTrustStore

用來合格請求遠程區域註冊表的信任存儲文件,默認為空

55、RemoteRegionTrustStorePassword

獲取偏遠地區信任存儲文件的密碼,默認為“changeit”

56、disableTransparentFallbackToOtherRegion(*)

如果在遠程區域本地沒有實例運行,對於應用程序回退的舊行為是否被禁用, 默認為false

57、BatchReplication(*)

表示集群節點之間的複製是否為了網絡效率而進行批處理,默認為false

58、LogIdentityHeaders(*)

Eureka服務器是否應該登錄clientAuthHeaders,默認為true

59、RateLimiterEnabled

限流是否應啟用或禁用,默認為false

60、RateLimiterThrottleStandardClients

是否對標準客戶端進行限流,默認false

61、RateLimiterPrivilegedClients(*)

認證的客戶端列表,這裡是除了標準的eureka Java客戶端。

62、RateLimiterBurstSize(*)

速率限制的burst size ,默認為10,這裡用的是令牌桶算法

63、RateLimiterRegistryFetchAverageRate(*)

速率限制器用的是令牌桶算法,此配置指定平均執行註冊請求速率,默認為500

64、RateLimiterFullFetchAverageRate(*)

速率限制器用的是令牌桶算法,此配置指定平均執行請求速率,默認為100

65、ListAutoScalingGroupsRoleName(*)

用來描述從AWS第三賬戶的自動縮放組中的角色名稱,默認為“ListAutoScalingGroups”

66、JsonCodecName(*)

如果沒有設置默認的編解碼器將使用全JSON編解碼器,獲取的是編碼器的類名稱

67、XmlCodecName(*)

如果沒有設置默認的編解碼器將使用xml編解碼器,獲取的是編碼器的類名稱

68、BindingStrategy(*)

獲取配置綁定EIP或Route53的策略。

69、Route53DomainTTL(*)

用於建立route53域的ttl,默認為301

70、Route53BindRebindRetries(*)

服務器嘗試綁定到候選Route53域的次數,默認為3

71、Route53BindingRetryIntervalMs(*)

服務器應該檢查是否和Route53域綁定的時間間隔,默認為5 * 60 * 1000毫秒

72、Experimental(*)

當嘗試新功能遷移過程時,為了避免配置API汙染,相應的配置即可投入實驗配置部分,默認為null

以上是Eureka配置項的詳細說明,分為Eureka客戶端配置、Eureka服務端配置和微服務端配置,一共100多項,其中有很多配置參數並不需要我們去修改,使用默認的就好,有些跟我們業務相關的配置參數可根據需要自行設置。

Eureka 提供了我們管理應用restful接口,大家可以在https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

Spring cloud Eureka 專題

上面需要注意的是'v2'這個不要放置進去,否則是404錯誤,這個可能是spring cloud這邊有調整過。

http://ip:{port:8761}/eureka/apps 查看所有的應用meta信息

也可以通過http://ip:{port:8761}/eureka/apps/{application_name} 查看具體的應用信息

使得member-service實例192.168.1.41:8090下線那麼可以使用下面的接口

curl -X PUT -i -u superuser:HukIl20209293923 curl -X PUT -i -u mbkj:mbkj http://192.168.2.181:8761/eureka/apps/member-service/192.168.100.131:8080/status?value=OUT_OF_SERVICE

上線

curl -X PUT -i -u superuser:HukIl20209293923 http://192.168.2.181:8761/eureka/apps/order-service/192.168.1.41:8090/status?value=UP

Spring cloud Eureka 專題

Spring cloud Eureka 專題

那麼就看到了該節點下線,我們在status?value=UP就上線。這個我們可以集群中節點更新過程中應用需要啟停,可以用這種方式會更友好。如果結合API網關zuul那麼還要等30秒才能使得zuul從eureka獲取上游節點的狀態變化,我們後面的章節會講到灰度發佈到時候會具體用到。

eureka是為服務發現而生在,當然可選的服務發現的開源工具還有zookeeper,consul ,Etcd等但是這些在使用體驗上如部署,可管理,二次開發上成本偏高;所以spring cloud 首選的服務發現是eureka.

這邊有不清楚的非常歡迎大家留言討論


分享到:


相關文章: