问题
在微服务项目中,需要通过dubbo传递一些数据,如用户信息、如日志链路的id等,这些都可以通过dubbo的RpcContext进行传递。
但是当请求进入到微服务时,需要有一个拦截器来拦截保存这些数据到上下文中或MDC中。
这个时候服务中就需要一个自定义的拦截器,来拦截dubbo的rpc请求,进而进行处理。
解决
自定义拦截器
package com.weibo.user.filter;
import com.alibaba.fastjson.JSON;
import com.weibo.common.entity.UserRpcContext;
import com.weibo.common.entity.UserToken;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.slf4j.MDC;
@Slf4j
@Activate(group = CommonConstants.PROVIDER)
public class RpcInvokeFilter implements Filter {
private static final String TRACE_ID = "traceId";
private static final String USER = "user";
/**
* 调用
*
* @param invoker 调用程序
* @param invocation 调用
* @return {@link Result}
* @throws RpcException rpc异常
*/
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
// 执行方法
String traceId = RpcContext.getContext().getAttachment(TRACE_ID);
String userStr = RpcContext.getContext().getAttachment(USER);
UserToken userToken = JSON.parseObject(userStr, UserToken.class);
UserRpcContext.setUser(userToken);
MDC.put(TRACE_ID, traceId);
return invoker.invoke(invocation);
}
}
注意:
自定义中的拦截器继承的是dubbo的Filter
这就完事了吗? 还有~
需要在resources下加一个文件
如上图:
META-INFO是一层文件夹
dubbo是一层文件夹
org.apache.dubbo.rpc.Filter 是一个文件
文件中内容如下:
dubboProviderFilter=com.weibo.user.filter.RpcInvokeFilter
以上操作即可。