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。
一般都是使用XML配置方法,就是最後一個,示例如下:
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
3、只定閱
一個服務,可能依賴於系統中的其它很多服務。在開發、測試階段,Provider可以只向系統定閱自己依賴的服務,而不會把自己的服務註冊進Registry。如果想訪問這種只定閱的服務,Consumer端可通過上邊說的直連的方式訪問。只定閱服務是正常運行的,只不過是沒有註冊而已。
這個圖並沒有體現開發中的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"));
總之,靜態服務就是通過人式的形式完成服務的註冊與解除註冊。