记一次dubbo provider获取不到dubbo.tag问题排查

1. 背景

项目里通过dubbo.tag=gray传递灰度标,但是上游consumer已经在attachment里面设置dubbo.gray了,下游却拿不到

2. 排查过程

2.1. 前提

先把源码下载下来,方便排查

img

详细可见:tps://blog.csdn.net/qq_26012495/article/details/109694133

2.2. 怀疑是consumer哪个filter里将dubbo.tag值清空了

2.2.1. debug到consumer最终发起请求的地方,看到还是有dubbo.tag=gray

img

2.2.2. debug到provider入口地方,发现还有dubbo.tag,确认不是provider的问题

img

2.2.3. 但是到业务代码入口地方,就没有了

注:业务代码层通过RpcContext.getContext().getObjectAttachments()获取所有的attachment

img

2.3. 怀疑是provider哪个filter里将dubbo.tag清空了

2.3.1. debug到FilterNode的invoke方法,这个是所有的filter执行的基类

img

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

img

打开UNLOADING_KEYS看,里面TAG_KEY确实在(TAG_KEY=dubbo.tag)

img

img

3. 结论

dubbo set context的attachment时,UNLOADING_KEYS不会设置到attachment里。dubbo.tag要从invocation里拿,RpcContext.getContext().getObjectAttachments()里面是不会有的

可以通过以下的全局方法拿

RpcContext.getContext().getInvocation().getObjectAttachments()

4. debug技巧

如果外部请求很多,debug很容易被不相干的请求干扰,可以在能确认是自己请求的地方加上如下代码

img

然后打断点地方加上如下条件,就不怕断点到其他人的请求

"dubboTestValue".equals(RpcContext.getContext().getAttachment("dubboTest"))

关注公众号:关大仙的学习笔记

后续高质量文章都会发布到这个公众号上, 还有面试共享群可以添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值