dubbo Filter使用

本篇文章主要是介绍一下dubbo filter功能的使用以及其原理。

什么是dubbo filter

dubbo filter是dubbo提供的一项扩展的功能,dubbo在做调用的过程中,会先经过一层filter,顾名思义,也就是一层拦截过滤。通过dubbo filter功能,我们可以记录一些额外的操作日志、传递一些公共的信息、做一些自定义校验和权限控制等。

如何使用

dubbo 提供了Filter接口类,我们只要定义一个自己的类,然后继承该接口即可实现自己的逻辑。
dubbo Filter使用_第1张图片
以实现一个传递链路唯一追踪号为案例来看下如何实现,比如现在我有一个A服务,还有一个B服务,现在A服务有自己的逻辑链路追踪号,需要传递到B服务中去,使得两个服务能够用同一个追踪号来关联某一次请求的所有链路。
A服务先定义一个自己的Filter类并实现dubbo的Filter接口:

//对于服务提供端,Activate改为Constants.PROVIDER
@Activate(group = {Constants.CONSUMER})
public class UniqIdTraceFilter implements Filter {
    @Override
    public Result invoke(Invoker invoker, Invocation invocation) throws RpcException {
        //此处逻辑可以自定义
        String traceId = UUID.randomUUID().toString().replace("-", "");
        RpcContext.getContext().setAttachment("traceId", traceId);
        return invoker.invoke(invocation);
    }
}

再在resources目录下新建一个META-INF文件夹,在其下再创建一个dubbo目录。在META-INF\dubbo目录下创建一个名称为org.apache.dubbo.rpc.Filter(如果你用的是2.7之前的版本,则名称为com.alibaba.dubbo.rpc.Filter),如图:
image.png
在文件里写上你定义的filter全名
uniqIdTraceFilter=com.example.dubboanalyze.filter.UniqIdTraceFilter
到这里,我们演示的dubbo filter就完成了。

原理

上面介绍的案例非常简单,那么中间到底是怎么实现的呢?
这里要从服务引用的时候说起,我们在启动消费端的时候,dubbo会基于protocol创建一个invoker,invoker维护着某个接口的远程调用,在创建invoker的时候也是基于spi机制加载所有需要的Protocol,这里有一个Protocol就是ProtocolFilterWrapper
dubbo Filter使用_第2张图片
该Protocol在创建invoker的时候加载了所有的Filter,这里使用了责任链模式,我们在上面自定义的Filter就是被加载到这里的。
dubbo Filter使用_第3张图片
从代码中我们可以看到返回的Invoker是一个Filter的包装,传入的Invoker是在所有filter调用之后才会调用,这样就做到了过滤拦截的功能。

原生Filter

dubbo本身带有一些Filter实现,都发挥了各自的作用
dubbo Filter使用_第4张图片
比如GenericFilter就是dubbo用来拦截并实现泛化调用的功能,TokenFilter用来做调用的令牌验证,CacheFilter来实现缓存等。具体大家可以自己再去了解。

总结

dubbo filter本身的实现还是比较简单的,dubbo也提供了非常方便的自定义扩展。

你可能感兴趣的