1.服務注冊與發現基礎架構

注冊中心:
接受服務提供者的注冊、存儲服務提供者的服務信息 ,比如ip 端口號 服務名這些信息;
並且與微服務保持心跳,如果心跳不能保持則注銷該實例。
所以注冊中心主要提供服務提供者信息的存儲,另外與服務提供者保持心跳以監控服務提供者的存活。
服務提供者:
向注冊中心提供服務信息,以及一些健康狀態。
服務消費者:
定期向注冊中心發送查詢請求,以獲取服務提供者的信息,獲取信息之后就向服務提供者發起服務調用。
當服務提供者向注冊中心 ,注冊或者注銷時,它可以接收到來自注冊中心的變更通知。通過變更通知,服務消費者可以實時獲得服務提供者的信息。
2.Eureka的簡介
Eureka分為Eureka server和Eureka client ,Eureka server可以部署在不同的區域當中,他們可以進行兩兩注冊,他們之間保持服務注冊表數據之間的同步,以達到數據的最終一致性。Eureka client嵌入到各個應用當中,服務提供者借助Eureka client實現注冊、續約、注銷的操作。
續約就是持續發送心跳。
服務消費者通過獲取服務的注冊信息,通過get register,來發起遠程調用。
有三點要注意:
1).Eureka server支持跨機房的高可用,不同區域的Eureka server可以同步注冊,同一區域也可以兩兩注冊來達到高可用。
2).Eureka server數據一致性的級別是最終一致性,它相比強一致性的區別在於,最終一致性會保證未來的某一時刻數據保持一致
3).Eureka client會對注冊表進行緩存,從而減輕了server的壓力,即使服務宕機也可以從緩存中獲取服務信息,這種方式進一步增強了Eureka的高可用
3.服務治理的機制
Eureka Server集群:
有兩個Eureka Server互相進行注冊,每個Eureka Server都有一個服務注冊表,是來自於服務提供者的一些實例信息。
evitTimer每隔一段時間都會掃描服務注冊表,去掃描所有的服務是否持續發送心跳,如果沒有持續發送心跳,就會從服務注冊表中移除服務。
自我保護的模式開關:當服務的存活實例低於默認的85%就會開啟自我保護開關,就會影響剔除任務,evictTimer就會停止服務,導致所有的服務不再進行注銷操作。
服務提供者:
向Eureka Serve提供三個操作:register/renew/cancel
register:在開啟服務的時候會將服務的實例信息同步給Eureka Server,EurekaServer.instance的信息,比如續約心跳的間隔時間和過期時間。
renew:定期發一個renew,也就是續約操作
cancel:服務關閉時會發送注銷操作
heartbeat:定時發送續約心跳
instanceReplicate:同步instance信息
服務消費者的服務注冊表包括Eureka Server所有的服務信息
服務注冊表會緩存,當Eureka Server不可用時,會取緩存當中的信息(同樣保證了高可用)
4.搭建一個Eureka服務架構的步驟
1)創建一個Eureka server(服務注冊中心)
2)創建服務提供者
3)創建服務消費者
接下來我們做一個Eureka自我保護歐式的實驗:
啟動注冊中心和和服務提供者,然后ctl+C,關閉服務

這時服務提供者會向注冊中心發送一個注銷的請求。

instance就會消失。
再次重啟用戶,執行kill -9 進程號 命令,強制關閉服務實例,這時不會觸發shutdown鈎子。
這時發現服務實例還在,說明注冊中心沒有及時發現服務實例已經下線,現在我們等待十秒中。
我們得出以下幾個結論:
1.當我們進程平滑停止時,服務會向注冊中心發送注銷請求, 服務注冊中心收到注銷請求后會將關聯的實例注冊狀態置位down
2.當我們執行kill -9的時候不會觸發注銷操作,這就模擬了斷電和進程突然退出的情況。
之前我們說過,服務注冊到Eureka Server之后,會維護一個心跳連接,告訴Eureka Server自己還活着。
Eureka在運行期間會統計心跳失敗的比例低於我們設定的閾值的時候,它將進入保護模式,而不注銷任何服務實例。
但是,在這段期間內實例若出現問題,那么客戶端很容易拿到實際已經不存在的服務實例,會出現調用失敗的情況,所以客戶端必須要有容錯機制,比如可以使用請求重試、斷路器等。
5.高可用的注冊中心
Eureka的服務治理設計中,所有的節點既是服務提供方,也是服務消費方,服務注冊中心也不例外。
Eureka Server的高可用實際上就是將自己所為服務向其他注冊中心注冊自己,這樣就可以形成一組相互注冊的服務注冊中心,以實現服務清單的互相同步,達到高可用的目的。
實現的方法就是配置兩個服務實例文件(在實際生產中開啟兩個項目,只是配置文件不同),——application-peer1.properties application-peer2.properties
server.port=8777 spring.application.name=eureka-server eureka.instance.hostname=peer1 #留存的服務實例低於多少比例進入保護模式,保護模式。服務提供者和服務注冊中心保持心跳,如果發現無法提供服務,就注銷該實例。 #當進入保護模式的情況下,注冊中心不會注銷服務,以兼容分區故障 eureka.server.renewal-percent-threshold=0.5 #是否開啟保護模式 eureka.server.enable-self-preservation=true #是否注冊eureka,高可用的清況下使用 eureka.client.register-with-eureka=true #是否啟用獲取服務注冊信息 eureka.client.fetch-registry=true #注冊和查詢都需要依賴該地址,多個以逗號分隔 eureka.client.serviceUrl.defaultZone=http://peer2:8666/eureka/
server.port=8666 spring.application.name=eureka-server eureka.instance.hostname=peer2 #留存的服務實例低於多少比例進入保護模式,保護模式。服務提供者和服務注冊中心保持心跳,如果發現無法提供服務,就注銷該實例。 #當進入保護模式的情況下,注冊中心不會注銷服務,以兼容分區故障 eureka.server.renewal-percent-threshold=0.5 #是否開啟保護模式 eureka.server.enable-self-preservation=true #是否注冊eureka,高可用的清況下使用 eureka.client.register-with-eureka=true #是否啟用獲取服務注冊信息 eureka.client.fetch-registry=true #注冊和查詢都需要依賴該地址,多個以逗號分隔 eureka.client.serviceUrl.defaultZone=http://peer1:8777/eureka/
6.Eureka的核心特性
1)通過相互注冊與復制支持高可用
2)支持用戶認證
3)支持注冊表緩存(容錯機制)
4)保護模式(解決網絡分區故障)
5)服務提供方上報健康檢查
6)支持Restful API
