因安全需要决定对dubbo进行安全升级,升级至2.7.22版本,升级过程中遇到泛化调用失败
主要错误提示:
Failed to invoke the method $invoke in the service org.apache.dubbo.rpc.service.GenericService. No provider available for the service XXXXX from registry 127.0.0.1:2181 on the consumer xxxxxx using the dubbo version 2.7.18. Please check if the providers have been started and registered. org.apache.dubbo.rpc.RpcException: Failed to invoke the method $invoke in the service org.apache.dubbo.rpc.service.GenericService. No provider available for the service XXXXX from registry 127.0.0.1:2181 on the consumer xxxxxx using the dubbo version 2.7.18. Please check if the providers have been started and registered.at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:288) ~[dubbo-2.7.18.jar:2.7.18]at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:59) ~[dubbo-2.7.18.jar:2.7.18]at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:265) ~[dubbo-2.7.18.jar:2.7.18]at org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor.intercept(ClusterInterceptor.java:47) ~[dubbo-2.7.18.jar:2.7.18]at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$InterceptorInvokerNode.invoke(AbstractCluster.java:92) ~[dubbo-2.7.18.jar:2.7.18]at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:98) ~[dubbo-2.7.18.jar:2.7.18]at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:170) ~[dubbo-2.7.18.jar:2.7.18]
原因:
dubbo服务提供者注册时添加了 dubbo.provider.tag 配置 ,在dubbo2.7.18 前调用方不带 tag 是可以调用注册带 tag的服务的,2.7.18 修复了还有就是2.7.18的泛化调用过滤器GenericFilter做了修改,如果重写了过滤器可以官方的修改。
问题复现:
条件1:dubbo使用版本 大于等于2.7.18
条件2:dubbo服务提供者xml配置tag属性
例:<dubbo:provider tag="test" />
条件3:dubbo客户端不进行 tag设置
问题解决办法:
方案一:服务提供者去除tag设置
方案二:服务消费者添加tag配置,并保持与服务提供者一样
dubbo tag作用说明:
在Dubbo中,可以使用
dubbo.provider.tag
属性来配置提供者的标签。这个标签可以用于消费者过滤目标提供者。要配置
dubbo.provider.tag
,可以在服务提供者的XML配置文件(例如provider.xml
)中添加一个dubbo:provider
元素,并在其中设置tag
属性的值。以下是一个示例:<dubbo:provider tag="test" />
在上面的示例中,标签被设置为"test"。你可以根据需要将其设置为任何你想要的值。
配置了
dubbo.provider.tag
后,消费者可以使用该标签来筛选可用的提供者。在消费者的XML配置文件(例如consumer.xml
)中,可以使用dubbo:reference
元素的filter
属性来指定消费者过滤提供者的规则。以下是一个示例:<dubbo:reference interface="com.example.SomeService" filter="tag=test" />
在上面的示例中,我们使用了
filter
属性并设置为tag=test
,以筛选具有"test"标签的提供者。通过这样的配置,你可以使用
dubbo.provider.tag
属性在Dubbo中配置提供者的标签,并使用消费者的过滤规则来选择特定标签的提供者。这对于在多个相同类型的提供者中进行选择是很有用的。