[TOC]算法
咱們一塊兒來回顧一下上次的分享:安全
要是對上述 GO 的通道 和 sync 包有點興趣的話,歡迎查看文章 GO通道和 sync 包的分享網絡
今天咱們來看看服務註冊與發現框架
服務註冊和發現的基本原理以下:分佈式
服務註冊微服務
指服務實例啓動的時候將自身的信息註冊到服務註冊與發現中心,並在運行的時候經過心跳的方式向服務註冊發現中心彙報自身服務狀態post
服務發現編碼
指服務實例向服務註冊與發現中心獲取的其餘服務實例信息,用於進行後續的遠程調用。spa
根據網絡資源和 GO 相關的書籍介紹,簡單梳理了以下 3 個點:接口
管理當前註冊到服務註冊與發現中心的微服務實例元數據信息,這些信息包括服務實例的服務名,IP地址,端口號,服務狀態和服務描述等等信息
服務註冊與發現中心會與已經註冊 ok 的微服務實例維持心跳,按期檢查註冊表中的服務是否正常在線,而且會在過程當中剔除掉無效的服務實例信息
如一我的服務須要調用服務註冊與發現中心中的微服務實例,能夠經過服務註冊與發現中心獲取到其具體的服務實例信息
對於服務註冊和發現,不得不說的一個定理是 CAP 定理
是描述分佈式系統下節點數據同步的基本定理
有以下 3 個特性:
指數據的一致性。
系統的數據信息,這裏包括備份的數據信息,在同一時刻下都是一致的。
在咱們如今的分佈式系統中,同一份數據可能存在多個實例當中,在這個特性的要求下,每個實例若修改了其中一份數據,都必須同步到他全部的備份當中
指服務的可用性
這裏是要求服務實例,在接收到客戶端的請求後,都可以給出相應的響應
這裏是考量系統的可用性 ,例如在系統中某個節點宕機了,客戶端請求服務的時候,服務端仍然能夠作出對應的響應
這個特性是這樣理解的
如今咱們分佈式的系統環境中,每個節點之間都是經過網絡通訊鏈接起來的,
但是,咱們要知道,基於網絡通訊,仍是會存在不可靠的地方,處在不一樣的網絡環境,該環境下的服務節點是會有可能出現鏈接不上,通訊失敗的。
對於以上這個問題,若系統能夠容忍,那麼這個系統就知足了 分區容忍性
經常使用的服務註冊和發現框架有以下一些,我這裏列舉幾個:
基於HTTP 協議的分佈式 key/value 存儲組件
基於 Raft 算法的開箱即用的服務發現組件
重量級一致性服務組件
基於集羣配置的組件
咱們今天來看看這些服務註冊和發現組件中的 ETCD ,也是由於他比較簡單,易於使用,而且是 GO 開發的
ETCD 一個開源的、高可用的分佈式key-value存儲系統,能夠用於配置共享和服務的註冊和發現
那麼 ETCD 自身有啥特色?
整理梳理了一下,有以下幾個特色:
ETCD 可用於避免硬件的單點故障或網絡問題
每次讀取 ETCD 上的數據,都會返回跨多主機的最新寫入的數據
能夠簡單的定義良好、面向用戶的API(此處說的API 指的是 gRPC 的接口)
ETCD 裏面還實現了帶有可選的客戶端證書身份驗證 TLS
資料上表示,每秒 10000次 寫入的基準速度
使用 Raft算法 實現了強一致、高可用的服務存儲目錄
集羣中的每一個節點均可以使用完整的存檔數據
根據以上特性,有沒有發現這些特性都是圍繞 CAP定理 來的
仍是剛纔說到的 ETCD ,用起來很簡單,且還有以下特色:
來講一說爲啥不用Zookeeper呢?
咱們在使用 ETCD 的時候 ,咱們就直接把 ETCD 當作是一個配置中心便可 ,系統內的全部服務的配置都會在ETCD上進行管理
有小夥伴會有疑問,那麼 註冊的服務實際配置信息改變了怎麼辦呢?
ETCD 都給你想好了,咱們是這樣使用 ETCD 的
咱們服務啓動的時候,會主動從 ETCD 上獲取一次配置信息
而且在 ETCD 節點上註冊一個 Watcher 並等待
那麼之後自身服務配置信息改變的時候,ETCD 就會知道某個服務配置改變了,且會將該變更的狀況通知到這個服務的訂閱者
這樣子就達到了其餘服務獲取最新配置的目的了
上面有說到 服務註冊與發現,會遵循 CAP 定理
ETCD 的強一致性,得益於 Raft 算法,在 ETCD 裏面,對ETCD 的操做,存儲到集羣中,必定是全局惟一的,根據 ETCD 的這一個特性, 咱們就能夠用來實現 分佈式鎖了
ETCD 的鎖服務有 2 種方式:
同一個時刻,全局只有一個服務能夠拿到鎖
得到鎖的順序也是全局惟一的,若小A得到了鎖,那麼在 ETCD 裏面,會有相應的key value 來標識 這一個客戶端
關於 GO 編碼中 ETCD 的應用案例,下一次咱們能夠關注一下
朋友們,你的支持和鼓勵,是我堅持分享,提升質量的動力
好了,本次就到這裏,下一次 GO 中 ETCD 的編碼案例分享
技術是開放的,咱們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~