分布式系統(tǒng)服務(wù)治理

分布式系統(tǒng)架構(gòu)特別是進(jìn)入微服務(wù)架構(gòu)后,服務(wù)治理的重要性愈發(fā)變得不可缺少而且處于重要地位。缺乏服務(wù)治理的的分布式系統(tǒng)架構(gòu),很難正式投入生產(chǎn)。那么服務(wù)治理包括哪些方面呢?主要包括服務(wù)發(fā)現(xiàn),負(fù)載均衡,限流,熔斷,超時(shí),重試,服務(wù)跟蹤等。下面展開講。

侵入式服務(wù)治理

1.服務(wù)發(fā)現(xiàn)

服務(wù)發(fā)現(xiàn)是指使用一個(gè)注冊(cè)中心來記錄分布式系統(tǒng)中全部服務(wù)的信息,以便讓其他服務(wù)能夠快速找到這些已注冊(cè)的服務(wù)。服務(wù)發(fā)現(xiàn)需要服務(wù)注冊(cè),服務(wù)查找,服務(wù)健康檢查及服務(wù)變更通知等關(guān)鍵功能。

最早的服務(wù)發(fā)現(xiàn)應(yīng)用就是DNS,通過使用域名,讓訪問者不必關(guān)心服務(wù)在哪里。其實(shí)DNS的服務(wù)發(fā)現(xiàn)應(yīng)用,在原來公司做大型嵌入式軟件時(shí),雖然是單體系統(tǒng),但是是一個(gè)分時(shí)的多進(jìn)程系統(tǒng),由于系統(tǒng)非常龐大,不同的進(jìn)程間通信采用的是IPC進(jìn)程間通信。為了便于不同的進(jìn)程間通信,我們當(dāng)時(shí)設(shè)計(jì)在IPC模塊內(nèi)部提供了一個(gè)小型的服務(wù)發(fā)現(xiàn)功能,所有需要通過IPC通信的系統(tǒng),在模塊啟動(dòng)時(shí)都需要調(diào)用IPC提供的服務(wù)注冊(cè)功能,這樣當(dāng)模塊間通信時(shí),就不用關(guān)注這個(gè)IPC通信是設(shè)備的板間通信還是板內(nèi)通信。這里簡(jiǎn)單解下,因?yàn)樵O(shè)備形態(tài)存在控制板(主要負(fù)責(zé)協(xié)議計(jì)算和路由)和接口板(主要負(fù)責(zé)數(shù)據(jù)報(bào)文轉(zhuǎn)發(fā),可能多個(gè)接口板),因此當(dāng)我們?cè)诳紤]IPC時(shí)提供了類似的設(shè)計(jì)。

可以看到關(guān)于服務(wù)發(fā)現(xiàn),關(guān)鍵是要有一個(gè)服務(wù)注冊(cè)中心。具體的服務(wù)發(fā)現(xiàn)機(jī)制

1.服務(wù)提供者啟動(dòng)時(shí)需要注冊(cè)。

2.注冊(cè)中心與服務(wù)提供者無法保持心跳時(shí)需要剔除服務(wù)

3.服務(wù)消費(fèi)者可以從注冊(cè)中心獲取服務(wù)提供者的最新信息,可以采取定期拉和事件通知的兩種方式

可以看到服務(wù)注冊(cè)中心在分布式服務(wù)架構(gòu)中的關(guān)鍵位置,因此需要具備高可用?;贑AP定理的,服務(wù)注冊(cè)中心的最佳選擇是一個(gè)AP的系統(tǒng)。但實(shí)際中我們常用的注冊(cè)中心有zooKeeper,Eureka,etcd,consul,還有阿里的Nacos。

  1. zooKeeper我們知道它本質(zhì)其實(shí)是一個(gè)CP模型,基于其自己的Zab協(xié)議(基于Paxos裁剪)來保證注冊(cè)中心多個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)一致性。

Zab協(xié)議規(guī)定,消息傳遞要遵循可靠傳遞,完全有序,因果有序的特性.

ZooKeeper Service

在zooKeeper中,主節(jié)點(diǎn)故障下,Zab協(xié)議通過主節(jié)點(diǎn)快速選舉,初始化,同步從節(jié)點(diǎn)、廣播幾個(gè)階段來保證數(shù)據(jù)一致性和主節(jié)點(diǎn)選舉的高效。

zooKeeper 的核心概念

集群角色: 主節(jié)點(diǎn),從節(jié)點(diǎn),觀察者節(jié)點(diǎn)。主節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)寫入服務(wù),從節(jié)點(diǎn)提供讀數(shù)據(jù)。觀察者同樣提供讀但是不參與選舉投票。在集群中,服務(wù)器數(shù)量是奇數(shù)被認(rèn)為是一個(gè)最佳實(shí)踐。集群對(duì)外工作的必要條件是超過半數(shù)的服務(wù)器可以對(duì)外正常工作。

ZooKeeper's Hierarchical Namespace

另外有個(gè)集群宕機(jī)容忍度的衡量,2臺(tái)服務(wù)器的容忍度為0,3臺(tái),4臺(tái)容忍度都是1

會(huì)話:在zooKeeper,客戶端和服務(wù)端之間是有TCP長(zhǎng)連接的。基于長(zhǎng)連接發(fā)送心跳。會(huì)話超時(shí)時(shí)間徐阿喲根據(jù)生產(chǎn)環(huán)境的網(wǎng)絡(luò)狀況合理設(shè)定。

數(shù)據(jù)節(jié)點(diǎn):數(shù)據(jù)節(jié)點(diǎn)稱zNode,通過/分割父節(jié)點(diǎn)和子節(jié)點(diǎn)。zNode分為持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn) 服務(wù)注冊(cè)就是注冊(cè)在臨時(shí)節(jié)點(diǎn)上。

PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL
EPHEMERAL_SEQUENTIAL

監(jiān)聽: 即watcher,客戶端可以在感興趣的zNode上進(jìn)行監(jiān)聽,當(dāng)zNode狀態(tài)變化時(shí),服務(wù)端會(huì)通知客戶端。


ZooKeeper's Hierarchical Namespace

zooKpeer 原生提供了命令行客戶端及Java,c的客戶端。原生客戶端開發(fā)效率低,且存在一些不足(不支持遞歸,需要重復(fù)注冊(cè)監(jiān)聽器,需要自行解決會(huì)話超時(shí),對(duì)常用的分布式鎖,選舉,分布式計(jì)數(shù)等都需要二次開發(fā))。

zkClient和Curator是兩個(gè)常見的三方庫(kù)。

zkClient提供遞歸刪除創(chuàng)建節(jié)點(diǎn),會(huì)話超時(shí)處理,監(jiān)聽器反復(fù)等,簡(jiǎn)化了原生API的使用。

Curator是Netflix開源的,已經(jīng)被Apache基金會(huì)收錄。除了支持zkClient的功能,還支持選舉,分布式鎖等場(chǎng)景

zooKeeper是最廣為廣泛的分布式協(xié)調(diào)組件,由于存在當(dāng)主節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)與其他節(jié)點(diǎn)失去聯(lián)系導(dǎo)致整個(gè)系統(tǒng)重新選舉時(shí),集群是不可用的(這也是它作為CP模型,不能應(yīng)用于大規(guī)模分布式系統(tǒng)注冊(cè)中心的考慮。),因此已經(jīng)不是服務(wù)發(fā)現(xiàn)的最好選擇了,其主要優(yōu)勢(shì)在選舉和分布式鎖。Curator提供的緩存能力,能夠讓zooKeeper可用性增強(qiáng),同時(shí)由于緩存使得其從CP發(fā)生向AP的轉(zhuǎn)化

  1. Eureka

Eureka采用了去中心化的設(shè)計(jì),整個(gè)集群由對(duì)等節(jié)點(diǎn)組成,不存在zk(zooKpeer以下簡(jiǎn)稱zk)的選舉問題。服務(wù)端之間相互注冊(cè)彼此同步信息來實(shí)現(xiàn)高可用性??蛻舳丝梢赃B接任一服務(wù)端進(jìn)行注冊(cè)。但這樣會(huì)存在數(shù)據(jù)的一致性問題,也就是客戶端查詢的信息不一定是最新的。

eureka_architecture.png

Eureka也是Netflix的開源項(xiàng)目,可以和SpringCloud很好的整合。Eureka是一個(gè) war包,需要部署到一個(gè)web服務(wù)器中。另外Eureka提提供一個(gè)保護(hù)機(jī)制,就是當(dāng)超過85%的節(jié)點(diǎn)在15分鐘內(nèi)沒有心跳時(shí),就會(huì)啟動(dòng),此時(shí)
1.不再?gòu)淖?cè)列表刪除長(zhǎng)時(shí)間沒有心跳的服務(wù)
2.不會(huì)接受新的戶注冊(cè)及同步數(shù)據(jù)
3.網(wǎng)絡(luò)恢復(fù)穩(wěn)定后再接受新注冊(cè)及同步信息
Eureka提供了java,Python, Node.js, .net的客戶端,對(duì)于沒有客戶端的語(yǔ)言可以通過Restful API交互。

  1. Etcd
    Etcd和zk具有類似的架構(gòu),采用 Raft算法代替了 zab,從CAP來分析,也是一個(gè)CP系統(tǒng),通過TTL來實(shí)現(xiàn)類似zk臨時(shí)節(jié)點(diǎn)的功能

  2. Consul
    Consul是一個(gè)商業(yè)產(chǎn)品(Raft),有一個(gè)開源版本。除了服務(wù)發(fā)現(xiàn),還通過內(nèi)存,磁盤使用的細(xì)粒度狀態(tài)檢測(cè)及服務(wù)配置的鍵值存儲(chǔ)功能。

  3. Nacos
    Nacos 致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù)。Nacos 提供了一組簡(jiǎn)單易用的特性集,幫助您快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
    Nacos 幫助您更敏捷和容易地構(gòu)建、交付和管理微服務(wù)平臺(tái)。 Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu) (例如微服務(wù)范式、云原生范式) 的服務(wù)基礎(chǔ)設(shè)施。

    nacos_map

Nacos 支持基于 DNS 和基于 RPC 的服務(wù)發(fā)現(xiàn)。服務(wù)提供者使用 原生SDKOpenAPI、或一個(gè)獨(dú)立的Agent TODO注冊(cè) Service 后,服務(wù)消費(fèi)者可以使用DNS TODOHTTP&API查找和發(fā)現(xiàn)服務(wù).它同時(shí)支持AP和CP模式,可以通過配置切換。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容