Dubbo 路由规则之标签路由

/**

      *

      * 标签路由

      *

      * @author liyong

      * @date 4:48 PM 2020/11/29

      * @param invokers

      * @param url

      * @param invocation

      * @exception

      * @return java.util.List>

      **/

     @Override

     public List> route(List> 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> result = invokers;

         // 获取上下文中 Attachment 的标签参数,这个参数由客户端调用时候写入

         String tag = StringUtils.isEmpty(invocation.getAttachment(TAG_KEY)) ? url.getParameter(TAG_KEY) :

                 invocation.getAttachment(TAG_KEY);

         // 如果存在传递标签

         if (StringUtils.isNotEmpty(tag)) {

             // 通过传递的标签找到动态配置对应的服务地址

             List 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> tmp = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(),

                         tagRouterRuleCopy.getAddresses()));

                 // 查找提供者标签为空

                 return filterInvoker(tmp, invoker -> StringUtils.isEmpty(invoker.getUrl().getParameter(TAG_KEY)));

             }

         } else {

             // 返回所有的 addresses

             List 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);

             });

         }

     }


请使用浏览器的分享功能分享到微信等