Dubbo 路由規則之標籤路由

專注的阿熊發表於2021-05-27

/**

      *

      * 標籤路由

      *

      * @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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章