1. 背景
项目里通过dubbo.tag=gray传递灰度标,但是上游consumer已经在attachment里面设置dubbo.gray了,下游却拿不到
2. 排查过程
2.1. 前提
先把源码下载下来,方便排查
详细可见:tps://blog.csdn.net/qq_26012495/article/details/109694133
2.2. 怀疑是consumer哪个filter里将dubbo.tag值清空了
2.2.1. debug到consumer最终发起请求的地方,看到还是有dubbo.tag=gray
2.2.2. debug到provider入口地方,发现还有dubbo.tag,确认不是provider的问题
2.2.3. 但是到业务代码入口地方,就没有了
注:业务代码层通过RpcContext.getContext().getObjectAttachments()获取所有的attachment
2.3. 怀疑是provider哪个filter里将dubbo.tag清空了
2.3.1. debug到FilterNode的invoke方法,这个是所有的filter执行的基类
2.3.2. 刚进来的时候RpcContext.getContext().getObjectAttachments()获取的是空
2.3.3. 执行完ContextFilter.invoke,RpcContext.getContext().getObjectAttachments()里有值了,但是没有dubbo.tag,问题大概定位到是这个类里了
2.3.4. debug到这个类里看,发现有这样两行代码,不在UNLOADING_KEYS里的才会put到newAttach,再赋值给attachments
打开UNLOADING_KEYS看,里面TAG_KEY确实在(TAG_KEY=dubbo.tag)
3. 结论
dubbo set context的attachment时,UNLOADING_KEYS不会设置到attachment里。dubbo.tag要从invocation里拿,RpcContext.getContext().getObjectAttachments()里面是不会有的
可以通过以下的全局方法拿
RpcContext.getContext().getInvocation().getObjectAttachments()
4. debug技巧
如果外部请求很多,debug很容易被不相干的请求干扰,可以在能确认是自己请求的地方加上如下代码
然后打断点地方加上如下条件,就不怕断点到其他人的请求
"dubboTestValue".equals(RpcContext.getContext().getAttachment("dubboTest"))