Dubbo Ops條件路由實戰

Dubbo的服務智能容錯包括服務目錄、服務路由和負載均衡這三個部分。服務目錄的作用是存儲一個接口的invoker的集合,並且隨着配置信息的更新而自動更新。而服務路由則是從服務目錄的involer集合中,根據路由規則篩選出一個子集。而負載均衡則是在服務路由篩選出的子集中去做負載均衡。

服務路由不是在一個服務的提供者端或者消費者端進行配置的,而是通過在配置中心中寫入配置信息,消費者會自動接收到通知。

Dubbo Ops是新一代的Dubbo服務治理控制檯,通過它可以對服務進行管理,包括服務查詢,服務治理(條件路由、標籤路由、黑白名單、負載均衡等),服務測試、服務mock、統計、配置管理等。

下面就介紹一個demo,看如何用Dubbo Ops對Dubbo服務進行路由。本文使用的操作系統是macOS

一.搭建應用:

1.下載zookeeper,作爲服務註冊中心和配置中心。並進入bin目錄,執行命令:

./zkServer.sh start

啓動zookeeper服務

2.下載Dubbo源碼,Dubbo源碼中包含demo模塊,可直接使用,避免自己搭建服務的麻煩。此處下載的是2.7.1-SNAPSHOT版本,使用master分支。

使用demo模塊中的xml配置模塊,修改spring配置文件中,registry的配置修改爲

<dubbo:registry address="zookeeper://127.0.0.1:2181" />

(因爲zookeeper默認的端口爲2181)

3.啓動provider。

二.搭建Dubbo Ops

1.下載Dubbo Ops源代碼,下載地址爲:

https://github.com/apache/incubator-dubbo-ops

可以直接下載zip包,也可以使用git。

2.運行Dubbo Ops的後臺服務。Dubbo Ops分爲後臺和前端兩個獨立的模塊。後臺是一個標準的Spring Boot項目,可以在Java IDE中直接運行。

3.運行Dubbo Ops的前端服務。Dubbo Ops的前端使用node構建。運行方式爲從終端進入前端項目的根目錄,執行以下命令:

npm run dev

此處可能會出現很多報錯,可能是權限不足,此時需要使用sudo。或者是缺少很多node的module,當出現這種報錯時,可以手動安裝缺失的module。具體命令可以搜索得到。

此時打開:

http://localhost:8081

並選擇服務查詢菜單,可看到已經註冊的服務。

三.配置條件路由

引用dubbo官方文檔的內容:

條件路由規則由兩個條件組成,分別用於對服務消費者和提供者進行匹配。比如有這樣一條規則:

host = 10.20.153.10 => host = 10.20.153.11

該條規則表示 IP 爲 10.20.153.10 的服務消費者只可調用 IP 爲 10.20.153.11 機器上的服務,不可調用其他機器上的服務。條件路由規則的格式如下:

[服務消費者匹配條件] => [服務提供者匹配條件]

如果服務消費者匹配條件爲空,表示不對服務消費者進行限制。如果服務提供者匹配條件爲空,表示對某些服務消費者禁用服務。官方文檔中對條件路由進行了比較詳細的介紹,大家可以參考下,這裏就不過多說明了。

條件路由實現類 ConditionRouter 在進行工作前,需要先對用戶配置的路由規則進行解析,得到一系列的條件。然後再根據這些條件對服務進行路由。

在Dubbo Ops進行配置:

Dubbo在2.7版本之後可從服務或應用兩個維度進行配置。此處是從服務維度。配置的規則的含義是從192.168.10.102(我的機器在局域網內的ip)這個消費者發起的調用,只有ip爲172.22.3.91(隨意輸入的ip)的提供者才能被調用成功。

四.從消費者發起調用。運行consumer模塊的Application類的main方法。運行日誌會出現關於條件路由的信息:

同時調用失敗,報錯信息如下:

異常堆棧:

Exception in thread "main" org.apache.dubbo.rpc.RpcException: Failed to invoke the method sayHello in the service org.apache.dubbo.demo.DemoService. No provider available for the service org.apache.dubbo.demo.DemoService from registry 127.0.0.1:2181 on the consumer 192.168.10.102 using the dubbo version . Please check if the providers have been started and registered.
    at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:265)
    at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:57)
    at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:242)
    at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:76)
    at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:57)
    at org.apache.dubbo.common.bytecode.proxy0.sayHello(proxy0.java)
    at org.apache.dubbo.demo.consumer.Application.main(Application.java:37)

可見,因爲運行中的提供者不滿足路由條件,所以被過濾掉了,沒有出現在可用的invoker列表中。又因爲沒有其他的invoker,所以報了這個錯。

如果去掉這個條件路由,再次執行,會發現可以正常調用服務。

五.其他問題:

通過實驗,發現應用維度的條件路由不會生效。原因不明,如果以後hack代碼知道之後,再更新說明。

 

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