命名服務是指通過指定的名字來擷取資源或者服務的位址,提供者的資訊。利用zookeeper很容易建立一個全局的路徑,而這個路徑就可以作為一個名字,它可以指向叢集中的叢集,提供的服務的位址,遠端對象等。簡單來說使用zookeeper做命名服務就是用路徑作為名字,路徑上的資料就是其名字指向的實體。
阿裡巴巴集團開源的分布式服務架構dubbo中使用zookeeper來作為其命名服務,維護全局的服務位址清單。在dubbo實作中:
服務提供者在啟動的時候,向zk上的指定節點/dubbo/${servicename}/providers目錄下寫入自己的url位址,這個操作就完成了服務的釋出。
服務消費者啟動的時候,訂閱/dubbo/{servicename}/providers目錄下的提供者url位址, 并向/dubbo/{servicename} /consumers目錄下寫入自己的url位址。
注意,所有向zk上注冊的位址都是臨時節點,這樣就能夠保證服務提供者和消費者能夠自動感應資源的變化。
另外,dubbo還有針對服務粒度的監控,方法是訂閱/dubbo/{servicename}目錄下所有提供者和消費者的資訊。
上面的介紹已經滿詳細,實際實作起來也比較容易。下面講講模拟程式的主要特點。模拟程式有3個參數
<code>-m</code> 程式運作的方式,指定是服務提供者provider還是服務消費者consumer,或者是服務監控者monitor
<code>-n</code> 表示服務名稱
<code>-s</code> 表示zookeeper的服務位址ip:port
運作指令如下:
服務提供者:
<code>>nameservice -m provider -n query_bill -s172.17.0.36:2181</code>
服務消費者:
<code>>nameservice -m consumer -n query_bill -s172.17.0.36:2181</code>
服務監控者:
<code>>nameservice -m monitor -n query_bill -s172.17.0.36:2181</code>
第一條指令是啟動一個服務提供程序,它提供了一個名為query_bill的服務,程式首次運作時會建立
<code>/nameservice</code>,<code>/nameservice/query_bill</code>,<code>/nameservice/query_bill/provider</code>,<code>/nameservice/query_bill/consumer/</code>等幾個路徑。然後在服務提供程序在<code>/nameservice/query_bill/provider</code>下建立臨時序列節點.
第二條指令是啟動一個服務消費程序,它在<code>/nameservice/query_bill/consumer/</code>下建立臨時序列節點,并watch<code>/nameservice/query_bill/provider</code>的子節點變化事件,及時更新provider清單。
第三條指令是啟動一個服務監控程序,它watch <code>/nameservice/query_bill/provider</code>,<code>/nameservice/query_bill/consumer/</code>兩個路徑的子節點變化,及時更新provider清單和comsumer清單。
完整的代碼如下: