org.apache.dubbo.rpc.Filter
核心功能
- 攔截RPC調用流程
Filter
是Dubbo框架中實現攔截邏輯的核心接口,作用于服務消費者和提供者的作業鏈路,支持在方法調用前后插入自定義邏輯。如參數校驗、異常處理、日志記錄等。 - 擴展性機制
Dubbo通過SPI擴展機制動態加載Filter實現類,構建鏈式調用結構,每個Filter通過Invoke
方案傳遞調用上下文,最終執行目標方法。
實現機制
- 責任鏈模式
Provider端Filter鏈在服務暴露時通過FilterChainBuilder#buildInvokerChain
方法構建,基于SPI配置按優先級排序,形成多層攔截邏輯。 - SPI加載規則
Filter實現類需要在META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
文件中聲明,并通過@Activate
注解配置激活條件(如服務端/消費端) - 動態加載
Filter鏈在服務初始化階段動態生成,通過ExtensionLoader
加載所有激活的Filter實例,并按順序包裝成調用鏈。
常見內置Filter實現
Filter名稱 | 功能描述 | 適用端 |
---|---|---|
ExceptionFilter | 統一處理服務端異常,將非受檢異常封裝為RuntimeException 返回客戶端 | Provider |
ValidationFilter | 基于JSR303標準校驗接口參數合法性 | Both |
AccessLogFilter | 記錄服務調用日志,指定輸出到指定文件 | Provider |
TimeoutFilter | 監控方法執行超時,觸發超時中斷邏輯 | Provider |
GenericFilter | 處理泛化調用的序列化與反序列化 | Both |
自定義Filter實現步驟
- 實現Filter接口
import com.alibaba.fastjson2.JSON;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;// 使用@Activate注解指定Filter生效場景
// order屬性控制執行順序,值越小,優先級越高
@Activate(group = {CommonConstants.CONSUMER, CommonConstants.PROVIDER}, order = 10001)
public class CustomFilter implements Filter {private Logger logger = LoggerFactory.getLogger(CustomFilter.class);@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {logger.info("invoker invoked method {} {} {} {}",invocation.getMethodName(),JSON.toJSONString(invocation.getObjectAttachments()),invocation.getAttributes(),JSON.toJSONString(invocation.getArguments()));Result result = invoker.invoke(invocation);logger.info("invoker invoked result {}", JSON.toJSONString(result));return result;}
}
- ?聲明SPI擴展?
在resources/META-INF/dubbo目錄下創建配置文件org.apache.dubbo.rpc.Filter,添加自定義Filter類路徑:
consumer=com.doudou.demo.filter.CustomFilter
ValidationFilter
Dubbo的ValidationFilter
是基于JSR303標準實現的參數校驗組件,主要用于服務消費者和服務提供者兩端,確保接口調用時參數的合法性。
核心特性
- 作用機制
- 通過
@Activate
注解激活,默認作用于消費者和服務者兩端,執行順序為10000。 - 在請求處理前攔截參數,利用JSR303標準的注解進行校驗,校驗失敗時拋出異常中斷流程。
- 通過
- 依賴配置
- 需要引入
validation-api
和hibernate-validator
依賴包<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version> </dependency> <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.0.Final</version> </dependency>
- 需要引入
使用
@Setter
@Getter
public class ValidateUserInfo implements Serializable {private static final long serialVersionUID = 1558193327511325424L;// 添加了 @NotBlank 注解 @NotBlank(message = "id 不能為空")private String id;// 添加了 @Length 注解 @Length(min = 5, max = 10, message = "name 必須在 5~10 個長度之間")private String name;private String sex;
}
@DubboReference(validation = "jvalidation")
private ValidationFacade validationFacade;
@DubboService(validation = "jvalidation")
public class ValidationFacadeImpl implements ValidationFacade {}