本篇文章次要是介绍一下 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 也提供了十分不便的自定义扩大。