3

dubbo Filter使用

 2 years ago
source link: https://segmentfault.com/a/1190000040755445
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

什么是dubbo filter

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

dubbo 提供了Filter接口类,我们只要定义一个自己的类,然后继承该接口即可实现自己的逻辑。
image.png
以实现一个传递链路唯一追踪号为案例来看下如何实现,比如现在我有一个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就完成了。

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

原生Filter

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK