本篇文章主要是介绍一下dubbo filter功能的使用以及其原理。
什么是dubbo filter
dubbo filter是dubbo提供的一项扩展的功能,dubbo在做调用的过程中,会先经过一层filter,顾名思义,也就是一层拦截过滤。通过dubbo filter功能,我们可以记录一些额外的操作日志、传递一些公共的信息、做一些自定义校验和权限控制等。
如何使用自定义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就完成了。
如何使用原生filter
Dubbo 内置了一些 Filter 实现,这些 Filter 在平时默认是不会启用的,因为上面没有加 @Activate 标签,比如 MetricsFilter
那我们想要使用的话,怎么启用呢?其实很简单,只要在配置中添加对应的filter就可以了
当然同理,对于我们自己实现的 Filter,也可以通过这种方式使用,而不是添加 @Activate 标签。
原理
上面介绍的案例非常简单,那么中间到底是怎么实现的呢?
这里要从服务引用的时候说起,我们在启动消费端的时候,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也提供了非常方便的自定义扩展。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。