但它也有如下問題:
需要編寫專門的代碼埋點(diǎn),與服務(wù)注冊中心客戶端的緊耦合:如果使用Zookeeper,需要依賴它的jar包。
服務(wù)注冊代碼與服務(wù)接口代碼上下文緊耦合:必須在特定位置去使用服務(wù)注冊的代碼,而且可能還會(huì)包含特定服務(wù)的信息,這些信息可能是人工編排進(jìn)去的。
由于不同系統(tǒng)是由不同團(tuán)隊(duì)開發(fā)的,需要行政制度,“TopDown”規(guī)定服務(wù)注冊的編程,一旦有“不按套路出牌”的情況就會(huì)出現(xiàn)各種運(yùn)維問題。
基于前文的計(jì)算節(jié)點(diǎn)模型,我們的微服務(wù)注冊過程如下:
以HTTP方式對外暴露功能的服務(wù)能力(如圖Http服務(wù)能力A)基于計(jì)算節(jié)點(diǎn)提供的Http服務(wù)框架實(shí)現(xiàn)。統(tǒng)一技術(shù)棧的目的之一,也是為服務(wù)注冊做準(zhǔn)備。
在Http服務(wù)能力A裝配時(shí),基礎(chǔ)服務(wù)能力“服務(wù)能力畫像”會(huì)對其進(jìn)行畫像。畫像的過程實(shí)際是對編程模型的解析過程。提取的信息包括IP,Context路徑,服務(wù)接口的URL,服務(wù)接口對應(yīng)的實(shí)現(xiàn)方法,方法輸入?yún)?shù)的Pattern等等。這個(gè)過程就實(shí)現(xiàn)了服務(wù)的自動(dòng)發(fā)現(xiàn)。
服務(wù)能力畫像完成畫像后會(huì)將畫像數(shù)據(jù)轉(zhuǎn)交給基礎(chǔ)服務(wù)能力“心跳客戶端”。
心跳客戶端通過心跳上行將服務(wù)接口數(shù)據(jù)發(fā)送到服務(wù)注冊中心。
我們的服務(wù)注冊過程是以心跳系統(tǒng)為基礎(chǔ)的,服務(wù)注冊是心跳事務(wù)中的一種。實(shí)際上服務(wù)注冊中心是基礎(chǔ)服務(wù)能力“心跳服務(wù)端”的功能,而它的載體是另一個(gè)計(jì)算節(jié)點(diǎn)(如圖服務(wù)計(jì)算節(jié)點(diǎn)B),這也是 計(jì)算節(jié)點(diǎn)的對等性體現(xiàn) ,因?yàn)槿魏我粋€(gè)具備心跳服務(wù)端能力的計(jì)算節(jié)點(diǎn)都可以作為服務(wù)注冊中心。
服務(wù)注冊:常規(guī)模式

服務(wù)注冊:“心跳級(jí)聯(lián)代理”模式
在大規(guī)模部署服務(wù)計(jì)算節(jié)點(diǎn)時(shí),往往還會(huì)遇到跨大網(wǎng)段,跨機(jī)房,跨IDC中心,白名單IP策略等問題。所以心跳系統(tǒng)還支持“心跳級(jí)聯(lián)代理”模式,其作用是允許建立多級(jí)的心跳群,每個(gè)群由若干“代理”心跳服務(wù)端組成,它們只負(fù)責(zé)轉(zhuǎn)發(fā)心跳信息,所以服務(wù)注冊信息也依靠這個(gè)過程進(jìn)行轉(zhuǎn)發(fā)到服務(wù)注冊中心。

服務(wù)注冊:多級(jí)服務(wù)注冊中心模式
在某些特殊業(yè)務(wù)場景下,對服務(wù)注冊信息更新延遲容忍度較低,這時(shí),讓心跳級(jí)聯(lián)的計(jì)算節(jié)點(diǎn)也作為服務(wù)注冊中心。如下圖,節(jié)點(diǎn)B是1級(jí)服務(wù)注冊中心(以下簡稱1級(jí)中心),節(jié)點(diǎn)C是2級(jí)服務(wù)注冊中心(以下簡稱2級(jí)中心)。1級(jí)中心會(huì)存儲(chǔ)向自己提交的服務(wù)注冊信息,也會(huì)把這些信息轉(zhuǎn)發(fā)到上級(jí)服務(wù)注冊中心。2級(jí)中心上可見所有下級(jí)中心的服務(wù)注冊信息。這種模式可以獲得更快的服務(wù)發(fā)現(xiàn),因?yàn)橥?jí)的節(jié)點(diǎn)發(fā)現(xiàn)其他節(jié)點(diǎn)服務(wù)能力只需經(jīng)過本級(jí)服務(wù)注冊中心即可,下文會(huì)結(jié)合服務(wù)發(fā)現(xiàn)做詳細(xì)解釋。

服務(wù)注冊中心依靠TTL的方式對服務(wù)接口注冊信息進(jìn)行生命周期管理。我們定義生命狀態(tài)如下:

存活(Alive):服務(wù)接口健康,可被查詢
可疑死亡(Dying):由于網(wǎng)絡(luò)延遲等原因的假死狀態(tài),服務(wù)接口健康狀態(tài)存疑,可被查詢。有可能經(jīng)過1~2個(gè)生命周期收到上行心跳,可恢復(fù)至Alive狀態(tài)
死亡(Dead):超過了較大的TTL,基本認(rèn)為服務(wù)接口死亡,其接口信息被隔離不能查詢
消失(Disappear):超過了一個(gè)鐵定死亡的TTL,認(rèn)為服務(wù)接口可以抹去,最終會(huì)從服務(wù)中心消息掉,其接口信息被隔離不能查詢
另一個(gè)關(guān)鍵點(diǎn)是 服務(wù)接口名 的定義,它應(yīng)該是全局唯一的命名,因?yàn)樵诙鄠€(gè)服務(wù)能力之間互相調(diào)用時(shí)是以服務(wù)接口名為目標(biāo)的。在服務(wù)畫像時(shí),會(huì)自動(dòng)生成服務(wù)接口名,它提取以下三類信息:
計(jì)算節(jié)點(diǎn)類型名(服務(wù)計(jì)算節(jié)點(diǎn)相關(guān)): 計(jì)算節(jié)點(diǎn)的類型由業(yè)務(wù)語義決定,比如MonitoAgent,SMSGateway,HealthManager等等
Http服務(wù)組件類型名(服務(wù)能力相關(guān)): 對外提供Http服務(wù)組件的簡寫類名,比如MDFListenServer,NodeOperHandleServer,DigitSignServer等等