1.服務註冊與發現基礎架構 註冊中心: 接受服務提供者的註冊、存儲服務提供者的服務信息 ,比如ip 埠號 服務名這些信息; 並且與微服務保持心跳,如果心跳不能保持則註銷該實例。 所以註冊中心主要提供服務提供者信息的存儲,另外與服務提供者保持心跳以監控服務提供者的存活。 服務提供者: 向註冊中心提供 ...
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/View Code
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/View Code
6.Eureka的核心特性 1)通過相互註冊與複製支持高可用 2)支持用戶認證 3)支持註冊表緩存(容錯機制) 4)保護模式(解決網路分區故障) 5)服務提供方上報健康檢查 6)支持Restful API