前言:
以前也写过dubbo的filter的文章, 后来和同事也有过交流, 才发生本身对dubbo的filter的机制, 仍是存在一些误解, 尤为是自定义filter的定位, 不是那么清晰. 本文主要是补充一下, 自定义的filter如何成为全局filter, 或者说, 它不须要在bean的定义申明中指定filter标签.html
前文回顾:
1. Dubbo透传traceId/logid的一种思路
2. Dubbo的Filter链梳理---分组可见和顺序调整
3. Dubbo的Filter实战--整合Oval校验框架 java
案列:
好比自定义filter, 以下:框架
package com.test public class StatFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { return invoker.invoke(invocation); } }
其须要作的额外工做以下:
在META-INF/dubbo目录下, 添加com.alibaba.dubbo.rpc.Filter文件, 其内容为ide
statFilter=com.test.StatFilter
而对于每一个须要用到该filter的dubbo provider/consumer, 都须要在xml申明中添加filter标签, 好比:xml
<dubbo:reference id="echoService" check="false" interface="com.test.EchoService" filter="statFilter" />
对于具体的一个dubbo provider/consumer实例这种的配置, 绝对没问题, 问题是若是要做用全部的dubbo provider/consumer实例, 这样的copy/paste有点low.htm
全局配置:
其实实现全局配置, 很是的简单, 一种方式是经过额外的配置, 一种经过指定@Activate的group实现.
1. 额外的配置方式
以上文的案例为例, 在resource目录下, 添加dubbo.properties文件, 而后配置以下:blog
# 若是该filter要做用于为provider dubbo.provider.filter=com.test.StatFilter # 若是该filter要做用于为consumer dubbo.consumer.filter=com.test.StatFilter
具体的目录结果以下:
2. 指定@Activate的group
这个方法, 就比较简单了, 并且也不须要额外的配置文件了开发
package com.test import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo.common.extension.Activate; @Activate( group = {Constants.PROVIDER, Constants.CONSUMER}, order = -2000 ) public class StatFilter implements Filter { @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { return invoker.invoke(invocation); } }
总结:
权当作笔记吧, 确实dubbo filter给了开发者很大自由度和空间.rpc