之前写过一篇博客是在provider方利用拦截器来处理异常或者打印日志,具体见dubbo的filter 现在要在上游服务调用下游dubbo服务的同时,也把一部分通用参数传入下游来做请求的链路追踪,这些通用参数放入接口参数不现实,且会影响其他服务调用方,于是就利用RpcContext来做隐式参数传递。 当一个上游一个http请求过来时,通过拦截器将通用参数放入MDC中,MDC是和线程相关的,里边的修饰符是ThreadLocal,具体可以见MDC,之后利用拦截器统一将参数塞入。拦截器代码如下:
@Activate(group = CommonConstants.CONSUMER)
@Slf4j
public class DubboHeadFilter extends ListenableFilter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String headParam = MDC.get("headerParam");
JSONObject param = JSONObject.parseObject(headParam);
for (Map.Entry<String,Object> temp :param.entrySet()){
RpcContext.getContext().setAttachment(temp.getKey(), String.valueOf(temp.getValue()));
}
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>**
不然拦截器是不生效的。 其实大致过程和provider的写法一样。我因为pom文件未修改导致拦截器不生效,查了好半天。
|