前言:
以前也寫過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