如何實現乙個簡單的服務發現框架?

時間 2021-05-30 00:07:27

1樓:任弘迪

zk的ephemeral node, consul的service, etcd的session都行呀。服務端啟動時候註冊,客戶端監聽變更。

2樓:

zookeeper是乙個強一致(不嚴格)的分布式資料庫,由多個節點共同組成乙個分布式集群,掛掉任意乙個節點,資料庫仍然可以正常工作,客戶端無感知故障切換。客戶端向任意乙個節點寫入資料,其它節點可以立即看到最新的資料。

zookeeper的內部是乙個key/value儲存引擎,key是以樹狀的形式構成了乙個多級的層次結構,每乙個節點既可以儲存資料,又可以作為乙個目錄存放下一級子節點。

zookeeper和客戶端之間以socket形式進行雙向通訊,客戶端可以主動呼叫伺服器提供的api,伺服器可以主動向客戶端推送事件。有多種事件可以watch,比如節點的增刪改,子節點的增刪改,會話狀態變更等。

zookeeper的事件有傳遞機制,字節點的增刪改觸發的事件會向上層依次傳播,所有的父節點都可以收到字節點的資料變更事件,所以層次太深/子節點太多會給伺服器的事件系統帶來壓力,節點分配要做好周密的規劃。

zookeeper滿足了CAP定理的分割槽容忍性P和強一致性C,犧牲了高效能A。zookeeper的儲存能力是有限的,當節點層次太深/子節點太多/節點資料太大,都會影響資料庫的穩定性。所以zookeeper不是乙個用來做高併發高效能的資料庫,zookeeper一般只用來儲存配置資訊。

zookeeper的讀效能隨著節點數量的提公升能不斷增加,但是寫效能會隨著節點數量的增加而降低,所以節點的數量不宜太多,一般配置成3個或者5個就可以了。

圖中可以看出當伺服器節點增多時,複雜度會隨之提公升。因為每個節點和其它節點之間要進行p2p的連線。3個節點可以容忍掛掉1個節點,5個節點可以容忍掛掉2個節點。

客戶端連線zookeeper時會選擇任意乙個節點保持長鏈結,後續通訊都是通過這個節點進行讀寫的。如果該節點掛了,客戶端會嘗試去連線其它節點。

伺服器會為每個客戶端連線維持乙個會話物件,會話的ID會儲存在客戶端。會話物件也是分布式的,意味著當乙個節點掛掉了,客戶端使用原有的會話ID去連線其它節點,伺服器維持的會話物件還繼續存在,並不需要重新建立乙個新的會話。

也許你會問連線斷開了,伺服器是可以感知到的,為什麼需要客戶端主動傳送關閉訊息呢?

因為伺服器要考慮網路抖動的情況,連線可能只是臨時斷開了。為了避免這種情況下反覆建立和銷毀複雜的會話物件以及建立會話後要進行的一系列事件初始化操作,伺服器會盡量延長會話的生存時間。

zookeeper的節點可以是持久化(Persistent)的,也可以是臨時(Ephermeral)的。所謂臨時的節點就是會話關閉後,會話期間建立的所有臨時節點會立即消失。一般用於服務發現系統,將服務程序的生命期和zookeeper子節點的生命期繫結在一起,起到了實時監控服務程序的存活的效果。

zookeeper還提供了順序節點。類似於mysql裡面的auto_increment屬性。伺服器會在順序節點名稱後自動增加自增的唯一字尾,保持節點名稱的唯一性和順序性。

還有一種節點叫著保護(Protected)節點。這個節點非常特殊,但是也非常常用。在應用服務發現的場合時,客戶端建立了乙個臨時節點後,伺服器節點掛了,連線斷開了,然後客戶端去重連到其它的節點。

因為會話沒有關閉,之前建立的臨時節點還存在,但是這個時候客戶端卻無法識別去這個臨時節點是不是自己建立的,因為節點內部並不儲存會話ID欄位。所以客戶端會在節點名稱上加上乙個GUID字首,這個字首會儲存在客戶端,這樣它就可以在重連後識別出哪個臨時節點是自己之前建立的了。

接下來我們使用Go語言實現一下服務發現的註冊和發現功能。

如圖所示,我們要提供api.user這樣的服務,這個服務有3個節點,每個節點有不一樣的服務位址,這3個節點各自將自己的服務註冊進zk,然後消費者進行讀取zk得到api.user的服務位址,任選乙個節點位址進行服務呼叫。

為了簡單化,這裡就沒有提供權重引數了。在乙個正式的服務發現裡一般都有權重引數,用於調整服務節點之間的流量分配。

錢文品:徒手教你使用zookeeper編寫服務發現

如何實現乙個簡單的推薦系統

遇見更好的自己 問題應該是,如何把演算法進行編碼吧!第一,檢視你說的演算法在python中被打包模組,如果有直接研究這個模組,並且呼叫即可。第二,如果沒有,那就要自己寫,可以參考網上寫的,如果沒有,研究演算法框架,和資料流。根據資料流自己寫乙個。本質就是協同過濾演算法,網上有原始碼應該 最簡單的,比...

如何實現乙個簡單的定理證明器?

三水製糖廠長 如果想從C語言開始完全重新開始編寫定理證明器,那麼就要先了解自動定理證明的過程。自動定理證明的方法有很多,一種常用的方法是從結論 Conclusion 到假設 Premise 的反向證明,被稱為Resolution。相比於從假設到結論的正向證明,反向證明所需要的搜尋空間比較小。在這其中...

如何實現乙個簡單的家庭雲儲存(NAS)系統?

貝銳蒲公英異地組網 很多人都提到用黑群暉之類的方案自建NAS,實際上利用路由器USB介面外接硬碟也可以輕鬆滿足題主的需求,但是一般來說遠端訪問,外出隨時訪問資料會有些麻煩。儘管遠端訪問路由器硬碟的方法可以找到很多,但大多都需要公網IP,同時操作過程也非常複雜。要知道,如今不少網路運營商並不會主動分配...