From 0aed71989b8866c24f645bb77ac42d605cb88de4 Mon Sep 17 00:00:00 2001 From: xiuyuhang <442367943@qq.com> Date: Thu, 21 Feb 2019 17:45:04 +0800 Subject: [PATCH 1/3] Dump TagRouterRule since the TagRouterRule can be changed to `null` by ConfigCenter --- .../dubbo/rpc/cluster/router/tag/TagRouter.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java index c8e8750bff4..b012f6f9cee 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java @@ -91,18 +91,20 @@ public List> route(List> invokers, URL url, Invocation return filterUsingStaticTag(invokers, url, invocation); } + // because the rule can changed, we should dump one to use. + TagRouterRule dump = tagRouterRule; List> result = invokers; String tag = StringUtils.isEmpty(invocation.getAttachment(TAG_KEY)) ? url.getParameter(TAG_KEY) : invocation.getAttachment(TAG_KEY); // if we are requesting for a Provider with a specific tag if (StringUtils.isNotEmpty(tag)) { - List addresses = tagRouterRule.getTagnameToAddresses().get(tag); + List addresses = dump.getTagnameToAddresses().get(tag); // filter by dynamic tag group first if (CollectionUtils.isNotEmpty(addresses)) { result = filterInvoker(invokers, invoker -> addressMatches(invoker.getUrl(), addresses)); // if result is not null OR it's null but force=true, return result directly - if (CollectionUtils.isNotEmpty(result) || tagRouterRule.isForce()) { + if (CollectionUtils.isNotEmpty(result) || dump.isForce()) { return result; } } else { @@ -118,13 +120,13 @@ public List> route(List> invokers, URL url, Invocation // FAILOVER: return all Providers without any tags. else { List> tmp = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(), - tagRouterRule.getAddresses())); + dump.getAddresses())); return filterInvoker(tmp, invoker -> StringUtils.isEmpty(invoker.getUrl().getParameter(TAG_KEY))); } } else { // List addresses = tagRouterRule.filter(providerApp); // return all addresses in dynamic tag group. - List addresses = tagRouterRule.getAddresses(); + List addresses = dump.getAddresses(); if (CollectionUtils.isNotEmpty(addresses)) { result = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(), addresses)); // 1. all addresses are in dynamic tag group, return empty list. @@ -136,17 +138,17 @@ public List> route(List> invokers, URL url, Invocation } return filterInvoker(result, invoker -> { String localTag = invoker.getUrl().getParameter(TAG_KEY); - return StringUtils.isEmpty(localTag) || !tagRouterRule.getTagNames().contains(localTag); + return StringUtils.isEmpty(localTag) || !dump.getTagNames().contains(localTag); }); } } /** * If there's no dynamic tag rule being set, use static tag in URL. - * + *

* A typical scenario is a Consumer using version 2.7.x calls Providers using version 2.6.x or lower, * the Consumer should always respect the tag in provider URL regardless of whether a dynamic tag rule has been set to it or not. - * + *

* TODO, to guarantee consistent behavior of interoperability between 2.6- and 2.7+, this method should has the same logic with the TagRouter in 2.6.x. * * @param invokers From e73b4601fe42cbe679b5674e18260ff4d82efd7a Mon Sep 17 00:00:00 2001 From: xiuyuhang <442367943@qq.com> Date: Thu, 21 Feb 2019 17:49:56 +0800 Subject: [PATCH 2/3] Fix --- .../org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java index b012f6f9cee..02413c7a168 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java @@ -87,12 +87,12 @@ public List> route(List> invokers, URL url, Invocation return invokers; } - if (tagRouterRule == null || !tagRouterRule.isValid() || !tagRouterRule.isEnabled()) { + // since the rule can be changed by config center, we should dump one to use. + TagRouterRule dump = tagRouterRule; + if (dump == null || !dump.isValid() || !dump.isEnabled()) { return filterUsingStaticTag(invokers, url, invocation); } - // because the rule can changed, we should dump one to use. - TagRouterRule dump = tagRouterRule; List> result = invokers; String tag = StringUtils.isEmpty(invocation.getAttachment(TAG_KEY)) ? url.getParameter(TAG_KEY) : invocation.getAttachment(TAG_KEY); From 00ba994e2bf0fcdc060fe1ac0e81d1f159eae829 Mon Sep 17 00:00:00 2001 From: xiuyuhang <442367943@qq.com> Date: Thu, 7 Mar 2019 18:05:57 +0800 Subject: [PATCH 3/3] rename --- .../dubbo/rpc/cluster/router/tag/TagRouter.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java index 02413c7a168..df419228fe1 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java @@ -87,9 +87,9 @@ public List> route(List> invokers, URL url, Invocation return invokers; } - // since the rule can be changed by config center, we should dump one to use. - TagRouterRule dump = tagRouterRule; - if (dump == null || !dump.isValid() || !dump.isEnabled()) { + // since the rule can be changed by config center, we should copy one to use. + final TagRouterRule tagRouterRuleCopy = tagRouterRule; + if (tagRouterRuleCopy == null || !tagRouterRuleCopy.isValid() || !tagRouterRuleCopy.isEnabled()) { return filterUsingStaticTag(invokers, url, invocation); } @@ -99,12 +99,12 @@ public List> route(List> invokers, URL url, Invocation // if we are requesting for a Provider with a specific tag if (StringUtils.isNotEmpty(tag)) { - List addresses = dump.getTagnameToAddresses().get(tag); + List addresses = tagRouterRuleCopy.getTagnameToAddresses().get(tag); // filter by dynamic tag group first if (CollectionUtils.isNotEmpty(addresses)) { result = filterInvoker(invokers, invoker -> addressMatches(invoker.getUrl(), addresses)); // if result is not null OR it's null but force=true, return result directly - if (CollectionUtils.isNotEmpty(result) || dump.isForce()) { + if (CollectionUtils.isNotEmpty(result) || tagRouterRuleCopy.isForce()) { return result; } } else { @@ -120,13 +120,13 @@ public List> route(List> invokers, URL url, Invocation // FAILOVER: return all Providers without any tags. else { List> tmp = filterInvoker(invokers, invoker -> addressNotMatches(invoker.getUrl(), - dump.getAddresses())); + tagRouterRuleCopy.getAddresses())); return filterInvoker(tmp, invoker -> StringUtils.isEmpty(invoker.getUrl().getParameter(TAG_KEY))); } } else { // List addresses = tagRouterRule.filter(providerApp); // return all addresses in dynamic tag group. - List addresses = dump.getAddresses(); + 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. @@ -138,7 +138,7 @@ public List> route(List> invokers, URL url, Invocation } return filterInvoker(result, invoker -> { String localTag = invoker.getUrl().getParameter(TAG_KEY); - return StringUtils.isEmpty(localTag) || !dump.getTagNames().contains(localTag); + return StringUtils.isEmpty(localTag) || !tagRouterRuleCopy.getTagNames().contains(localTag); }); } }