上圖基本表達了註冊中心的互動過程, 體現出三種角色之間關係:
服務消費者 service consumer(client):
註冊中心 service registry center:
大多數情況下乙個服務可能既是client又是 consumercap理論是分布式架構中重要理論
由於c與a的特性無法共存.cap 不可能都取,只能取其中2個,要麼ap要麼cp
說到這個, 先扯一下服務發現, 當我們的服務從單機走向社會的時候, 就產生了服務發現.
一開始服務發現是通dns協議實現的, 就是網路ip協議, 通過dns + lvs基本就實現了http形式的服務發現, 這個時候ip通常是配置在lvs.之後大家開始玩起rpc服務, 服務的部署開始頻繁.為了實現動態上下線, 整出來註冊中心 目的其實就是推送ip列.
zoopkeeper 在國內很長一段時間都是註冊中心一哥.大部分是因為dubbo 在國能的盛行.
netflix玩的是一種流**服務. 愛、死亡與機械人, 怪奇物語,紙牌屋,黑鏡.. 這些耳熟能詳的美劇都是旗下的作品. netflix一直以來的商業模式其實就是眾籌, 使用者用更低的產品看電視劇集. 到現在開始踏足原創劇集時代,這才是netflix從諸多電視巨頭中突圍的原因.非常的頂.很多spring cloud的元件都是netflix做的, 這是netflix的微服務生態.方便spring開發人員構建微服務基礎框架.而eureka則藉著微服務概念的流行,與springcloud生態的深度結合,也獲取了大量的粉絲.
nacos 是阿里開源的, 功能其實也很多, 服務註冊, 配置管理, 動態 dns 服務, 元資料管理
nacos
eureka
consul
zookeeper
資料一致性
ap/cp
apcp
cp健康檢查
負載均衡策略
權重/metadata/selector
ribbon
fabio
-雪崩保護有有
無無容量100w
5000
百萬級百萬級
自動登出例項√√
×√訪問協議
tcp監聽支援√√
√√多資料中心√√
√×跨註冊中心同步√×
√×spring cloud整合√√
√×dubbo整合√×
×√k8s整合√×
√×資料一致性一直是分布式系統的熱點, 目前基本歸為兩派:
可以通過心跳檢測來舉個例子, 強一致性註冊中心,服務節點不會傳送心跳,因為第一次註冊的時候就必須保證資料不會丟失,而如果服務節點能傳送心跳第一次註冊的成功與否就會顯得不那麼重要(當然也非常重要,這裡指的是允許出現失敗)
這也是eureka為什麼採用自定義的renew機制的原因,而不是paxos協議(據說拿過圖靈獎).
對於dubbo來說其實採用renew機制更好, 主要是因為註冊到zookeeper上是臨時節點,還允許服務下線,傳送心跳到zookeeper上來續約服務節點.zookeeper保證了一致性,就確實服務的高可用,導致機房容災能力的確實.
nacos支援ap和cp兩種協議如圖所示.在這點設計上有個騷操作, 就是把業務相關邏輯和底層同步邏輯分層,將業務讀寫抽象為nacos定義為的[資料模型](# 資料模型).通過**, 根據一定的規則進行**.
註冊中心最核心的資料就是服務名和ip位址,zookeeper是乙個樹形k-v的資料結構,理論上滿足各種語境的資料.而eureka和consul做到例項級別的資料擴充套件.滿足最根本需求.nacos的資料模型相對複雜.如圖所示:
nacos考慮的是資料的隔離模型, 並提供了四種.作為乙個共享服務的元件,需要能夠在各種環境保證資料的隔離和安全,這點在龐大的業務場景中非常常見.
上面說的業務邏輯和同步邏輯其實指的就是臨時例項和持久化例項.在定義上區分臨時例項和持久化例項的關鍵是健康檢查的方式, 臨時例項使用客戶端上報模式, 而持久化例項使用服務端反向探測模式.臨時例項需要能夠自動摘除不健康例項,而且無需持久化儲存例項.持久化例項使用服務端探測的健康檢查方式,因為客戶端不會上報心跳,那麼自然就不能去自動摘除下線的例項.
一些基礎的元件例如資料庫、快取等,這些往往不能上報心跳,這種型別的服務在註冊時,就需要作為持久化例項註冊.而上層的業務服務
大多通過心跳檢測實現,如果客戶端一定時間內沒傳送心跳,服務節點會被登出.這種機制被稱為ttl. eureka允許自定義檢查服務本身的方法.不同註冊中心檢查機制不同, nacos是5秒乙個週期,15秒沒收到心跳,服務被標記為不健康, 30秒沒收到則登出服務.
另外, client服務和server服務又有不同:
一般來說註冊過的server服務例項如果不呼叫結構主動登出,就意味著維持健康檢查的探測任務, 而client服務例項則可以隨時登出不健康的例項,減輕服務端的壓力.
講道理,負載均衡不是註冊中心的傳統藝能.一般來說,服務發現的流程就是從註冊中心獲取例項列表, 然後選擇自身所需符合規則被分配的服務提供者,註冊中心不會限制消費者的訪問策略.
eureka,zookeeper,consul基本都是這樣.eureka的負載均衡是由ribbon負責的, consul的負載均衡是由fabio完成的.
目前的負載均衡有基於權重、服務提供者負載、響應時間、標籤等策略.
ribbon設計的客戶端負載均衡機制主要是選擇合適現有的irule、serverlistfilter等介面實現,兩步實現負載均衡:
過濾掉不會採用的服務提供者例項
在被過濾後的服務列表中進行負載均衡
fabio是基於標籤做負載均衡, 這點和kubernetes類似, 都是將標籤運到資源的過濾上,實現標籤的比例和權重的負載均衡.
nacos除了提供權重的負載均衡之外, 還提供了cmdb的標籤負載均衡.實現同標籤優先訪問的流量排程策略.如果服務部署在多個不同的地區, cmdb的負載將會起到不錯的效果.充分均勻的分配流量.
zookeeper基於leader的非對等部署的單點寫一致性,無法做到自動多機房容災
eureka的部署模式天然支援多機房容災
nacos支援兩種模式的部署,一種是和eureka一樣的ap協議的部署,這種模式只支援臨時例項,可以完美替代當前的zookeeper、eureka,並支援機房容災.另一種是支援持久化例項的cp模式,這種情況下不支援雙機房容災.
機房容災是異地多活的一部分,讓業務能夠在訪問服務註冊中心時,動態調整訪問的集群節點,需要第三方做路由.
多資料中心其實也算是異地多活的一部分. zookeeper和eureka沒有官方的資料中心方案.nacos有nacos-sync元件來做資料中心之間的資料同步,不僅可以在nacos之間同步, 還可以實現nacos在zookeeper,k8s.consul和eureka的資料同步, 實現生態大和諧.
這篇文章盤點註冊中心各自的特性
盤點一下小傢伙發展情況
小傢伙的發展情況是要經常記的,我記得在生她之前曾盤算要天天記日記,說不定將來還可以用做人類生長發育研究方面珍貴的一手資料呢。要記錄的事項比較雜,想到什麼就記什麼吧,恐怕還記不全。近乙個月前看了 功夫熊貓 是英文版的,但是小朋友看什麼語言的電影好像都是可以的。看到烏龜爺爺仙逝的那一幕,雖然表現手法及其...
測試一下讀寫登錄檔
setregistrykey t mytestregister 在hkey current user software下生成 mytestregister cstring strusername i come from china writeprofilestring loginfo usernam...
自然語言處理 盤點一下資料平滑演算法
在自然語言處理中,經常要計算單詞序列 句子 出現的概率估計。我們知道,演算法在訓練時,語料庫不可能包含所有可能出現的序列。因此,為了防止對訓練樣本中未出現的新序列概率估計值為零,人們發明了好多改善估計新序列出現概率的演算法,即資料平滑演算法。最簡單的演算法是laplace法則,思路很簡單,統計測試資...