/**
*
* 标签路由
*
* @author liyong
* @date 4:48 PM 2020/11/29
* @param invokers
* @param url
* @param invocation
* @exception
* @return java.util.List
**/
@Override
public
if (CollectionUtils.isEmpty(invokers)) {
return invokers;
}
// 这里因为配置中心可能更新配置,所有使用另外一个常量引用(类似复制)
final TagRouterRule tagRouterRuleCopy = tagRouterRule;
// 如果动态规则不存在或无效或没有激活,使用静态标签
if (tagRouterRuleCopy == null || !tagRouterRuleCopy.isValid() || !tagRouterRuleCopy.isEnabled()) {
// 处理静态标签
return filterUsingStaticTag(invokers, url, invocation);
}
List
// 获取上下文中 Attachment 的标签参数,这个参数由客户端调用时候写入
String tag = StringUtils.isEmpty(invocation.getAttachment(TAG_KEY)) ? url.getParameter(TAG_KEY) :
invocation.getAttachment(TAG_KEY);
// 如果存在传递标签
if (StringUtils.isNotEmpty(tag)) {
// 通过传递的标签找到动态配置对应的服务地址
List
// 通过标签分组进行过滤
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
tagRouterRuleCopy.getAddresses()));
// 查找提供者标签为空
return filterInvoker(tmp, invoker -> StringUtils.isEmpty(invoker.getUrl().getParameter(TAG_KEY)));
}
} else {
// 返回所有的 addresses
List
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);
});
}
}