This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch dev-metadata in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/dev-metadata by this push: new 4700f2c create separate RouterChain for StaticDirectory 4700f2c is described below commit 4700f2c585d410c401cea9022ae95e55b8c2cc77 Author: ken.lj <ken.lj...@gmail.com> AuthorDate: Thu Nov 29 14:05:08 2018 +0800 create separate RouterChain for StaticDirectory --- .../src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java | 3 +++ .../org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java | 9 +++++++++ .../java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java | 3 ++- .../dubbo/rpc/cluster/support/RegistryAwareClusterInvoker.java | 2 +- .../org/apache/dubbo/registry/integration/RegistryDirectory.java | 4 +++- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java index 7b13b9e..2848904 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java @@ -164,6 +164,9 @@ public class RouterChain<T> { public List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) { List<Invoker<T>> finalInvokers = invokers; + if (treeCache.getTree() != null) { + finalInvokers = treeCache.getInvokers(treeCache.getTree(), url, invocation); + } for (Router router : routers) { if (router.isRuntime()) { finalInvokers = router.route(invokers, url, invocation); diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java index 154fafe..07b6419 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java @@ -19,12 +19,14 @@ package org.apache.dubbo.rpc.cluster.directory; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.configcenter.DynamicConfiguration; import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.cluster.RouterChain; import java.util.List; +import java.util.Map; /** * StaticDirectory @@ -86,6 +88,13 @@ public class StaticDirectory<T> extends AbstractDirectory<T> { invokers.clear(); } + public void buildRouterChain(Map<String, List<Invoker<T>>> methodGroupInvokers, DynamicConfiguration dynamicConfiguration) { + ; + RouterChain<T> routerChain = RouterChain.buildChain(dynamicConfiguration, getUrl()); + routerChain.notifyFullInvokers(methodGroupInvokers, getUrl()); + this.setRouterChain(routerChain); + } + @Override protected List<Invoker<T>> doList(Invocation invocation) throws RpcException { List<Invoker<T>> finalInvokers = invokers; diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java index 188e0a1..da5e04d 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java @@ -80,8 +80,9 @@ public class ClusterUtils { // All providers come to here have been filtered by group, which means only those providers that have the exact same group value with the consumer could come to here. // So, generally, we don't need to care about the group value here. // But when comes to group merger, there is an exception, the consumer group may be '*' while the provider group can be empty or any other values. - localMap.remove(Constants.GROUP_KEY); + String remoteGroup = map.get(Constants.GROUP_KEY); map.putAll(localMap); + map.put(Constants.GROUP_KEY, remoteGroup); } if (remoteMap != null && remoteMap.size() > 0) { // Use version passed from provider side diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/RegistryAwareClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/RegistryAwareClusterInvoker.java index dfd8156..1d5d42b 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/RegistryAwareClusterInvoker.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/RegistryAwareClusterInvoker.java @@ -44,7 +44,7 @@ public class RegistryAwareClusterInvoker<T> extends AbstractClusterInvoker<T> { public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException { // First, pick the invoker (XXXClusterInvoker) that comes from the local registry, distinguish by a 'default' key. for (Invoker<T> invoker : invokers) { - if (invoker.getUrl().getParameter(Constants.REGISTRY_KEY + "." + Constants.DEFAULT_KEY, false)) { + if (invoker.isAvailable() && invoker.getUrl().getParameter(Constants.REGISTRY_KEY + "." + Constants.DEFAULT_KEY, false)) { return invoker.invoke(invocation); } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java index ac29f28..bdf7a54 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java @@ -378,7 +378,9 @@ public class RegistryDirectory<T> extends AbstractDirectory<T> implements Notify List<Invoker<T>> groupInvokers = new ArrayList<Invoker<T>>(); for (List<Invoker<T>> groupList : groupMap.values()) { StaticDirectory<T> staticDirectory = new StaticDirectory<>(groupList); - staticDirectory.setRouterChain(routerChain); + Map<String, List<Invoker<T>>> methodGroupInvokers = new HashMap<>(); + methodGroupInvokers.put(method, groupInvokers); + staticDirectory.buildRouterChain(methodGroupInvokers, dynamicConfiguration); groupInvokers.add(cluster.join(staticDirectory)); } result.put(method, groupInvokers);