前言
日常在使用 Dubbo 的情况下,我们通常有许多功能,例如:限制请求的白名单、统一日志处理、Trace 传递、统一异常处理等等,这些功能我们可以通过 Dubbo 的调用拦截扩展来实现,它其实也是 DubboSPI 的扩展实现,下文概述如何使用这种机制。
调用拦截扩展
服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。详见:https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/spi/description/filter/
约定
- 用户自定义 filter 默认在内置 filter 之后。
- 特殊值 default,表示缺省扩展点插入的位置。比如:filter=”xxx,default,yyy”,表示 xxx 在缺省 filter 之前,yyy 在缺省 filter 之后。
- 特殊符号 -,表示剔除。比如:filter=”-foo1”,剔除添加缺省扩展点 foo1。比如:filter=”-default”,剔除添加所有缺省扩展点。
- provider 和 service 同时配置的 filter 时,累加所有 filter,而不是覆盖。比如:<dubbo:provider filter=”xxx,yyy”/> 和 <dubbo:service filter=”aaa,bbb” />,则 xxx,yyy,aaa,bbb 均会生效。如果要覆盖,需配置:<dubbo:service filter=”-xxx,-yyy,aaa,bbb” />
使用要点
- 若要使 filter 生效,必须在 META-INF/dubbo/org.apache.dubbo.rpc.Filter 声明 Filter,可以在当前项目中,也可以在一个单独的 jar 中。dubbo 会尝试获取 classpath 中的所有 META-INF/dubbo/org.apache.dubbo.rpc.Filter 文件
- Filter 使用了 @Activate 注解,或者 xml 配置文件中进行配置
1 | <!-- 消费方调用过程拦截 --> |
- 使用 telnet 进行接口测试时,过滤器不生效
- RPC 调用和泛化调用,过滤器都会生效
- @Activate 注解中的 order 值越小,优先级越高,越早执行,越晚结束
默认的过滤器
在 dubbo 源码中,META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter 配置了默认的过滤器:
1 | cache=org.apache.dubbo.cache.filter.CacheFilter |
有一些过滤器使用了@Activate 注解,所以默认会生效。
有些过滤器会在 consumer 端生效,有些是在 provider 生效,有些是两端都生效,有些还需要其他的一些条件才生效。
这些过滤器统称为 default。
入门示例
1 | @Activate(group = {Constants.PROVIDER}) // 服务端生效 |
META-INF/dubbo/org.apache.dubbo.rpc.Filter 文件中内容如下:
1 | customFilter01=filter.CustomFilter01 |
去掉默认的过滤器
<dubbo:service filter=”xxx,yyy” /> 未声明默认过滤器时,默认过滤器生效吗?
有一些默认过滤器使用了@Activate 注解,所以默认会生效。
@Activate 注解声明了服务端生效,这种过滤器可以给消费端用吗?
可以。在 xml 中配置即可。
@Activate 配置了 order, xml 配置文件中配置了 filter,执行顺序以哪个为准?
以配置文件为准。