前言:
之前也寫過dubbo的filter的文章, 后來和同事也有過交流, 才發生自己對dubbo的filter的機制, 還是存在一些誤解, 尤其是自定義filter的定位, 不是那么清晰. 本文主要是補充一下, 自定義的filter如何成為全局filter, 或者說, 它不需要在bean的定義申明中指定filter標簽.
前文回顧:
1. Dubbo透傳traceId/logid的一種思路
2. Dubbo的Filter鏈梳理---分組可見和順序調整
3. Dubbo的Filter實戰--整合Oval校驗框架
案列:
比如自定義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文件, 其內容為
statFilter=com.test.StatFilter
而對於每個需要用到該filter的dubbo provider/consumer, 都需要在xml申明中添加filter標簽, 比如:
<dubbo:reference id="echoService" check="false" interface="com.test.EchoService" filter="statFilter" />
對於具體的一個dubbo provider/consumer實例這種的配置, 絕對沒問題, 問題是如果要作用所有的dubbo provider/consumer實例, 這樣的copy/paste有點low.
全局配置:
其實實現全局配置, 非常的簡單, 一種方式是通過額外的配置, 一種通過指定@Activate的group實現.
1. 額外的配置方式
以上文的案例為例, 在resource目錄下, 添加dubbo.properties文件, 然后配置如下:
# 如果該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給了開發者很大自由度和空間.
