Dubbo 路由規則之標籤路由
/**
*
* 標籤路由
*
* @author liyong
* @date 4:48 PM 2020/11/29
* @param invokers
* @param url
* @param invocation
* @exception
* @return java.util.List<org.apache.dubbo.rpc.Invoker<T>>
**/
@Override
public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
if (CollectionUtils.isEmpty(invokers)) {
return invokers;
}
// 這裡因為配置中心可能更新配置,所有使用另外一個常量引用(類似複製)
final TagRouterRule tagRouterRuleCopy = tagRouterRule;
// 如果動態規則不存在或無效或沒有啟用,使用靜態標籤
if (tagRouterRuleCopy == null || !tagRouterRuleCopy.isValid() || !tagRouterRuleCopy.isEnabled()) {
// 處理靜態標籤
return filterUsingStaticTag(invokers, url, invocation);
}
List<Invoker<T>> result = invokers;
// 獲取上下文中 Attachment 的標籤引數,這個引數由客戶端呼叫時候寫入
String tag = StringUtils.isEmpty(invocation.getAttachment(TAG_KEY)) ? url.getParameter(TAG_KEY) :
invocation.getAttachment(TAG_KEY);
// 如果存在傳遞標籤
if (StringUtils.isNotEmpty(tag)) {
// 透過傳遞的標籤找到動態配置對應的服務地址
List<String> addresses = tagRouterRuleCopy.getTagnameToAddresses().get(tag);
// 透過標籤分組進行過濾
if (CollectionUtils.isNotEmpty(addresses)) {
// 獲取匹配地址的服務
result = filterInvoker(invokers, invoker -> addressMatches(invoker.getUrl(), addresses));
// 如果返回結果不為 null 或者 外匯跟單gendan5.com返回結果為空但是配置 force=true 也直接返回
if (CollectionUtils.isNotEmpty(result) || tagRouterRuleCopy.isForce()) {
return result;
}
} else {
// 檢測靜態標籤
result = filterInvoker(invokers, invoker -> tag.equals(invoker.getUrl().getParameter(TAG_KEY)));
}
// 如果提供者沒有配置標籤 預設 force.tag = false 表示可以訪問任意的提供者 ,除非我們顯示的禁止
if (CollectionUtils.isNotEmpty(result) || isForceUseTag(invocation)) {
return result;
}
else {
// 返回所有的提供者,不需要任意標籤
List<Invoker<T>> tmp = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(),
tagRouterRuleCopy.getAddresses()));
// 查詢提供者標籤為空
return filterInvoker(tmp, invoker -> StringUtils.isEmpty(invoker.getUrl().getParameter(TAG_KEY)));
}
} else {
// 返回所有的 addresses
List<String> addresses = tagRouterRuleCopy.getAddresses();
if (CollectionUtils.isNotEmpty(addresses)) {
result = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(), addresses));
// 1. all addresses are in dynamic tag group, return empty list.
if (CollectionUtils.isEmpty(result)) {
return result;
}
}
// 繼續使用靜態標籤過濾
return filterInvoker(result, invoker -> {
String localTag = invoker.getUrl().getParameter(TAG_KEY);
return StringUtils.isEmpty(localTag) || !tagRouterRuleCopy.getTagNames().contains(localTag);
});
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2774299/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 靜態路由規則配置路由
- zuul 自定義路由規則Zuul路由
- MSE標籤路由支援JDK 11嗎?路由JDK
- laravel8中的路由規則更改Laravel路由
- HCNP Routing&Switching之BGP路由屬性和優選規則路由
- HCNP Routing&Switching之OSPF LSA更新規則和路由彙總路由
- 線上debug&gateway自定義路由規則Gateway路由
- CI4路由設定規則路由
- react-router v4 路由規則解析React路由
- 分庫分表之歷史表如何選擇最佳分片路由規則路由
- Dubbo原始碼分析十一、服務路由原始碼路由
- Angular 使用 RouteReuseStrategy (路由複用策略) 實現後臺 TAB 標籤Angular路由
- vue專案重複點選同一標籤路由報錯Vue路由
- apisix~路由字首的正則匹配API路由
- 通過 ProxySQL 在 TiDB 上實現 SQL 的規則化路由SQLTiDB路由
- Dubbo 路由及負載均衡效能最佳化路由負載
- 最佳實踐:路徑路由匹配規則的設計與實現路由
- Tars | 第4篇 Subset路由規則業務分析與原始碼探索路由原始碼
- 德國制定路由器安全指南 完全遵守可獲特殊認證標籤路由器
- Angular路由——子路由Angular路由
- Vue路由+Tab元件實現多頁籤功能Vue路由元件
- MySQL中介軟體之ProxySQL(7):詳述ProxySQL的路由規MySql路由
- 八、路由詳細介紹之動態路由OSPF(重點)路由
- 前端路由(手寫路由)前端路由
- Angular路由——路由守衛Angular路由
- Angular路由——輔助路由Angular路由
- Angular路由——路由基礎Angular路由
- OSPF路由 與 ISIS路由 與路由學習對比路由
- Tars | 第5篇 基於TarsGo Subset路由規則的Java JDK實現方式(上)Go路由JavaJDK
- Tars | 第6篇 基於TarsGo Subset路由規則的Java JDK實現方式(下)Go路由JavaJDK
- Discuz!X3.1標籤偽靜態修改和偽靜態規則
- Spring Cloud Gateway 路由轉發之After(Before)路由斷言工廠使用SpringCloudGateway路由
- Vue開發之基礎路由Vue路由
- JS 之 script標籤JS
- HTML之常用標籤HTML
- HTML之表格標籤HTML
- HTML之框架標籤HTML框架
- 靜態路由和動態路由路由