dubbo提供了web filter類似的com.alibaba.dubbo.rpc.Filter,這樣,我們可以在dubbo提供的服務提供方和消費方都可以自定義過濾 器,從而可以獲得方法調用的時間或參數、返回結果及異常信息。我們可以利用log打印出來。而且,這個過濾器機制,也是分布式跟蹤系統的一部分。
下面代碼實例是一個自定義過濾器例子,獲得方法調用的參數、返回結果、執行時間及異常信息的log功能。
- public class ElapsedTimeFilter implements Filter {
- private static Logger log = LoggerFactory
- .getLogger(ElapsedTimeFilter.class);
- @Override
- public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
- long start = System.currentTimeMillis();
- Result result = invoker.invoke(invocation);
- long elapsed = System.currentTimeMillis() - start;
- if (invoker.getUrl() != null) {
- // log.info("[" +invoker.getInterface() +"] [" + invocation.getMethodName() +"] [" + elapsed +"]" );
- log.info("[{}], [{}], {}, [{}], [{}], [{}] ", invoker.getInterface(), invocation.getMethodName(),
- Arrays.toString(invocation.getArguments()), result.getValue(),
- result.getException(), elapsed);
- }
- return result;
- }
- }
其實,dubbo內部,也有很多已經實現好的不同功能的過濾器,如:

我們自定義了過濾器,還的按照dubbo spi機制,還得需要配置:

在服務消費方或提供方還需要配上這個過濾器,消費方例子:
- <dubbo:consumer id="xx"
- filter="elapsedTimeFilter"
- retries="0"/>
