dubbo条件路由

dubbo条件路由学习

场景

两套zookeeper(3.7.1)集群

1
2
zk1 -> 192.168.183.164:2181
zk2 -> 192.168.183.164:2182

1

两套dubbo-admin

代码:https://github.com/apache/dubbo-admin

1
2
3
4
5
# 修改properties中的zk地址
# centers in dubbo2.7, if you want to add parameters, please add them to the url
admin.registry.address=zookeeper://192.168.183.164:2181
admin.config-center=zookeeper://192.168.183.164:2181
admin.metadata-report.address=zookeeper://192.168.183.164:2181

一份demo工程

1
2
github
https://github.com/PromiseChan/PromiseChan.github.io/files/11336241/dubbo-samples-spring-boot.zip

工程结构

一个消费方,关联 2套zk集群

两个提供方,各自关联一套zk集群

dubbo-samples-spring-boot-interface, 服务存根模块

1
2
3
4
5
-dubbo-samples-spring-boot
--dubbo-consumer
--dubbo-provider-20881
--dubbo-provider-20880
--dubbo-samples-spring-boot-interface

实验

在管理平台上设置条件

1
2
3
4
5
enabled: true
force: true
runtime: true
conditions:
- 'application=dubbo-springboot-demo-consumer => address=*:20880'

2

消费方无限循环调用,会发生如下两种现象交替出现,验证条件路由生效

  1. 无提供方

    当消费方选择 从 zk2 上查询提供方时,因为条件路由(只能调用20880端口的提供方),因此筛选后,无提供方,直接抛出异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  [DUBBO] No provider available after connectivity filter for the service org.apache.dubbo.springboot.demo.DemoService All validInvokers' size: 1 All routed invokers' size: 0 All invokers' size: 1 from registry 192.168.183.164:2182 on the consumer 192.168.56.1 using the dubbo version 3.2.0-beta.6., dubbo version: 3.2.0-beta.6, current host: 192.168.56.1, error code: 2-2. This may be caused by provider server or registry center crashed, go to https://dubbo.apache.org/faq/2/2 to find instructions. 
org.apache.dubbo.rpc.RpcException: Failed to invoke the method sayHello in the service org.apache.dubbo.springboot.demo.DemoService. No provider available for the service org.apache.dubbo.springboot.demo.DemoService from registry 192.168.183.164:2182 on the consumer 192.168.56.1 using the dubbo version 3.2.0-beta.6. Please check if the providers have been started and registered.
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:367)
at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:60)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:341)
at org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter.invoke(RouterSnapshotFilter.java:46)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:101)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.metrics.filter.MetricsClusterFilter.invoke(MetricsClusterFilter.java:49)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:52)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.spring.security.filter.ContextHolderParametersSelectedTransferFilter.invoke(ContextHolderParametersSelectedTransferFilter.java:41)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter.invoke(ConsumerClassLoaderFilter.java:40)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter.invoke(ConsumerContextFilter.java:118)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:331)
at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:194)
at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$ClusterFilterInvoker.invoke(AbstractCluster.java:92)
at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:103)
at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:284)
at org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareClusterInvoker.doInvoke(ZoneAwareClusterInvoker.java:103)
at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:341)
at org.apache.dubbo.rpc.proxy.InvocationUtil.invoke(InvocationUtil.java:57)
at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:75)
at org.apache.dubbo.springboot.demo.DemoServiceDubboProxy1.sayHello(DemoServiceDubboProxy1.java)
at sun.reflect.GeneratedMethodAccessor58.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy55.sayHello(Unknown Source)
at org.apache.dubbo.springboot.demo.consumer.Task.lambda$run$0(Task.java:40)
at java.lang.Thread.run(Thread.java:748)
  1. 调用成功

当消费方选择 从 zk1 上查询提供方时,因为条件路由(只能调用20880端口的提供方),因此筛选后,有提供方,请求发给提供方

1
2
Thu Apr 27 01:55:43 CST 2023 Receive result ======> Hello world, response from provider: 192.168.56.1:20880
Thu Apr 27 01:55:44 CST 2023 Receive result ======> Hello world, response from provider: 192.168.56.1:20880