1. 程式人生 > >服務註冊和發現Eureka《五》

服務註冊和發現Eureka《五》

eureka 是一個微服務註冊和發現的元件。分為eureka server 和 eureka client 。eureka server 為eureka 服務註冊中心,eureka client 為eureka 客戶端。

eureka 是spring cloud 首推的服務註冊和發現元件,與spring cloud 其他元件無縫對接。eureka 和其他元件:負載均衡元件 ribbon,熔斷器hystrix,熔斷器監控元件hystrix dashboard 元件,熔斷器聚合監控turbine 元件,以及閘道器zuul 元件相互配合,能夠很容易實現服務註冊,負載均衡,熔斷和智慧路由等功能,這些元件都是由Netflix 公司開源的,一起被稱為Netflix oss 元件。

eureka 基本架構
register service 服務註冊中心,它是一個eureka server,提供服務註冊和發現的功能
provider service 服務提供者,它是一個eureka client ,提供服務
consumer service 服務消費者,它是一個eureka client ,消費服務

服務消費的基本過程:

1.搭建一個服務註冊中心eureka server

2.服務提供者eureka client 向服務註冊中心eureka server 註冊,將自己的資訊(服務名/ip)通過rest api 的形式提交給eureka server 。

3.服務消費者eureka client 向服務註冊中心eureka server 註冊,同時服務消費者獲取一份註冊列表的資訊,該列表包含了所有向服務註冊中心eureka server 註冊的服務資訊。

4.獲取服務註冊列表資訊之後,服務消費者就知道服務提供者的ip 地址,可以通過http 遠端排程來消費服務提供者的服務。

專案實戰:

1.利用maven 建立一個空專案

2.在主專案下建立模組,引入相關依賴。

3.如果報錯:K/V [說明依賴報錯],String ---Map 說明yml 檔案格式錯誤。

4.直到專案正常啟動。【專案啟動有先後順序,先啟動eureka server,再啟動eureka client ,不然報錯:找不到註冊中心】

 

原始碼解析Eureka
register:服務註冊: 當eureka client 向eureka server 註冊時,eureka client 提供自身的元資料:ip,埠,執行狀態的url ,主頁地址等。
Renew:服務續約: eureka client 預設情況下每30秒傳送一次心跳進行服務續約。通過服務續約告知eureka server 該eureka client 可用,未故障。正常情況下,如果eureka server 90秒內未收到eureka client 的心跳,eureka server 會將eureka client 例項從註冊列表中刪除【一般不建議更改服務續約時間哦】
Fetch Registries:獲取服務註冊列表資訊 eureka client 從eureka server 獲取服務登錄檔資訊,並將其快取到本地。eureka client會使用服務註冊列表資訊查詢其他服務的資訊,從而進行遠端呼叫。該註冊列表資訊定時(每30秒)更新一次,每次返回註冊列表資訊可能與eureka client 快取資訊不同,eureka client 會自己處理這些資訊。如果由於某些原因導致註冊列表資訊不能及時匹配,eureka client 會重新獲取整個登錄檔資訊。eureka server 快取了所有的服務註冊列表資訊,並將整個註冊列表資訊以及每個應用程式的資訊進行了壓縮,壓縮內容和未壓縮的內容完全相同。eureka client 和eureka server 可以使用json 和 xml 資料格式進行通訊,預設情況下,eureka client 使用json 的格式來獲取服務註冊列表的資訊。
cancel:服務下線 eureka client 再程式關閉時可以向eureka server 傳送下線請求。傳送請求後,該客戶端的例項資訊將從eureka server 的服務註冊列表中刪除。該下線請求不會自動完成,需要在程式關閉時呼叫以下程式碼:DiscoveryManager.getInstance().shutdownComponent();
eviction:服務剔除 預設情況下,如果eureka server 90秒內未收到eureka client 的心跳,eureka server 會將eureka client 例項從註冊列表中刪除。

register 服務註冊:

服務註冊,即eureka client 向eureka server 提交自己的服務資訊(ip,埠,serviceId)等,如果eureka client 在配置檔案中沒有配置serviceId ,則預設為配置檔案中國配置的服務名,即${spring.application.name}的值。

傳送心跳時間每30秒,剔除時間90秒,如果你真的需要更改,則在application.yml 加以下的配置:

eureka.instance.leaseRenewalIntervalInSeconds

eureka.instance.leaseExpirationDurationInSeconds

eureka 獲取服務例項慢的原因:
eureka client 的註冊延時 eureka client 啟動之後,不是立即向eureka server 註冊的,而是有一個延時向服務端註冊的時間,原始碼顯示,預設的延遲時間為40秒
eureka server的相應快取 eureka server維護每30秒更新一次相應快取,可通過更改配置eureka.server.responseCacheUpdateIntervalMs來修改。所以即使是剛剛註冊的例項,也不會立即出現在服務註冊列表中。
eureka client 的快取 eureka client 保留登錄檔資訊的快取,該快取每30秒更新一次,因此,eureka client 重新整理本地快取並發現其他新註冊的例項可能需要30秒
loadBalancer的快取 ribbon 的負載均衡從本地的eureka client 獲取服務註冊列表資訊。ribbon本身還維護了快取,以避免每個請求都需要哦才能夠eureka client 獲取服務註冊列表。

eureka 的自我保護模式:

當有一個新的eureka server 出現時,它嘗試從相鄰peer 節點獲取所有服務例項登錄檔資訊,如果從相鄰的 peer 節點獲取資訊時出現了故障,eureka server 會嘗試從其他 的peer 節點。如果eureka server 能夠成功獲取所有的服務例項資訊,則根據配置資訊設定服務續約的閾值。在任何時間,如果 eureka server 接收到的服務續約低於該值配置的百分比(預設為15分鐘內低於85%),則伺服器開啟自我保護模式,即不再剔除註冊列表的資訊。

eureka 的自我保護模式的好處是:如果eureka server 自身的網路問題而導致eureka client無法續約。eureka client 的 註冊列表資訊不再被刪除,即eureka client 還可以被其他服務消費。

預設情況下,eureka server 的自我模式是開啟的,如果需要關閉,則在配置檔案加以下程式碼:

eureka:

   server:

      enable-self-preservation:false

構建高可用的eureka server 叢集:

配置檔案中,定義了兩個profile 檔案,分別為peer1 和 peer2,它們的 hostname 分別為:peer1 和peer2.
在實際開發中,可能是具體的伺服器Ip 地址。
在本地搭建eureka server 叢集,需要修改本地的host 。windows 系統在C:\Windows\System32\drivers\etc\hosts 修改:

127.0.0.1 peer1
127.0.0.1 peer2

看成果:

專案打包,執行jar 包:

Java -jar xxx.jar --spring.profiles.active=peer1

java -jar xxx.jar --spring.profiles.active=peer2

啟動eureka client 

eureka client 指向的是peer1,peer2 也看到了。這就是註冊列表同步。

專案展示:https://download.csdn.net/download/qq_35781178/10778321

專案展示:https://github.com/waitforyouwtt/springcloud-five-.git