Eureka 的高級使用


基礎架構
Eureka架構中的三個核心角色:

服務注冊中心

Eureka的服務端應用,提供服務注冊和發現功能,就是剛剛我們建立的eureka-demo

服務提供者

提供服務的應用,可以是SpringBoot應用,也可以是其它任意技術實現,只要對外提供的是Rest風格服務即可。本例中就是我們實現的user-service-demo

服務消費者

消費應用從注冊中心獲取服務列表,從而得知每個服務方的信息,知道去哪里調用服務方。本例中就是我們實現的user-consumer-demo

高可用的Eureka service
Eureka Server即服務的注冊中心,在剛才的案例中,我們只有一個EurekaServer,事實上EurekaServer也可以是一個集群,形成高可用的Eureka中心。
服務同步

多個Eureka Server之間也會互相注冊為服務,當服務提供者注冊到Eureka Server集群中的某個節點時,該節點會把服務的信息同步給集群中的每個節點,從而實現數據同步。因此,無論客戶端訪問到Eureka Server集群中的任意一個節點,都可以獲取到完整的服務列表信息。

【解釋】只要Eureka集群搭建成功,你將服務提供方或者服務消費方注冊到任意的eureka節點中,集群中都會互相共享服務提供方信息和服務消費方信息**

動手搭建高可用的EurekaServer

我們假設要搭建兩條EurekaServer的集群,端口分別為:10086和10087

1)我們修改原來的EurekaServer配置:

 

server:
port: 10086 # 端口
spring:
application:
name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
client:
service-url: # 配置其他Eureka服務的地址,而不是自己,比如10087
defaultZone: http://127.0.0.1:10087/eureka

 

所謂的高可用注冊中心,其實就是把EurekaServer自己也作為一個服務進行注冊,這樣多個EurekaServer之間就能互相發現對方,從而形成集群。因此我們做了以下修改:

刪除了register-with-eureka=false和fetch-registry=false兩個配置。因為默認值是true,這樣就會把自己注冊到注冊中心了。
把service-url的值改成了另外一台EurekaServer的地址,而不是自己
2)另外一台配置恰好相反:

server: 
port: 10087 # 端口
spring: 
application: 
name: eureka-server # 應用名稱,會在Eureka中顯示
eureka: 
client: 
service-url: # 配置其他Eureka服務的地址,而不是自己,比如10087 
defaultZone: http://127.0.0.1:10086/eureka

 

注意:idea中一個應用不能啟動兩次,我們需要重新配置一個啟動器:

(配置的時候,可以設置啟動參數)
然后啟動即可。
3)啟動測試:

4)客戶端(user-service/user-consumer)注冊服務到集群
因為EurekaServer不止一個,因此注冊服務的時候,service-url參數需要變化:

eureka:
client:
service-url: # EurekaServer地址,多個地址以','隔開
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka

 

服務提供者
服務提供者要向EurekaServer注冊服務,並且完成服務續約等工作。

服務注冊

服務提供者在啟動時,會檢測配置屬性中的:eureka.client.register-with-erueka=true參數是否正確,事實上默認就是true。如果值確實為true,則會向EurekaServer發起一個Rest請求,並攜帶自己的元數據信息,Eureka Server會把這些信息保存到一個雙層Map結構中。第一層Map的Key就是服務名稱,第二層Map的key是服務的實例id。

服務續約
在注冊服務完成以后,服務提供者會維持一個心跳(定時向EurekaServer發起Rest請求),告訴EurekaServer:“我還活着”。這個過程我們稱為服務的續約(renew);
有兩個重要參數可以修改服務續約的行為:

eureka:
instance:
lease-expiration-duration-in-seconds: 90
lease-renewal-interval-in-seconds: 30

 

lease-renewal-interval-in-seconds:服務續約(renew)的間隔,默認為30秒
lease-expiration-duration-in-seconds:服務失效時間,默認值90秒
也就是說,默認情況下每隔30秒服務會向注冊中心發送一次心跳,證明自己還活着。如果超過90秒沒有發送心跳,EurekaServer就會認為該服務宕機,會從服務列表中移除,把它保護起來,暫時停止服務。

這兩個值在生產環境不要修改,默認即可。

但是在開發時,這個值有點太長了,經常我們關掉一個服務,會發現Eureka依然認為服務在活着。所以我們在開發階段可以適當調小。

eureka:
instance:
lease-expiration-duration-in-seconds: 2 # 2秒即過期
lease-renewal-interval-in-seconds: 1 # 1秒一次心跳

 

實例id

先來看一下服務狀態信息:

在Eureka監控頁面,查看服務注冊信息:

在status一列中,顯示以下信息:
•UP(1):代表現在是啟動了1個示例,沒有集群
•DESKTOP-2MVEC12:user-service:8081:是示例的名稱(instance-id),
–默認格式是:${hostname} + ${spring.application.name} + ${server.port}
–instance-id是區分同一服務的不同實例的唯一標准,因此不能重復。
我們可以通過instance-id屬性來修改它的構成:

eureka:
instance:
instance-id: ${spring.application.name}:${server.port}

 

重啟服務再試試看:


服務消費者
獲取服務列表

當服務消費者啟動時,會檢測eureka.client.fetch-registry=true參數的值,如果為true,則會從Eureka Server服務的列表只讀備份,然后緩存在本地。並且每隔30秒會重新獲取並更新數據。我們可以通過下面的參數來修改:

eureka:
client:
registry-fetch-interval-seconds: 5

 

生產環境中,我們不需要修改這個值。

但是為了在開發環境下,能夠快速得到服務的最新狀態,我們可以將其設置小一點。

失效剔除和自我保護
失效剔除

有些時候,我們的服務提供方並不一定會正常下線,可能因為內存溢出、網絡故障等原因導致服務無法正常工作。Eureka Server需要將這樣的服務剔除出服務列表。因此它會開啟一個定時任務,每隔60秒對所有失效的服務(超過90秒未響應)進行剔除。

可以通過eureka.server.eviction-interval-timer-in-ms參數對其進行修改,單位是毫秒,生成環境不要修改。

這個會對我們開發帶來極大的不便,你對服務重啟,隔了60秒Eureka才反應過來。開發階段可以適當調整,比如 5S

自我保護
我們關停一個服務,就會在Eureka面板看到一條警告:

這是觸發了Eureka的自我保護機制。當一個服務未按時進行心跳續約時,Eureka會統計最近15分鍾心跳失敗的服務實例的比例是否超過了85%。在生產環境下,因為網絡延遲等原因,心跳失敗實例的比例很有可能超標,但是此時就把服務剔除列表並不妥當,因為服務可能沒有宕機。Eureka就會把當前實例的注冊信息保護起來,不予剔除。生產環境下這很有效,保證了大多數服務依然可用。

但是這給我們的開發帶來了麻煩, 因此開發階段我們都會關閉自我保護模式:

在eureka的yml文件中配置

eureka: 
server: 
enable-self-preservation: false # 關閉自我保護模式(默認為打開) 
eviction-interval-timer-in-ms: 1000 # 掃描失效服務的間隔時間(缺省為60*1000ms)

 


注意點
1 eureka服務器停止之后,服務調用方和服務消費方會報錯,原因是啥?
答:當服務注冊到eureka之后,每隔30s需要向eureka注冊中心發送心跳(續約renew),表示我還活着,當90s內沒有發送心跳,表明eureka任務此服務暫時無法向外提供服務,就把它保護起來,然后在接下來的15分以內,eureka會不斷的請求這個服務,如果得到正常的響應,就把它叫出來,繼續提供服務,如果15分鍾以內,eureka還是收不到響應,那就把它移除服務列表

2 當停止eureka注冊中心之后,服務消費方還可以使用服務提供方嗎?
答:可以,因為有緩存

3 服務提供方/服務消費方 是何時去eureka注冊中心獲取其他服務的ip地址和端口號的?
答:結論:第一次啟動的30以內,去eureka注冊中心拉取其他服務緩存到本地

4 如果 停止eureka注冊中心之后,修改服務提供方的端口,此時服務調用方就無法請求服務
5 在不停止eureka注冊中心的情況下,如果修改服務提供方的端口,那此時服務調用方會收到響應嗎?
答: 需要等待幾分鍾,可以繼續提供新端口的服務

6、eureka中是以雙層map結構(嵌套map)保存服務信息
————————————————
版權聲明:本文為CSDN博主「YUER_ZYQ」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/YUER_ZYQ/article/details/84818505


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM