微服務-服務註冊與發現

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

註冊中心:
接受服務提供者的註冊、存儲服務提供者的服務信息 ,好比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