[apache/dubbo]AbstractStateRouter类第120行invokers.and(routeResult)导致正确的Invoker被过滤

2023-12-15 338 views
4
Environment
  • Dubbo version: 3.2.1/3.2.2
  • Operating System version: windows/liunix
  • Java version: 1.8
Steps to reproduce this issue
  1. AbstractStateRouter 类中,类过滤的Invokers有7个
  2. 使用自定义的StateRouter进行过滤,命中5,6,7,共3个Invoker
  3. 返回AbstractStateRouter 类的第120行,执行 if (routeResult != invokers) { routeResult = invokers.and(routeResult); }
  4. invokers.and(routeResult)方法,只会在原有的7个Invokers按顺序选出3个结果,结果为第1,2,3个
  5. 由于正确的invoker没被选中,导致dubbo路由错误,调用失败 AgAACAhmkOunI206P-hOX6v_ohId1u9Q

回答

1

使用自定义的StateRouter进行过滤,命中5,6,7,共3个Invoker

这个怎么处理的

4

我们在dubbo接口上还有一层产品码注解,有ProductRouter extends AbstractStateRouter 进行产品码筛选。

0

一个接口会有多种产品码实现,ProductRouter 通过产品码进行过滤 命中5,6,7

5

在在3.0.X版本此功能都正常运行,升级到3.2.1之后,业务方反馈调用服务异常

6

通过修改了自定义的StateRouter中的BitList的用法,问题解决了 正确的BitList用法为在自定义的StateRouter中克隆doRouter方法传递过来的BitList BitList<Invoker> result = invokers.clone(); 使用remove方法来进行过滤 result.removeIf(index);

9

此问题为自定义StateRouter中的BitList的用法错误

8

@AlbumenJ @JagdtigerI 麻烦帮忙看看像下面这样写有问题吗?需求是通过HTTP请求里带的参数如果和dubbo provider配置的参数一样就优先使用那些provider

image
9

代码上看是没问题的