作者:不止思考/王奎 (本文來(lái)自作者投稿)

微服務(wù)架構(gòu)是一個(gè)龐大復(fù)雜的工程,為什么說(shuō)它龐大復(fù)雜呢?因?yàn)橄胍龊梦⒎?wù),就必須先要建設(shè)好微服務(wù)所需的一系列基礎(chǔ)設(shè)施和組件。我在前面的文章《架構(gòu)設(shè)計(jì)之「 微服務(wù)入門(mén) 」》中已經(jīng)初步介紹過(guò)了這些組件,包括:服務(wù)注冊(cè)、服務(wù)網(wǎng)關(guān)、配置中心、服務(wù)框架、服務(wù)監(jiān)控、服務(wù)追蹤、服務(wù)治理等。
只有將這些基礎(chǔ)設(shè)施搭建完善了,微服務(wù)實(shí)踐的道路才能走的穩(wěn)、走的遠(yuǎn)。后面的文章中會(huì)依次把每一個(gè)基礎(chǔ)組件都詳細(xì)分析一下。今天我們就先挑選「 服務(wù)注冊(cè) 」聊一聊。 一、為什么需要「 服務(wù)注冊(cè) 」?我們先來(lái)舉一個(gè)生活中的例子:在以前互聯(lián)網(wǎng)還不夠發(fā)達(dá)的時(shí)候,“114號(hào)碼百事通”大家應(yīng)該很熟悉,有啥需求就會(huì)去打個(gè)電話(huà)查詢(xún)一下。比如想知道附近電影院電話(huà)是多少,就會(huì)先去打114問(wèn)一下。那114為啥知道這么多信息呢,還不是因?yàn)楦黝?lèi)服務(wù)者(商店、機(jī)構(gòu)等)都已經(jīng)在114上登記了嘛。所以這里的“114百事通”就相當(dāng)于一個(gè)服務(wù)注冊(cè)中心了,這里的各類(lèi)商店機(jī)構(gòu)就相當(dāng)于可以提供不同服務(wù)的服務(wù)者了,而打電話(huà)的我們就是去尋找這些服務(wù)的消費(fèi)者了。 我們?cè)賮?lái)回到微服務(wù)架構(gòu)中,一般集群都會(huì)部署很多個(gè)微服務(wù)節(jié)點(diǎn)。這些節(jié)點(diǎn)一般也具備這2種角色,稱(chēng)為:“服務(wù)的提供者” 和 “服務(wù)的消費(fèi)者”。 “服務(wù)消費(fèi)者”需要調(diào)用“服務(wù)提供者”的API來(lái)獲得服務(wù)。當(dāng)“服務(wù)提供者”的節(jié)點(diǎn)有增加或減少的時(shí)候,也得讓調(diào)用者(“服務(wù)消費(fèi)者”)及時(shí)的知曉。而在大規(guī)模集群中,一般節(jié)點(diǎn)數(shù)目都很多,節(jié)點(diǎn)變化頻繁,通過(guò)手動(dòng)去維護(hù)這些節(jié)點(diǎn)的狀態(tài)是不現(xiàn)實(shí)的,因此需要一個(gè)叫做“服務(wù)注冊(cè)中心”的組件來(lái)實(shí)現(xiàn)。 “服務(wù)提供者”將自己的服務(wù)地址等信息登記到“服務(wù)注冊(cè)中心”中,調(diào)用者(“服務(wù)消費(fèi)者”)需要的時(shí)候,每次都先去“服務(wù)注冊(cè)中心”查詢(xún)即可。既解決了人工維護(hù)微服務(wù)節(jié)點(diǎn)狀態(tài)的問(wèn)題,也能解決多節(jié)點(diǎn)間負(fù)載均衡的問(wèn)題。 二、「 服務(wù)注冊(cè) 」的實(shí)現(xiàn)原理是什么?在分析其原理之前,我們先來(lái)看一下這里包含的一些角色,有三類(lèi):“服務(wù)提供者”、“服務(wù)消費(fèi)者”、“服務(wù)注冊(cè)中心”。 其中“服務(wù)提供者”需要將自己的服務(wù)信息注冊(cè)到“服務(wù)注冊(cè)中心”里面。而“服務(wù)消費(fèi)者”需要到“服務(wù)注冊(cè)中心”里面去查詢(xún)有哪些服務(wù)可以調(diào)用。因此,我們可以分為兩個(gè)視角去分析原理: 自己注冊(cè): 
如圖,自己注冊(cè)就是指微服務(wù)節(jié)點(diǎn)在啟動(dòng)的時(shí)候,自己去服務(wù)注冊(cè)中心登記注冊(cè)了,把自己的信息和狀態(tài)傳過(guò)去。這種方式整體結(jié)構(gòu)比較簡(jiǎn)單,對(duì)于注冊(cè)中心而言也比較省事,但是對(duì)于微服務(wù)節(jié)點(diǎn)而言,每個(gè)微服務(wù)都得包含這么一段注冊(cè)的邏輯代碼,架構(gòu)上看起來(lái)不是很優(yōu)美。 再拿114百事通的例子解釋一遍,自己注冊(cè)就表示這是商家開(kāi)店之后自己跑去告訴114電話(huà)臺(tái),說(shuō)自己商店開(kāi)業(yè)了,目前在經(jīng)營(yíng)著哪些服務(wù),請(qǐng)求114登記下來(lái)。 第三方注冊(cè): 
如圖,第三方注冊(cè)就是指有一個(gè)“服務(wù)管理器”(圖中的Service Manager),這個(gè)“服務(wù)管理器”會(huì)去管理所有的微服務(wù)和進(jìn)程,以輪詢(xún)或其它方式去檢查有哪些微服務(wù)實(shí)例正在運(yùn)行,會(huì)將這些微服務(wù)實(shí)例自動(dòng)更新到服務(wù)注冊(cè)中心。這是目前比較常用的方式,例如Eureka就是采用這個(gè)模式。 如果再拿114百事通的例子來(lái)講,就相當(dāng)于114中心安排了一個(gè)管理員,這個(gè)管理員會(huì)定期的到街上去看一看有哪些新開(kāi)的商店就把它登記下來(lái),有哪些關(guān)閉了的商店就從注冊(cè)中心刪除掉。
客戶(hù)端模式 
在客戶(hù)端模式下,“服務(wù)消費(fèi)者”(圖中的Client)在向“服務(wù)注冊(cè)中心”查詢(xún)到自己需要調(diào)用的“服務(wù)提供者”的地址之后,“服務(wù)消費(fèi)者”(客戶(hù)端)就會(huì)自己根據(jù)地址去訪(fǎng)問(wèn)微服務(wù)(圖中的第3步 API Gateway是可選項(xiàng),有API Gateway的情況下,API Gateway起到負(fù)載均衡作用,沒(méi)有第3步的話(huà),那就是Client直接調(diào)用Microservice,需要Client自己寫(xiě)負(fù)載均衡邏輯)。 客戶(hù)端模式在實(shí)現(xiàn)上比較簡(jiǎn)單。 代理模式 
在代理模式下,“服務(wù)消費(fèi)者”(圖中的Client)與 微服務(wù)、“服務(wù)注冊(cè)中心”中間有一個(gè) API Gateway組件相隔著?!胺?wù)消費(fèi)者”只管去找API Gateway訪(fǎng)問(wèn)即可。至于去注冊(cè)中心查詢(xún)服務(wù)地址,以及訪(fǎng)問(wèn)服務(wù)地址的動(dòng)作都由API Gateway效勞了,最后API Gateway在把結(jié)果返回給“服務(wù)消費(fèi)者”即可。 這種模式,看起來(lái)“服務(wù)消費(fèi)者”省事了,但是API Gateway模塊卻復(fù)雜了,因?yàn)锳PI Gateway就是整個(gè)系統(tǒng)的一個(gè)非常核心關(guān)鍵節(jié)點(diǎn)了,不僅需要保障自己的穩(wěn)定性和性能,而且還需要處理一些負(fù)載均衡的邏輯。在大型架構(gòu)中,這種模式用的還比較多。
三、「 服務(wù)注冊(cè) 」如何實(shí)踐?講完了服務(wù)注冊(cè)中心的必要性和原理,我們?cè)賮?lái)看一下在實(shí)際應(yīng)用中應(yīng)該如何去應(yīng)用。雖然我們可以根據(jù)原理自己去開(kāi)發(fā)一套服務(wù)注冊(cè)中心,但是如果沒(méi)有特殊需求,還是不建議重復(fù)造輪子了,市面上有很多成熟的方案可以直接使用。 Eureka Eureka是由Netflix開(kāi)源,其架構(gòu)如下圖: 
從圖中可以看到,我們的服務(wù)(圖中Application Clinet與Application Service)要使用Eureka就需要集成它的SDK(圖中Eureka Client)。圖中的Eureka部署在了三個(gè)異地機(jī)房,也就是說(shuō)Eureka是支持多中心部署的。 服務(wù)提供者(Application Service)通過(guò)Eureka Client實(shí)現(xiàn)服務(wù)的注冊(cè)、更新和注銷(xiāo)等。服務(wù)消費(fèi)者(Application Clinet)通過(guò)Eureka Client實(shí)現(xiàn)服務(wù)的查詢(xún)和調(diào)用。 Eureka支持了與Spring Cloud的集成,所以使用起來(lái)也非常方便,目前屬于比較流行的方案。 Consul Consul是另外一個(gè)非常流行的開(kāi)源組件,如下圖: 
Consul是在服務(wù)外進(jìn)行完成一系列動(dòng)作的,也就是說(shuō)并不需要服務(wù)節(jié)點(diǎn)去依賴(lài)它的SDK,沒(méi)有侵入性,所以跨語(yǔ)言的解決能力更強(qiáng)一些。它一般是在服務(wù)節(jié)點(diǎn)外通過(guò)一些探針的方法去檢查應(yīng)用是否存活,是否需要注冊(cè)或注銷(xiāo)。 Consul也支持Spring Cloud集成,所以使用起來(lái)也很方便,也屬于比較流行的方案。 Etcd、Zookeeper 這兩個(gè)也有一些公司基于它們來(lái)實(shí)現(xiàn)服務(wù)注冊(cè),也集成了Spring Cloud,不過(guò)不算非常廣泛。
以上,就是對(duì)微服務(wù)架構(gòu)中「 服務(wù)注冊(cè) 」的一些思考。 【本文作者】 王奎:不止思考的技術(shù)人,一名駐扎在武漢互聯(lián)網(wǎng)的程序員老兵。
|