Environment
- Dubbo version: 3.1.5
- Java version: 1.8
Steps to reproduce this issue
1.成功调用到提供端,但是返回异常,返回报:
[DUBBO] Decode rpc invocation failed: null, dubbo version: 3.1.5, current host: 192.168.0.190, error code: 4-20. This may be caused by , go to https://dubbo.apache.org/faq/4/20 to find instructions.
java.lang.NullPointerException: null
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
at org.apache.dubbo.rpc.support.GroupServiceKeyCache.getServiceKey(GroupServiceKeyCache.java:37)
at org.apache.dubbo.rpc.support.ProtocolUtils.serviceKey(ProtocolUtils.java:51)
at org.apache.dubbo.rpc.protocol.AbstractProtocol.serviceKey(AbstractProtocol.java:83)
at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.getInvoker(DubboProtocol.java:282)
2.使用的是dubbo 3.1.5
3.通过日志发现消费端会3次进入invoke方法,这个过滤器主要用来设置额外请求参数
过滤器代码如下:
`@Activate(group = {Constants.CONSUMER, Constants.PROVIDER}, order = -1)
public class DubboTenantFilter implements Filter {
protected final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
//判断是消费者 还是 服务提供者
System.out.println("invoke:"+RpcContext.getContext().isConsumerSide());
if (RpcContext.getContext().isConsumerSide()) {
//消费者 将tenant_id set至上下文中
RpcContext.getContext().setAttachment(DefConstants.TENANT_HEADER_KEY, TenantContextHolder.getTenantId());
} else {
String tenantId = RpcContext.getContext().getAttachment(DefConstants.TENANT_HEADER_KEY);
if(tenantId!=null){
TenantContextHolder.setTenantId(tenantId);
}
}
try {
return invoker.invoke(invocation);
}finally {
if (RpcContext.getContext().isProviderSide()) {
TenantContextHolder.clear();
}
}
}
}`
7条答案
按热度按时间23c0lvtd1#
1.通过日志发现消费端会3次进入invoke方法,这个过滤器主要用来设置额外请求参数
答:如果Filter是全局的则有些内部的调用,建议通过invocation获取接口名和方法名过滤掉不需要的
2 请问下面异常必现吗
java.lang.NullPointerException: null
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
at org.apache.dubbo.rpc.support.GroupServiceKeyCache.getServiceKey(GroupServiceKeyCache.java:37)
at org.apache.dubbo.rpc.support.ProtocolUtils.serviceKey(ProtocolUtils.java:51)
at org.apache.dubbo.rpc.protocol.AbstractProtocol.serviceKey(AbstractProtocol.java:83)
at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.getInvoker(DubboProtocol.java:282)
myss37ts2#
建议提供完整的invocation信息,两边dubbo 版本是否一致
zujrkrfu3#
1.通过日志发现消费端会3次进入invoke方法,这个过滤器主要用来设置额外请求参数 答:如果Filter是全局的则有些内部的调用,
2 请问下面异常必现吗
1.3次调用的是同一个接口方法名
2.异常是必现的
3.我的service写法如下:
55ooxyrt4#
我发现如果设置以下代码就会出现这个异常:
改成通过RpcContext上下文的方式获取参数调用就正常了,但是invoke也会调用3次,不知道会不会有影响
9gm1akwq5#
invoke也会调用3次
这个应该是重试了,请求远端失败
egmofgnx6#
我发现如果设置以下代码就会出现这个异常:
改成通过RpcContext上下文的方式获取参数调用就正常了,但是invoke也会调用3次,不知道会不会有影响
dubbo3.1.5 未复现此问题
没有出现重试和失败
filter 代码
eqzww0vc7#
@weixuehu 好兄弟,问题解决了吗?我也遇到了