掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
[[322354]]

問題緣由
單機(jī)時代,傳統(tǒng)軟件大多是單體/巨石架構(gòu)(Monolithic)。大家往一個代碼倉庫提交CODE,這會導(dǎo)致應(yīng)用膨脹,難以理解和修改,以及擴(kuò)展受限,無法按需伸縮等諸多問題。單體架構(gòu)怎么解決多人合作的問題?模塊化,對,按功能拆分,模塊之間定義編程接口(API),彼此關(guān)心功能而不關(guān)心實(shí)現(xiàn)。
隨著時代發(fā)展,單機(jī)程序遇到了計(jì)算力和存儲的雙重瓶頸,分布式架構(gòu)應(yīng)運(yùn)而生。單體應(yīng)用通過函數(shù)名(標(biāo)識)便可輕松完成本地函數(shù)調(diào)用,在分布式系統(tǒng)中,服務(wù)(RPC/RESTful API)承擔(dān)了類似的角色,但請求服務(wù)單靠服務(wù)名還不夠,服務(wù)名只是服務(wù)能力(服務(wù)類型)的標(biāo)識,還需要指示服務(wù)位于網(wǎng)絡(luò)何處,而部署在云中的服務(wù)實(shí)例IP是動態(tài)分配的,擴(kuò)縮容、失敗和更新則讓問題變得更加復(fù)雜,靜態(tài)配置服務(wù)實(shí)例適應(yīng)不了新變化,需要更精細(xì)化的服務(wù)治理能力,為了解決或者說簡化這個問題,服務(wù)發(fā)現(xiàn)作為一種基礎(chǔ)能力被抽象和提供,它試圖讓請求網(wǎng)絡(luò)服務(wù)像調(diào)用本地函數(shù)一樣簡單透明。
服務(wù)即功能(函數(shù))。只是服務(wù)跟網(wǎng)絡(luò)緊密聯(lián)系在一起,所有才會出現(xiàn)網(wǎng)絡(luò)服務(wù)這個名詞,服務(wù)提供者通過網(wǎng)絡(luò)發(fā)布服務(wù),服務(wù)使用者通過網(wǎng)絡(luò)請求服務(wù),分布式系統(tǒng)突破了單機(jī)算力和存儲的限制,提升了系統(tǒng)穩(wěn)定性,使得高并發(fā)高可用的海量服務(wù)成為可能,但這也增加了軟件復(fù)雜度,引入軟件分層、負(fù)載均衡、微服務(wù)、服務(wù)發(fā)現(xiàn)/治理、分布式一致性等新的問題和挑戰(zhàn)。
服務(wù)發(fā)現(xiàn)
服務(wù)分服務(wù)提供者(Service Provider)和服務(wù)消費(fèi)者(Service Consumer),如果要提供海量服務(wù)能力,單一的服務(wù)實(shí)例顯然是不夠的,如果要提供成千上萬種服務(wù),則需要有一個地方記錄服務(wù)名到服務(wù)實(shí)例列表的映射,所以,有必要引入一個新的角色:服務(wù)中介,服務(wù)中介維護(hù)一個服務(wù)注冊表(Service Registry),可以把注冊表理解為服務(wù)字典,key是服務(wù)名,value是服務(wù)提供實(shí)例列表;服務(wù)注冊表是聯(lián)系服務(wù)提供者和服務(wù)消費(fèi)者的橋梁,它維護(hù)服務(wù)提供者的最新網(wǎng)絡(luò)位置等信息,也是服務(wù)發(fā)現(xiàn)最核心的部分。
服務(wù)啟動的時候,把服務(wù)信息注冊(put)到服務(wù)注冊表;服務(wù)終止的時候,從服務(wù)注冊表刪除(remove)自身的服務(wù)信息。
服務(wù)消費(fèi)者在請求服務(wù)的時候,先去服務(wù)注冊表按名查詢(get)服務(wù)提供者列表,然后從列表里挑選一個服務(wù)實(shí)例,向該實(shí)例請求服務(wù)。
大道至簡,這便是最簡單的服務(wù)發(fā)現(xiàn)模型,也是服務(wù)發(fā)現(xiàn)的基本原理,至此,似乎一切都OK,但其實(shí)尚有幾個問題沒有說清楚。
問題和解法
服務(wù)發(fā)現(xiàn)模式
服務(wù)發(fā)現(xiàn)主要有兩種模式:客戶端發(fā)現(xiàn)模式(client-side discovery)和服務(wù)端發(fā)現(xiàn)模式(server-side discovery)。
客戶端發(fā)現(xiàn)模式
客戶端負(fù)責(zé)查詢服務(wù)實(shí)例列表并決定向哪個實(shí)例請求服務(wù),也就是負(fù)載均衡策略在客戶端實(shí)現(xiàn)。該模式包括注冊和發(fā)現(xiàn)兩個部分。
服務(wù)實(shí)例調(diào)用服務(wù)中介的注冊接口進(jìn)行實(shí)例注冊,服務(wù)實(shí)例通過keepalive做服務(wù)續(xù)期,服務(wù)中介通過健康檢查剔除不可用的服務(wù)實(shí)例。
服務(wù)消費(fèi)者請求服務(wù)的時候,先向服務(wù)注冊表查詢服務(wù)實(shí)例列表,注冊表是一個服務(wù)數(shù)據(jù)庫,為了提升性能和可靠性,客戶端通常會緩存服務(wù)列表(緩存用來確保注冊表掛了之后還能繼續(xù)工作),拿到實(shí)例列表后客戶端基于負(fù)載均衡策略挑選一個實(shí)例發(fā)送服務(wù)請求。
優(yōu)點(diǎn)
缺點(diǎn)
服務(wù)端發(fā)現(xiàn)模式
發(fā)現(xiàn):服務(wù)消費(fèi)者通過負(fù)載均衡器發(fā)送服務(wù)請求,負(fù)載均衡器會查詢服務(wù)注冊表,挑選一個服務(wù)實(shí)例,并將請求轉(zhuǎn)發(fā)到服務(wù)實(shí)例。
注冊:服務(wù)注冊/注銷可以跟上述客戶端發(fā)現(xiàn)模式一致,也可以通過部署平臺的內(nèi)置服務(wù)注冊和發(fā)現(xiàn)機(jī)制完成,即容器化部署平臺(docker/k8s)能主動發(fā)現(xiàn)服務(wù)實(shí)例并幫助服務(wù)實(shí)例完成注冊注銷。
對比客戶端發(fā)現(xiàn)模式,使用服務(wù)端發(fā)現(xiàn)模式的客戶端本地不保存服務(wù)實(shí)例列表,客戶端不做負(fù)載均衡,這個負(fù)載均衡器既承擔(dān)了服務(wù)發(fā)現(xiàn)的角色,又承擔(dān)了網(wǎng)關(guān)的角色,所以經(jīng)常叫API網(wǎng)關(guān)服務(wù)器。
因?yàn)樨?fù)載均衡器是中心式的,所以它也必須是一個集群,單個實(shí)例不足以支撐高并發(fā)訪問,針對負(fù)載均衡器本身的服務(wù)發(fā)現(xiàn)和負(fù)載均衡通常借助DNS。
Http服務(wù)器,Nginx、Nginx Plus就是此類服務(wù)端發(fā)現(xiàn)模式的負(fù)載均衡器。
優(yōu)點(diǎn)
缺點(diǎn)
微服務(wù)和服務(wù)發(fā)現(xiàn)
Service Mesh服務(wù)網(wǎng)格是服務(wù)于微服務(wù)應(yīng)用程序的可配置基礎(chǔ)設(shè)施層,旨在處理服務(wù)之間的大量基于網(wǎng)絡(luò)的進(jìn)程間通信。
Service Mesh服務(wù)網(wǎng)關(guān)解耦調(diào)用和通信,在非mesh下,對于協(xié)議的感知和服務(wù)發(fā)現(xiàn)方法的感知需要應(yīng)用去做,用mesh之后,就只管調(diào)用,mesh通過控制面來控制應(yīng)用的數(shù)據(jù)流。
Mesh做服務(wù)發(fā)現(xiàn)其實(shí)是客戶端發(fā)現(xiàn)模式的升級版,基于sidecar和pilot實(shí)現(xiàn),Sidecars,即數(shù)據(jù)面板(Data Plane),負(fù)責(zé)發(fā)現(xiàn)目標(biāo)服務(wù)實(shí)例地址列表并轉(zhuǎn)發(fā)請求。Pilots,即控制面板(Control Plane),負(fù)責(zé)管理服務(wù)注冊表的所有服務(wù)注冊信息。
服務(wù)注冊模式
一個選擇是服務(wù)實(shí)例自注冊,即self-registration模式。另一種選擇是其它的系統(tǒng)組件來管理服務(wù)實(shí)例的注冊,即third-party registration模式。
自注冊模式如前面所述,它足夠簡單,不需要第三方組件,缺點(diǎn)是必須為服務(wù)中用到的每種編程語言與框架實(shí)現(xiàn)注冊代碼。
第三方注冊服務(wù)實(shí)例不會自己完成注冊注銷,它由另一個叫做Service Registrar的系統(tǒng)組件負(fù)責(zé),該組件會輪詢部署環(huán)境或者跟蹤訂閱事件去感知服務(wù)實(shí)例的變化,幫助服務(wù)實(shí)例完成自動化注冊注銷。
Third-party registration模式主要的優(yōu)勢在于解耦了服務(wù)和服務(wù)注冊表。不需要為每個語言和框架都實(shí)現(xiàn)服務(wù)注冊邏輯。服務(wù)實(shí)例注冊由一個專用的服務(wù)集中實(shí)現(xiàn)。缺點(diǎn)是除了被內(nèi)置到部署環(huán)境中,它本身也是一個高可用的系統(tǒng)組件,需要被啟動和管理。
其他
如果某個服務(wù)對于的服務(wù)實(shí)例特別多,比如在一些頭部公司,一個服務(wù)名可能對應(yīng)幾千幾萬個服務(wù)實(shí)例,這樣,服務(wù)變更的查詢和對比會很慢,IO的量會大得超過想象,通常,會用version num去解決這個問題。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流