dubbo 3.x 中 dubbo.reference.*,dubbo.service.* 等属性服覆盖导致配置不生效问题

xbp102n0  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(74)
  • I have searched the issues of this repository and believe that this is not a duplicate.

Environment

  • Dubbo version: 3.1.4
  • Operating System version: mac os
  • Java version: 1.8

Steps to reproduce this issue

仓库地址 https://github.com/web1992/demo-dubbo3x-overwrite

dubbo 3.x 中 dubbo.reference.* , dubbo.service.* 等属性服覆盖导致配置不生效问题复现。

  1. 启动 com.gbdmf.demo.dubbo3.EmbeddedZooKeeper
  2. 启动 com.gbdmf.demo.dubbo3.xml.provider.DubboXmlProviderApplication
  3. 启动 com.gbdmf.demo.dubbo3.xml.consumer.DubboXmlConsumerApplication

启动项目发现consumer中配置的超时时间没有生效!

在 dubbo-consumer.xml 中配置了接口 com.gbdmf.demo.dubbo3.api.GreetingsService
的超时时间 6000 ms,但是如果我在 DubboXmlConsumerApplication 文件中设置了
System.setProperty("dubbo.reference.timeout", "3000") 系统变量,那么在 xml 中设置的超时时间就会被覆盖了。导致超时时间设置不生效。

此问题是在dubbo 3.x 中才出现的问题,这个会导致项目中的接口配置的超时时间都会失效。而且问题很难排查。

此外我用了 nacos 这样的配置中心,如果在 nacos 的配置中心,配置了公共的配置,比如 dubbo.reference.timeout=3000 这个命名规范刚好满足了dubbo 属性的覆盖规则。那么就影响了所有的服务!
目前在服务升级3.x 的时候就遇到了这个问题。

目前的解决方式展示查找项目中所有这样的配置,改掉。但是成本很大

超时日志

... 30 more
Caused by: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2023-02-08 11:57:30.556, end time: 2023-02-08 11:57:33.594, client elapsed: 42 ms, server elapsed: 2996 ms, timeout: 3000 ms, request: Request [id=0, version=2.0.2, twoWay=true, event=false, broken=false, data=RpcInvocation [methodName=sayHi, parameterTypes=[class java.lang.String]]], channel: /10.16.51.27:63220 -> /10.16.51.27:20881
	at org.apache.dubbo.remoting.exchange.support.DefaultFuture.doReceived(DefaultFuture.java:222)
	at org.apache.dubbo.remoting.exchange.support.DefaultFuture.received(DefaultFuture.java:186)
	at org.apache.dubbo.remoting.exchange.support.DefaultFuture$TimeoutCheckTask.notifyTimeout(DefaultFuture.java:305)
	at org.apache.dubbo.remoting.exchange.support.DefaultFuture$TimeoutCheckTask.lambda$run$0(DefaultFuture.java:292)
	at org.apache.dubbo.common.threadpool.ThreadlessExecutor$RunnableWrapper.run(ThreadlessExecutor.java:184)
	at org.apache.dubbo.common.threadpool.ThreadlessExecutor.waitAndDrain(ThreadlessExecutor.java:103)
	at org.apache.dubbo.rpc.AsyncRpcResult.get(AsyncRpcResult.java:194)
	... 35 more
pinkon5k

pinkon5k1#

我看了这个issues 中 #7890 说明 dubbo 的覆盖规则,但是这个默认的规则 是否需要打开吗?如果打开,给使用者带来了很多的困惑,我感觉不是很值的。

cqoc49vn

cqoc49vn2#

#11505 应该和这个 PR 相关

目前的设计是 dubbo.reference.*dubbo.reference.timeout 的只会默认覆盖在没有配置 timeout 的所有 ReferenceConfig (如果已经配置的属性会忽略); dubbo.reference.com.interface.DemoService.*dubbo.reference.com.interface.DemoService.timeout 会覆盖 com.interface.DemoService 对应的 ReferenceConfigtimeout (无论是否已经配置)。

实际上,如 PR 里面修复的,目前检查属性是否已经配置的逻辑有问题,导致无法正确判断是否已经配置了,所以出现总是覆盖的问题。

相关问题