首页 > IT职业 > IT生活 > 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博客 ” ,链接:https://blog.itpub.net/69946337/viewspace-2774299/ ,如需转载,请注明出处,否则将追究法律责任。