之前写过一篇博客是在provider方利用拦截器来处理异常或者打印日志,具体见dubbo的filter
现在要在上游服务调用下游dubbo服务的同时,也把一部分通用参数传入下游来做请求的链路追踪,这些通用参数放入接口参数不现实,且会影响其他服务调用方,于是就利用RpcContext来做隐式参数传递。
当一个上游一个http请求过来时,通过拦截器将通用参数放入MDC中,MDC是和线程相关的,里边的修饰符是ThreadLocal,具体可以见MDC,之后利用拦截器统一将参数塞入。多线程时候会出现子线程拿不到父线程的上下文信息,具体解决办法参考我的另外一篇博客[异步实现上下文信息传递]()
拦截器代码如下:
@Activate(group = CommonConstants.CONSUMER)
@Slf4j
public class DubboHeadFilter extends ListenableFilter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String headParam = ("headerParam");JSONObject param = JSONObject.parseObject(headParam);for (Map.Entry<String,Object> temp :Set()){Context().Key(), String.Value()));}MDC.clear();return invoker.invoke(invocation);}
}
实测set下游收不到,但是setAttachment就能收到,还没查到set和setAttachment有什么区别,有了解的可以回复一下。
之后要在resource路径下创建META-INF.dubbo文件夹,新建文件org.apache.dubbo.rpc.Filter,文件内容写:
定义的拦截器别名=拦截器文件全路径名(***.***.DubboHeadFilter)
之后切记,pom文件中要修改
<resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources>
不然拦截器是不生效的。
其实大致过程和provider的写法一样。我因为pom文件未修改导致拦截器不生效,查了好半天。
TIPS:记得用完清空MDC,不然可能内存泄漏
本文发布于:2024-02-02 15:44:42,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170685988144795.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |