前言
本文基于Dubbo2.6.x版本,中文注釋版原始碼已上傳github:xiaoguyu/dubbo
今天,來聊點短的,服務路由Router,本文講的是路由的呼叫路徑,不講路由的規則決議,想了解規則決議的可以去官方檔案:服務路由
Dubbo的路由,就是根據規則,規定了哪些服務消費者可呼叫哪些服務提供者,
怎么用
我們可以在服務治理控制臺Dubbo-Admin寫入路由規則,
安裝Dubbo-Admin
我是使用docker方式安裝的,命令如下:
docker run -d \
-p 9001:8080 \
-e admin.root.user.name=admin \
-e admin.root.user.password=admin \
-e admin.registry.address='zookeeper://127.0.0.1:2181' \
-e admin.config-center='zookeeper://127.0.0.1:2181' \
-e admin.metadata-report.address='zookeeper://127.0.0.1:2181' \
--name dubbo-admin \
apache/dubbo-admin
-e部分的引數說明,看官方介紹Dubbo Admin配置說明
配置規則
瀏覽器localhost:9001訪問Dubbo-Admin控制臺,選單選擇 服務治理→條件路由

點擊創建按鈕,填寫相關引數即可

詳細引數請參考官方檔案:路由規則用法示例
原始碼
先來看看類圖

Router就是路由介面,其有3個實作類,
Router介面有3個方法:
-
URL getUrl();
-
List<Invoker
> route(List<Invoker > invokers, URL url, Invocation invocation); 路由的選擇方法,篩選出符合條件的invoker
-
int getPriority();
獲取優先級,用于排序
訂閱
當在Dubbo-Admin中配置了路由規則,會在注冊中心的routes節點創建子節點,這里就包含了路由配置的資料

在上一篇文章講服務目錄的時候,說過RegistryDirectory會訂閱providers、consumers、configurators、routers等節點的,這里面就包含了routers
具體的轉換邏輯在RegistryDirectory#toRouters方法中
private List<Router> toRouters(List<URL> urls) {
List<Router> routers = new ArrayList<Router>();
if (urls == null || urls.isEmpty()) {
return routers;
}
if (urls != null && !urls.isEmpty()) {
for (URL url : urls) {
if (Constants.EMPTY_PROTOCOL.equals(url.getProtocol())) {
continue;
}
String routerType = url.getParameter(Constants.ROUTER_KEY);
if (routerType != null && routerType.length() > 0) {
url = url.setProtocol(routerType);
}
try {
// 工廠生成route
Router router = routerFactory.getRouter(url);
if (!routers.contains(router))
routers.add(router);
} catch (Throwable t) {
logger.error("convert router url to router error, url: " + url, t);
}
}
}
return routers;
}
routerFactory是自適應拓展類,此處我們設定的是條件路由,所以routerFactory實際上是ConditionRouterFactory
public class ConditionRouterFactory implements RouterFactory {
public static final String NAME = "condition";
@Override
public Router getRouter(URL url) {
return new ConditionRouter(url);
}
}
這個route工廠也很簡單,就是創建了一個ConditionRouter,具體的決議邏輯都在其構造方法中,
規則過濾
路由的核心,就是Router介面的route方法,那么route方法在哪里被參考呢
-
服務目錄重繪invoker串列時
當服務目錄訂閱注冊中心資訊時,會重繪invoker串列,此時會呼叫路由

-
消費者獲取invoker時
消費者要向生產者發起呼叫時,依賴的是invoker,此時invoker的獲取,需要經過路由篩選

總結
本文講了服務路由的資料獲取以及呼叫程序,路由的核心就是篩選invoker
參考資料
Dubbo開發指南
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500912.html
標籤:其他
上一篇:ABAP-7.40新語法(二)
