Dubbo的全局Filter配置


 

前言:
  之前也寫過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給了開發者很大自由度和空間.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM