Dubbo自定义拦截器

问题

在微服务项目中,需要通过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

以上操作即可。

猜你喜欢

转载自blog.csdn.net/Ellis_li/article/details/127240670