阿里架構師詳解設計模式,手把手講解服務註冊與發現,看完還不會?

java架構師丨蘇先生 發佈 2020-05-12T02:30:33+00:00

在Monolithic模式中,各個組件間通常通過函數形式調用。但在微服務架構中,每個微服務通常有多個實例,每個實例具有不同的位置,而且實例會動態變化,比如在負載發生變化時服務會進行擴容或縮容,或者某個實例所在的VM/Container故障後發生遷移,都會導致服務實例地址的變化。

在Monolithic模式中,各個組件間通常通過函數形式調用。但在微服務架構中,每個微服務通常有多個實例,每個實例具有不同的位置,而且實例會動態變化,比如在負載發生變化時服務會進行擴容或縮容,或者某個實例所在的VM/Container故障後發生遷移,都會導致服務實例地址的變化。因此使用微服務架構開發的應用,必須通過服務註冊和發現技術解決此問題。


微服務實例在scaling或故障時實例數發生變化

一、服務註冊

服務要被使用,就需要對外提供服務的位置信息,這個位置信息通常是一個IP位址+埠。在服務只有單個實例並且地址不會動態變化的情況下,服務的位置在使用端可以通過配置文件甚至代碼等方式固定死。但在位置信息會動態發生變化的情況下,服務實例就需要將這個地址註冊到一個註冊中心。

服務的所有實例在自己可以對外提供服務後,將位置註冊到一個ServiceRegistry服務。這個服務具有固定的位置或域名,負責保存所有服務實例的位置信息。

在使用ServiceRegistry時,服務實例要在無法提供服務時取消註冊。ServiceRegistry需要通過心跳等方式核查出無法提供服務的實例,並將實例自動取消註冊。

服務註冊有Self Registration和3rd Party Registration兩種方式。Self Registration需要由每個服務實例自己實現服務的註冊和取消註冊的代碼,3rd Party Registration則由第三方的Registrar完成服務的註冊和取消註冊。

ServiceRegistry通常會使用如etcd、zookeeper、consul等具備分布式一致性的key/value資料庫存儲服務的註冊信息,並提供服務實例的變更通知。

Self Registration

優點:

  • 服務實例能夠更好的掌握註冊時機,僅在真正可提供服務時才註冊到ServiceRegistry

缺點:

  • 所有服務都需要實現註冊和取消註冊代碼,實現複雜且與ServiceRegistry有耦合;
  • 服務的實例很容易在不能提供服務時忘記取消註冊;

3rd Party Registration

優點:

  • 服務實例不需要負責服務的註冊和取消註冊,實現簡單
  • 第三方的服務註冊機制通常會提供健康檢查機制判斷註冊的服務實例是否可用

缺點:

  • 第三方的軟體通常也需要進行部署和管理,增加了複雜度
  • 第三方的服務註冊機制通常無法了解服務實例的實際狀態

二、服務發現

客戶端要使用服務必須通過服務發現技術獲取服務的位置信息。服務發現包括Client-Side的服務發現和Server-Side的服務發現兩種方式。

在Client-Side Discovery的設計中,服務實例的發現由Client進行,發現的方式可以是主動到ServiceRegistry查詢,也可以由ServiceRegistry通知到Client。在使用Client-Side Discovery時,Client會發現服務的所有實例,並根據LB策略選擇一個實例發起請求。

Server-Side Discovery

在Server-Side Discovery設計中,在Client和所有的服務實例間增加LoadBalance,Client只需要訪問LoadBalance,由LoadBalance負責服務的發現和負載均衡。

方案對比

不論是Client-Side還是Server-Side的服務發現,執行發現的組件(Client/LoadBalance)通常都需要引入本地緩存,並通過核查保證與ServiceRegistry的一致性。引入緩存可以避免對ServiceRegistry的頻繁交互,能夠提升性能。

Client-Side Discovery相對於Server-Side Discovery有更少的跳數,性能更優。但所有類型的客戶端都需要實現服務發現與LB算法,客戶端的複雜度高,且與ServiceRegistry耦合。

Server-Side Discovery設計中,客戶端只需要看到LoadBalance,複雜度低;如果是基於公有雲提供服務,則公有雲提供商通常會提供現成的服務端LoadBalance。但相對Client-Side Discovery增加了一跳,對性能有一定影響;同時LoadBalance的開發、部署、運維帶來了額外的複雜度;

三、總結

在服務實例的位置會發生動態變化的微服務架構中,需要引入服務註冊和發現技術。

服務註冊和發現需要一個位置固定或提供了固定域名的ServiceRegistry服務,服務發布端通過Self-Registration或3rd Party Registration將所有的服務實例註冊到ServiceRegistry,Client或LoadBalance則通過其獲取服務實例的位置以執行負載均衡和發送服務請求。

ServiceRegistry和LoadBalance是系統中的關鍵服務,如果這兩個服務出現了異常,通常會導致系統不可用,因此它們必須具備極高的可用性。

推薦閱讀:

從阿里P7級學習筆記中,我掌握了Tomcat底層,21天漲薪5K,不可思議

三年後端開發:拿下阿里/騰訊/美團等四個大廠的Offer後,總結如下

金四銀五面試阿里/騰訊/美團後,總結了大廠39個java核心問點解析

面試字節跳動java崗被算法吊打,60天苦修這些筆記,僥倖收穫offer

五一後:阿里春招總結,當初按這個準備面試,可能已經P7了

太狠了!京東T8架構師建議吃透這40W字消息隊列文檔,漲薪15K不是夢

RocketMQ全貌解析,阿里不愧是阿里

關鍵字: