apache / dubbo

The java implementation of Apache Dubbo. An RPC and microservice framework.
https://dubbo.apache.org/
Apache License 2.0
40.5k stars 26.43k forks source link

2.7.6 dubbo.consumer.cluster = failfast 失效 #6108

Closed ZhiQinIsZhen closed 4 years ago

ZhiQinIsZhen commented 4 years ago

Environment

Steps to reproduce this issue

  1. 消费端配置:dubbo.consumer.cluster = failfast
  2. 启动项目,debug发现使用了failover
  3. 但是打印出的日志却是failfast
  4. 换回2.7.5,初始化时用的是 FailfastCluster,调用正常,但是2.7.6,初始化的是FailoverCluster

Pls. provide [GitHub address] to reproduce this issue.

Expected Result

不进行重试

Actual Result

重试了2次

If there is an exception, please attach the exception trace:

[DUBBO] Notify urls for subscribe url consumer://10.1.64.48/com.xxx.remote.crm.service.warn.xxx?application=ai-api-web&category=providers,configurators,routers&check=false&cluster=failfast&dubbo=2.0.2&init=false&interface=com.xxx.remote.crm.service.warn.xxx&metadata-type=remote&methods=xxx&pid=19676&qos.enable=false&release=2.7.6&revision=1.0.0&side=consumer&sticky=false&timeout=1000&timestamp=1588757842211&version=1.0.0, urls: [dubbo://10.1.64.48:20885/com.xxx.remote.crm.service.warn.xxx?anyhost=true&application=service-crm&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.xxx.remote.crm.service.warn.xxx&metadata-type=remote&methods=xxx&pid=29572&release=2.7.6&revision=1.0.0&service.filter=remoteServiceExceptionFilter,-exception&side=provider&timeout=10000&timestamp=1588757859274&version=1.0.0], dubbo version: 2.7.6, current host: 10.1.64.48

moshenglin commented 4 years ago

不知道什么原因,2.7.6版本把RegistryDirectory.getUrl()方法删掉了(原来返回overrideDirectoryUrl里指定cluster),现在默认获取的是AbstractDirectory里的url,里面没有指定cluster,导致Cluster$Adpative全部返回默认failover

ZhiQinIsZhen commented 4 years ago

不知道什么原因,2.7.6版本把RegistryDirectory.getUrl()方法删掉了(原来返回overrideDirectoryUrl里指定cluster),现在默认获取的是AbstractDirectory里的url,里面没有指定cluster,导致Cluster$Adpative全部返回默认failover

其实这个影响还是挺大的,等待下一个版本释放吧

vergilyn commented 4 years ago

相同的问题 #5966

ZhiQinIsZhen commented 4 years ago

2.7.7我测试了下,注解也换成dubboService和dubboReference,没有在这个版本中进行修复

vergilyn commented 4 years ago

2.7.7我测试了下,注解也换成dubboService和dubboReference,没有在这个版本中进行修复

貌似确实还没有修复... 也不晓得后续😂 不过造成原因知道了...

ZhiQinIsZhen commented 4 years ago

2.7.7我测试了下,注解也换成dubboService和dubboReference,没有在这个版本中进行修复

貌似确实还没有修复... 也不晓得后续😂 不过造成原因知道了...

那我只能把代码修改下,自己打个包了,以为2.7.7修复了

ZhiQinIsZhen commented 4 years ago

如果实在要设置的话,加这个配置一样的 dubbo.consumer.retries=0

vergilyn commented 4 years ago

如果实在要设置的话,加这个配置一样的 dubbo.consumer.retries=0

可以是可以,但现在貌似只有failover(默认策略),其它的(failback、failsafe)都不可用了...

ZhiQinIsZhen commented 4 years ago

dubbo.consumer.retries=0

如果实在要设置的话,加这个配置一样的 dubbo.consumer.retries=0

可以是可以,但现在貌似只有failover(默认策略),其它的(failback、failsafe)都不可用了...

我打过包替换了common,也不行

bbpatience commented 4 years ago

这个我也遇到了, 想用 broadcast cluster,但不管怎么配,都是 Failover. 之前的哪个版本可以呢?

ZhiQinIsZhen commented 4 years ago

这个我也遇到了, 想用 broadcast cluster,但不管怎么配,都是 Failover. 之前的哪个版本可以呢?

2.7.5包含,或者之前的版本都可以,如果只是用到fastfail可以设置成retry=0

codemusik commented 4 years ago

这个我也遇到了, 想用 broadcast cluster,但不管怎么配,都是 Failover. 之前的哪个版本可以呢?

2.7.5包含,或者之前的版本都可以,如果只是用到fastfail可以设置成retry=0

为什么新版本去掉了呢?很不理解

vergilyn commented 4 years ago

这个我也遇到了, 想用 broadcast cluster,但不管怎么配,都是 Failover. 之前的哪个版本可以呢?

2.7.5包含,或者之前的版本都可以,如果只是用到fastfail可以设置成retry=0

为什么新版本去掉了呢?很不理解

应该不是刻意去掉.... 估计是某个版本造成的bug...

5966 中提到了原因了,但一直木得后续😂

ReferenceConfig.createProxy()中创建invoker时,执行RegistryProtocol#refer() -> RegistryProtocol.doRefer(),javassist 生成的adaptive-class:

public class Cluster$Adaptive implements org.apache.dubbo.rpc.cluster.Cluster {

    @Override
    public org.apache.dubbo.rpc.Invoker join(org.apache.dubbo.rpc.cluster.Directory arg0) throws org.apache.dubbo.rpc.RpcException {
// ....
        org.apache.dubbo.common.URL url = arg0.getUrl();  // url 中丢失failover参数,所以默认只有"failover"
        String extName = url.getParameter("cluster", "failover"); 

// ...
        org.apache.dubbo.rpc.cluster.Cluster extension =
                (org.apache.dubbo.rpc.cluster.Cluster)ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.cluster.Cluster.class).getExtension(extName);
        return extension.join(arg0);
    }
}
ZhiQinIsZhen commented 4 years ago

这个我也遇到了, 想用 broadcast cluster,但不管怎么配,都是 Failover. 之前的哪个版本可以呢?

2.7.5包含,或者之前的版本都可以,如果只是用到fastfail可以设置成retry=0

为什么新版本去掉了呢?很不理解

应该不是刻意去掉.... 估计是某个版本造成的bug...

5966 中提到了原因了,但一直木得后续😂

ReferenceConfig.createProxy()中创建invoker时,执行RegistryProtocol#refer() -> RegistryProtocol.doRefer(),javassist 生成的adaptive-class:

public class Cluster$Adaptive implements org.apache.dubbo.rpc.cluster.Cluster {

    @Override
    public org.apache.dubbo.rpc.Invoker join(org.apache.dubbo.rpc.cluster.Directory arg0) throws org.apache.dubbo.rpc.RpcException {
// ....
        org.apache.dubbo.common.URL url = arg0.getUrl();  // url 中丢失failover参数,所以默认只有"failover"
        String extName = url.getParameter("cluster", "failover"); 

// ...
        org.apache.dubbo.rpc.cluster.Cluster extension =
                (org.apache.dubbo.rpc.cluster.Cluster)ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.cluster.Cluster.class).getExtension(extName);
        return extension.join(arg0);
    }
}

2.7.8已经修复,棒棒哒