注冊中心的意義是什么?
注冊中心實現了分布式環境中各個服務之間的注冊與發現
注冊中心的作用:
1.動態加入:一個服務的provider可以通過注冊中心將自己動態的暴露給其他的消費者
2.動態發現:一個服務的consumer可以動態感知新的配置以及新的provider,新的路由等
當然注冊中心還有一些別的用處,暫時不是很理解作用,所以在這里暫時不提及
注冊中心的工作流程
當服務的provider啟動的時候,會向注冊中心寫入自己的元數據信息,同時會訂閱配置元數據信息。
當服務的consumer啟動的時候,會向注冊中心寫入自己的元數據信息,並且會訂閱服務的provider,route以及配置元數據信息。
當服務治理中心啟動時,會訂閱所有的consumer,provider和配置元數據信息。
當服務的provider離開或者有新的provider加入的時候,注冊中心會將服務的provider目錄更新,並且通知給consumer和服務治理中心。
當consumer發起調用的時候,會將信息,例如調用時間等上報給監控中心
dubbo推薦的注冊中心是zk,zk是經過實戰考驗的,所以只分析zk。。
zk是一個樹狀的結構,它的每個節點可以分為持久節點,臨時節點以及持久順序節點和臨時順序節點
其中持久節點和臨時節點的區分是持久節點會永久的注冊在注冊中心,即使注冊中心重啟,持久節點也會存在,而臨時節點會在鏈接丟失或者是session超時等情況下被自動移除
順序節點比原有的節點多了節點先后順序的能力
dubbo在使用zk的時候只會創建持久節點和臨時節點,對節點的順序沒有要求
訂閱和發布
zk的發布:
服務的provider和consumer都需要將自己注冊到注冊中心。其中provider注冊是為了讓消費者感知服務的存在,從而可以發起遠程調用,也讓服務治理中心感知到有新的服務provider上線,
consumer發布是為了讓服務治理中心發現。。
zk的訂閱:
zk采用事件通知+客戶端拉取的方式訂閱,在客戶端第一次鏈接到注冊中心時,會獲取到對應目錄下的所有的數據。並且在訂閱的節點上注冊一個watcher,客戶端會與注冊中心保持
一個tcp的長鏈接,后續每個節點有數據變化的時候,注冊中心會根據watcher的回調主動通知客戶端,這就是事件通知
當客戶端接到通知時,會主動拉取對應節點下的全量數據,這就是客戶端拉取
zk的每一個節點都有一個版本號,當節點數據發生變化的時候,節點對應的版本號就會發生變化,並且這個時候會觸發watcher通知對應的客戶端。
zk的緩存
基本上每一個場景中,緩存的作用就是用空間換取時間。試想如果每次遠程調用的時候都要從注冊中心全量拉取一遍服務列表,那么注冊中心能否成主這么大的流量。
所以dubbo的注冊中心會有緩存機制,當consumer或者治理中心獲取到注冊信息之后會進行本地緩存,這也就是為什么注冊中心掛了雙方還可以進行調用的原因