Skip to content

Commit bf29eb5

Browse files
authored
Add router fail fast option (Backport #9388) (#11188)
* Add router fail fast option (Backport #9388) * update
1 parent 326fb72 commit bf29eb5

File tree

2 files changed

+11
-1
lines changed
  • dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster
  • dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration

2 files changed

+11
-1
lines changed

dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java

+2
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,6 @@ public interface Constants {
103103
* prefix of arguments router key
104104
*/
105105
String ARGUMENTS = "arguments";
106+
107+
String SHOULD_FAIL_FAST_KEY = "dubbo.router.should-fail-fast";
106108
}

dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/DynamicDirectory.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apache.dubbo.common.URL;
2020
import org.apache.dubbo.common.URLBuilder;
2121
import org.apache.dubbo.common.Version;
22+
import org.apache.dubbo.common.config.ConfigurationUtils;
2223
import org.apache.dubbo.common.extension.ExtensionLoader;
2324
import org.apache.dubbo.common.logger.Logger;
2425
import org.apache.dubbo.common.logger.LoggerFactory;
@@ -33,6 +34,7 @@
3334
import org.apache.dubbo.rpc.RpcException;
3435
import org.apache.dubbo.rpc.cluster.Cluster;
3536
import org.apache.dubbo.rpc.cluster.Configurator;
37+
import org.apache.dubbo.rpc.cluster.Constants;
3638
import org.apache.dubbo.rpc.cluster.RouterChain;
3739
import org.apache.dubbo.rpc.cluster.RouterFactory;
3840
import org.apache.dubbo.rpc.cluster.directory.AbstractDirectory;
@@ -94,6 +96,11 @@ public abstract class DynamicDirectory<T> extends AbstractDirectory<T> implement
9496

9597
protected ServiceInstancesChangedListener serviceListener;
9698

99+
/**
100+
* Should continue route if directory is empty
101+
*/
102+
private final boolean shouldFailFast;
103+
97104
public DynamicDirectory(Class<T> serviceType, URL url) {
98105
super(url, true);
99106

@@ -114,6 +121,7 @@ public DynamicDirectory(Class<T> serviceType, URL url) {
114121
this.overrideDirectoryUrl = this.directoryUrl = turnRegistryUrlToConsumerUrl(url);
115122
String group = directoryUrl.getParameter(GROUP_KEY, "");
116123
this.multiGroup = group != null && (ANY_VALUE.equals(group) || group.contains(","));
124+
this.shouldFailFast = Boolean.parseBoolean(ConfigurationUtils.getProperty(Constants.SHOULD_FAIL_FAST_KEY, "true"));
117125
}
118126

119127
@Override
@@ -162,7 +170,7 @@ public void unSubscribe(URL url) {
162170

163171
@Override
164172
public List<Invoker<T>> doList(Invocation invocation) {
165-
if (forbidden) {
173+
if (forbidden && shouldFailFast) {
166174
// 1. No service provider 2. Service providers are disabled
167175
throw new RpcException(RpcException.FORBIDDEN_EXCEPTION, "No provider available from registry " +
168176
getUrl().getAddress() + " for service " + getConsumerUrl().getServiceKey() + " on consumer " +

0 commit comments

Comments
 (0)