本篇文章次要是介绍一下dubbo filter性能的应用以及其原理。

什么是dubbo filter

dubbo filter是dubbo提供的一项扩大的性能,dubbo在做调用的过程中,会先通过一层filter,顾名思义,也就是一层拦挡过滤。通过dubbo filter性能,咱们能够记录一些额定的操作日志、传递一些公共的信息、做一些自定义校验和权限管制等。

如何应用

dubbo 提供了Filter接口类,咱们只有定义一个本人的类,而后继承该接口即可实现本人的逻辑。

以实现一个传递链路惟一追踪号为案例来看下如何实现,比方当初我有一个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),如图:

在文件里写上你定义的filter全名
uniqIdTraceFilter=com.example.dubboanalyze.filter.UniqIdTraceFilter
到这里,咱们演示的dubbo filter就实现了。

原理

还在学习等级2的同学能够只看到下面就好,这里介绍的原理就到等级3了。
下面介绍的案例非常简单,那么两头到底是怎么实现的呢?
这里要从服务援用的时候说起,咱们在启动生产端的时候,dubbo会基于protocol创立一个invoker,invoker保护着某个接口的近程调用,在创立invoker的时候也是基于spi机制加载所有须要的Protocol,这里有一个Protocol就是ProtocolFilterWrapper

该Protocol在创立invoker的时候加载了所有的Filter,这里应用了责任链模式,咱们在下面自定义的Filter就是被加载到这里的。

从代码中咱们能够看到返回的Invoker是一个Filter的包装,传入的Invoker是在所有filter调用之后才会调用,这样就做到了过滤拦挡的性能。

原生Filter

dubbo自身带有一些Filter实现,都施展了各自的作用

比方GenericFilter就是dubbo用来拦挡并实现泛化调用的性能,TokenFilter用来做调用的令牌验证,CacheFilter来实现缓存等。具体大家能够本人再去理解。

总结

dubbo filter自身的实现还是比较简单的,dubbo也提供了十分不便的自定义扩大。