天天看點

為什麼推薦Zookeeper作注冊中心

為什麼推薦Zookeeper作注冊中心

建議使用dubbo-2.3.3以上版本的zookeeper注冊中心用戶端

為什麼推薦Zookeeper作注冊中心

zookeeper說明

為什麼推薦Zookeeper作注冊中心

zookeeper安裝

為什麼推薦Zookeeper作注冊中心

可靠性聲明

阿裡内部并沒有采用zookeeper做為注冊中心,而是使用自己實作的基于資料庫的注冊中心,即:zookeeper注冊中心并沒有在阿裡内部長時間運作的可靠性保障,此zookeeper橋接實作隻為開源版本提供,其可靠性依賴于zookeeper本身的可靠性。

為什麼推薦Zookeeper作注冊中心

相容性聲明

因2.0.8最初設計的zookeeper存儲結構不能擴充不同類型的資料,2.0.9版本做了調整,是以不相容,需全部改用2.0.9版本才行,以後的版本會保持相容2.0.9。

2.2.0版本改為基于zkclient實作,需增加zkclient的依賴包,2.3.0版本增加了基于curator的實作,作為可選實作政策。

為什麼推薦Zookeeper作注冊中心

流程說明:

服務提供者啟動時

向/dubbo/com.foo.barservice/providers目錄下寫入自己的url位址。

服務消費者啟動時

訂閱/dubbo/com.foo.barservice/providers目錄下的提供者url位址。

并向/dubbo/com.foo.barservice/consumers目錄下寫入自己的url位址。

監控中心啟動時

訂閱/dubbo/com.foo.barservice目錄下的所有提供者和消費者url位址。

支援以下功能:

當提供者出現斷電等異常停機時,注冊中心能自動删除提供者資訊。(臨時節點?會話失效,自動删除)

當注冊中心重新開機時,能自動恢複注冊資料,以及訂閱請求。

當會話過期時,能自動恢複注冊資料,以及訂閱請求。

當設定<dubbo:registry check="false" />時,記錄失敗注冊和訂閱請求,背景定時重試。

可通過<dubbo:registry username="admin" password="1234" />設定zookeeper登入資訊。

可通過<dubbo:registry group="dubbo" />設定zookeeper的根節點,不設定将使用無根樹。

支援*号通配符<dubbo:reference group="*" version="*" />,可訂閱服務的所有分組和所有版本的提供者。

在provider和consumer中增加zookeeper用戶端jar包依賴:

<code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>groupid</code><code>&gt;org.apache.zookeeper&lt;/</code><code>groupid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactid</code><code>&gt;zookeeper&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>version</code><code>&gt;3.3.3&lt;/</code><code>version</code><code>&gt;</code>

<code>&lt;/</code><code>dependency</code><code>&gt;</code>

支援zkclient和curator兩種zookeeper用戶端實作:

從2.2.0版本開始預設為zkclient實作,以提升zookeeper用戶端的健狀性。

為什麼推薦Zookeeper作注冊中心

預設配置:

<code>&lt;</code><code>dubbo:registry</code> <code>...</code><code>client</code><code>=</code><code>"zkclient"</code> <code>/&gt;</code>

或:

<code>dubbo.registry.client=zkclient</code>

<code>zookeeper://10.20.153.10:2181?client=zkclient</code>

需依賴:

<code>    </code><code>&lt;</code><code>groupid</code><code>&gt;com.github.sgroschupf&lt;/</code><code>groupid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactid</code><code>&gt;zkclient&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>version</code><code>&gt;0.1&lt;/</code><code>version</code><code>&gt;</code>

從2.3.0版本開始支援可選curator實作。

為什麼推薦Zookeeper作注冊中心

如果需要改為curator實作,請配置:

<code>&lt;</code><code>dubbo:registry</code> <code>...</code><code>client</code><code>=</code><code>"curator"</code> <code>/&gt;</code>

<code>dubbo.registry.client=curator</code>

<code>zookeeper://10.20.153.10:2181?client=curator</code>

<code>    </code><code>&lt;</code><code>groupid</code><code>&gt;com.netflix.curator&lt;/</code><code>groupid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactid</code><code>&gt;curator-framework&lt;/</code><code>artifactid</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>version</code><code>&gt;1.1.10&lt;/</code><code>version</code><code>&gt;</code>

zookeeper單機配置:

<code>&lt;</code><code>dubbo:registry</code> <code>address</code><code>=</code><code>"zookeeper://10.20.153.10:2181"</code> <code>/&gt;</code>

or:

<code>&lt;</code><code>dubbo:registry</code> <code>protocol</code><code>=</code><code>"zookeeper"</code> <code>address</code><code>=</code><code>"10.20.153.10:2181"</code> <code>/&gt;</code>

zookeeper叢集配置:

<code>&lt;</code><code>dubbo:registry</code> <code>address</code><code>=</code><code>"zookeeper://10.20.153.10:2181?backup=10.20.153.11:2181,10.20.153.12:2181"</code> <code>/&gt;</code>

<code>&lt;</code><code>dubbo:registry</code> <code>protocol</code><code>=</code><code>"zookeeper"</code> <code>address</code><code>=</code><code>"10.20.153.10:2181,10.20.153.11:2181,10.20.153.12:2181"</code> <code>/&gt;</code>

同一zookeeper,分成多組注冊中心:

<code>&lt;</code><code>dubbo:registry</code> <code>id</code><code>=</code><code>"chinaregistry"</code> <code>protocol</code><code>=</code><code>"zookeeper"</code> <code>address</code><code>=</code><code>"10.20.153.10:2181"</code> <code>group</code><code>=</code><code>"china"</code> <code>/&gt;</code>

<code>&lt;</code><code>dubbo:registry</code> <code>id</code><code>=</code><code>"intlregistry"</code> <code>protocol</code><code>=</code><code>"zookeeper"</code> <code>address</code><code>=</code><code>"10.20.153.10:2181"</code> <code>group</code><code>=</code><code>"intl"</code> <code>/&gt;</code>

為什麼推薦Zookeeper作注冊中心

redis說明

為什麼推薦Zookeeper作注冊中心

redis安裝

為什麼推薦Zookeeper作注冊中心

redis過期資料

通過心跳的方式檢測髒資料,伺服器時間必須相同,并且對伺服器有一定壓力。

為什麼推薦Zookeeper作注冊中心

阿裡内部并沒有采用redis做為注冊中心,而是使用自己實作的基于資料庫的注冊中心,即:redis注冊中心并沒有在阿裡内部長時間運作的可靠性保障,此redis橋接實作隻為開源版本提供,其可靠性依賴于redis本身的可靠性。

為什麼推薦Zookeeper作注冊中心

從2.1.0版本開始支援

為什麼推薦Zookeeper作注冊中心

資料結構:

使用redis的key/map結構存儲資料。

主key為服務名和類型。

map中的key為url位址。

map中的value為過期時間,用于判斷髒資料,髒資料由監控中心删除。(注意:伺服器時間必需同步,否則過期檢測會不準确)

使用redis的publish/subscribe事件通知資料變更。

通過事件的值區分事件類型:register, unregister, subscribe, unsubscribe。

普通消費者直接訂閱指定服務提供者的key,隻會收到指定服務的register, unregister事件。

監控中心通過psubscribe功能訂閱/dubbo/*,會收到所有服務的所有變更事件。

調用過程:

服務提供方啟動時,向key:/dubbo/com.foo.barservice/providers下,添加目前提供者的位址。

并向channel:/dubbo/com.foo.barservice/providers發送register事件。

服務消費方啟動時,從channel:/dubbo/com.foo.barservice/providers訂閱register和unregister事件。

并向key:/dubbo/com.foo.barservice/providers下,添加目前消費者的位址。

服務消費方收到register和unregister事件後,從key:/dubbo/com.foo.barservice/providers下擷取提供者位址清單。

服務監控中心啟動時,從channel:/dubbo/*訂閱register和unregister,以及subscribe和unsubsribe事件。

服務監控中心收到register和unregister事件後,從key:/dubbo/com.foo.barservice/providers下擷取提供者位址清單。

服務監控中心收到subscribe和unsubsribe事件後,從key:/dubbo/com.foo.barservice/consumers下擷取消費者位址清單。

選項:

可通過&lt;dubbo:registry group="dubbo" /&gt;設定redis中key的字首,預設為dubbo。

可通過&lt;dubbo:registry cluster="replicate" /&gt;設定redis叢集政策,預設為failover。

failover: 隻寫入和讀取任意一台,失敗時重試另一台,需要伺服器端自行配置資料同步。

replicate: 在用戶端同時寫入所有伺服器,隻讀取單台,伺服器端不需要同步,注冊中心叢集增大,性能壓力也會更大。

config redis registry:

<code>&lt;</code><code>dubbo:registry</code> <code>address</code><code>=</code><code>"redis://10.20.153.10:6379"</code> <code>/&gt;</code>

<code>&lt;</code><code>dubbo:registry</code> <code>address</code><code>=</code><code>"redis://10.20.153.10:6379?backup=10.20.153.11:6379,10.20.153.12:6379"</code> <code>/&gt;</code>

<code>&lt;</code><code>dubbo:registry</code> <code>protocol</code><code>=</code><code>"redis"</code> <code>address</code><code>=</code><code>"10.20.153.10:6379"</code> <code>/&gt;</code>

<code>&lt;</code><code>dubbo:registry</code> <code>protocol</code><code>=</code><code>"redis"</code> <code>address</code><code>=</code><code>"10.20.153.10:6379,10.20.153.11:6379,10.20.153.12:6379"</code> <code>/&gt;</code>

為什麼推薦Zookeeper作注冊中心

dogfooding

注冊中心本身就是一個普通的dubbo服務,可以減少第三方依賴,使整體通訊方式一緻。

為什麼推薦Zookeeper作注冊中心

适用性說明

此simpleregistryservice隻是簡單實作,不支援叢集,可作為自定義注冊中心的參考,但不适合直接用于生産環境。

export simple registry service:

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>    </code><code>&lt;!-- 目前應用資訊配置 --&gt;</code>

<code>    </code><code>&lt;</code><code>dubbo:application</code> <code>name</code><code>=</code><code>"simple-registry"</code> <code>/&gt;</code>

<code>    </code><code>&lt;!-- 暴露服務協定配置 --&gt;</code>

<code>    </code><code>&lt;</code><code>dubbo:protocol</code> <code>port</code><code>=</code><code>"9090"</code> <code>/&gt;</code>

<code>    </code><code>&lt;!-- 暴露服務配置 --&gt;</code>

<code>    </code><code>&lt;</code><code>dubbo:service</code> <code>interface</code><code>=</code><code>"com.alibaba.dubbo.registry.registryservice"</code> <code>ref</code><code>=</code><code>"registryservice"</code> <code>registry</code><code>=</code><code>"n/a"</code> <code>ondisconnect</code><code>=</code><code>"disconnect"</code> <code>callbacks</code><code>=</code><code>"1000"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>dubbo:method</code> <code>name</code><code>=</code><code>"subscribe"</code><code>&gt;&lt;</code><code>dubbo:argument</code> <code>index</code><code>=</code><code>"1"</code> <code>callback</code><code>=</code><code>"true"</code> <code>/&gt;&lt;/</code><code>dubbo:method</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>dubbo:method</code> <code>name</code><code>=</code><code>"unsubscribe"</code><code>&gt;&lt;</code><code>dubbo:argument</code> <code>index</code><code>=</code><code>"1"</code> <code>callback</code><code>=</code><code>"false"</code> <code>/&gt;&lt;/</code><code>dubbo:method</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>dubbo:service</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 簡單注冊中心實作,可自行擴充實作叢集和狀态同步 --&gt;</code>

<code>    </code><code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"registryservice"</code> <code>class</code><code>=</code><code>"com.alibaba.dubbo.registry.simple.simpleregistryservice"</code> <code>/&gt;</code>

<code>&lt;/</code><code>beans</code><code>&gt;</code>

reference the simple registry service:

<code>&lt;</code><code>dubbo:registry</code> <code>address</code><code>=</code><code>"127.0.0.1:9090"</code> <code>/&gt;</code>

<code>&lt;</code><code>dubbo:service</code> <code>interface</code><code>=</code><code>"com.alibaba.dubbo.registry.registryservice"</code> <code>group</code><code>=</code><code>"simple"</code> <code>version</code><code>=</code><code>"1.0.0"</code> <code>... &gt;</code>

<code>&lt;</code><code>dubbo:registry</code> <code>address</code><code>=</code><code>"127.0.0.1:9090"</code> <code>group</code><code>=</code><code>"simple"</code> <code>version</code><code>=</code><code>"1.0.0"</code> <code>/&gt;</code>

原文連結:[http://wely.iteye.com/blog/2333298]

繼續閱讀