Dubbo的Provider直連、只定閱、靜態服務(三)

1、參考

Provider直連:http://dubbo.apache.org/en-us/docs/user/demos/explicit-target.html

只定閱:http://dubbo.apache.org/zh-cn/docs/user/demos/subscribe-only.html

靜態服務:http://dubbo.apache.org/zh-cn/docs/user/demos/static-service.html

本文涉及的內容大多與開發、測試相關,這些功能會爲Dubbo應用的開發、測試帶來便利。

2、Provider直連

正常情況下,Provider端需要向Registry註冊服務,Consumer端需要從Registry定閱服務。並且Consumer端持續監聽Registry,當Provider提供的服務有變化時,Consumer端能夠及時發現這種變動。並且Consumer端會將同一接口的多個服務實例組成一個Cluster,基於此Cluster實現容錯、負載均衡、路由等功能,基本上需要藉助Registry實現服務治理功能。

但是有時候,比如在開發或者測試環境下,只是打算在Consumer端調用一下Provider碼的代碼,測試一下功能,不需要關心Registry提供的這種服務治理功能,這個時候可以繞過Registry,Consumer端直接連接某個Provider。並且這種直連功能是以接口爲單位的,假如Consumer端調用接口A與B,如果爲A接口配置了直連,則B接口是不受影響的,後者還是會從Registry取得Provider信息,還是會組成Cluster。

/user-guide/images/dubbo-directly.jpg

一般都是使用XML配置方法,就是最後一個,示例如下:

<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />

3、只定閱

一個服務,可能依賴於系統中的其它很多服務。在開發、測試階段,Provider可以只向系統定閱自己依賴的服務,而不會把自己的服務註冊進Registry。如果想訪問這種只定閱的服務,Consumer端可通過上邊說的直連的方式訪問。只定閱服務是正常運行的,只不過是沒有註冊而已。

/user-guide/images/subscribe-only.jpg

這個圖並沒有體現開發中的Provider繞過了註冊,卻沒有體現出它可以定閱其它服務。

只定閱以Provider爲單位(直連以接口爲單位),主要是配置Registry,如下:

<dubbo:registry address="10.20.153.10:9090" register="false" />

或者:

<dubbo:registry address="10.20.153.10:9090?register=false" />

意思就是本Provider只向Registry定閱服務,不向它註冊服務。

3、靜態服務

一般情況下,服務總是在啓動的時候向Registry註冊,並且雙方之間建立長連接,Registry通過心跳檢測服務是否在線,如果連接斷或者心跳檢測不到,那麼就相當於解除註冊了。

有時候需要手動控制服務的上線與下線,這個時候就可以使用靜態服務了,它也是圍繞着Registry展開的。服務正常啓動,但它不自動向Registry註冊,同樣,如果服務關停,它也不會自動告訴Registry解除註冊。配置如下:

<dubbo:registry address="10.20.141.150:9090" dynamic="false" />

或者:

<dubbo:registry address="10.20.141.150:9090?dynamic=false" />

我猜測,靜態服務與Registry這間應該不會建立長連接,雙方不會維持心跳。

默認Dubbo的Provider會啓動一個telnet的監聽端口,可通過向此端口發送指令命令服務主動向Registry註冊,或者是向Registry發送指令強制解除註冊,一般通過腳本或者頁面進行。

另外,有時候不需要在配置文件中明確設置Registry地十,例如對於已經啓動的每三方Memcached服務,可通過寫如下代碼主動完成註冊:

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo"));

總之,靜態服務就是通過人式的形式完成服務的註冊與解除註冊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章