dubbo 參數校驗-ValidationFilter

org.apache.dubbo.rpc.Filter

核心功能

  1. 攔截RPC調用流程
    Filter是Dubbo框架中實現攔截邏輯的核心接口,作用于服務消費者和提供者的作業鏈路,支持在方法調用前后插入自定義邏輯。如參數校驗、異常處理、日志記錄等。
  2. 擴展性機制
    Dubbo通過SPI擴展機制動態加載Filter實現類,構建鏈式調用結構,每個Filter通過Invoke方案傳遞調用上下文,最終執行目標方法。

實現機制

  1. 責任鏈模式
    Provider端Filter鏈在服務暴露時通過FilterChainBuilder#buildInvokerChain方法構建,基于SPI配置按優先級排序,形成多層攔截邏輯。
  2. SPI加載規則
    Filter實現類需要在META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter文件中聲明,并通過@Activate注解配置激活條件(如服務端/消費端)
  3. 動態加載
    Filter鏈在服務初始化階段動態生成,通過ExtensionLoader加載所有激活的Filter實例,并按順序包裝成調用鏈。

常見內置Filter實現

Filter名稱功能描述適用端
ExceptionFilter統一處理服務端異常,將非受檢異常封裝為RuntimeException返回客戶端Provider
ValidationFilter基于JSR303標準校驗接口參數合法性Both
AccessLogFilter記錄服務調用日志,指定輸出到指定文件Provider
TimeoutFilter監控方法執行超時,觸發超時中斷邏輯Provider
GenericFilter處理泛化調用的序列化與反序列化Both

自定義Filter實現步驟

  1. 實現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;}
}
  1. ?聲明SPI擴展?
    在resources/META-INF/dubbo目錄下創建配置文件org.apache.dubbo.rpc.Filter,添加自定義Filter類路徑:
    consumer=com.doudou.demo.filter.CustomFilter

ValidationFilter

Dubbo的ValidationFilter是基于JSR303標準實現的參數校驗組件,主要用于服務消費者和服務提供者兩端,確保接口調用時參數的合法性。

核心特性

  1. 作用機制
    • 通過@Activate注解激活,默認作用于消費者和服務者兩端,執行順序為10000。
    • 在請求處理前攔截參數,利用JSR303標準的注解進行校驗,校驗失敗時拋出異常中斷流程。
  2. 依賴配置
    • 需要引入validation-apihibernate-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 {}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Lesson 16 A polite request

Lesson 16 A polite request 詞匯 park n. 公園&#xff0c;停車場&#xff0c;莊園 v. 停車&#xff0c;泊車 例句&#xff1a;讓我來停車。    Let me park. 相關&#xff1a;spot n. 車位 區別&#xff1a;garden n. 花園 [小&#xff0c;私家的] 例句&#xff1a;我們…

解決 Builroot 系統編譯 perl 編譯報錯問題

本文提供一種修復 Builroot 系統編譯 perl 編譯報錯途徑 2025-05-04T22:45:08 rm -f pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/ln -s perldelta.pod pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/gcc -c -DPERL_CORE -fwrapv -fpcc-struct-return -pipe -f…

Spring MVC 中解決中文亂碼問題

在 Spring MVC 中解決中文亂碼問題&#xff0c;需要從 請求參數編碼 和 響應內容編碼 兩方面入手。以下是完整的解決方案&#xff1a; 一、解決請求參數中文亂碼 1. POST 請求編碼&#xff08;表單提交&#xff09; 配置 CharacterEncodingFilter 在 web.xml 中添加 Spring 提…

MYSQL數據庫突然消失

之前在下載mysql時發現沒有my.ini。考慮到后面的項目可能需要&#xff0c;看著教程自己創建了一次&#xff0c;當時就發生了所有數據庫消失的問題&#xff0c;近幾天這種事件又發生了。我在服務里看到我有mysql和mysql57兩個服務&#xff0c;啟動一個的時候另一個就無法啟動&am…

【Spring】idea + maven 從零創建Spring IoC容器示例

【Spring】idea maven 從零創建Spring IoC容器示例 1. 環境準備2. 創建maven項目3. 添加依賴4. 創建Java類與接口4.1 定義接口UserService4.2 實現接口UserServiceImpl 5. 配置Spring IoC容器6. 編寫主類調用IoC容器擴展&#xff1a;使用注解方式實現IoC1. 修改beans.xml2.使用…

面試回答之STAR結構

面試回答之STAR結構 1. STAR結構的起源 STAR是行為面試法&#xff08;Behavioral Interview&#xff09;的核心框架&#xff0c;由以下四個單詞首字母組成&#xff1a; ? Situation&#xff08;情境&#xff09; ? Task&#xff08;任務&#xff09; ? Action&#xff…

Kubernetes部署運行應用

①使用 Deployment 運行一個無狀態應用 ②運行一個單實例有狀態應用 ③運行一個有狀態的應用程序 ④使用 Persistent Volumes 部署 WordPress 和 MySQL

二叉搜索樹的最近祖先(遞歸遍歷)

235. 二叉搜索樹的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; class Solution { private:TreeNode*traversal(TreeNode*cur,TreeNode*p,TreeNode*q){if(curNULL){return NULL;}if(cur->val>p->val&&cur->val>q->val){TreeNode*lefttrave…

網絡:TCP三次握手、四次揮手

目錄 深刻理解三次握手 深刻理解四次揮手 深刻理解三次握手 三次握手時&#xff0c;如果最后一個ACK包&#xff0c;服務器沒有收到&#xff0c;此時&#xff1a; 客戶端&#xff1a;認為已經建立鏈接 服務器&#xff1a;認為沒有建立鏈接&#xff0c;還在超時等待。 而此…

MySQL 實戰 45 講 筆記 ----來源《極客時間》

01 | 基礎架構&#xff1a;一條SQL查詢語句是如何執行的&#xff1f; 1. MySQL 可以分為 Server層 和 存儲引擎層 兩部分。Server 層包括連接器、查詢緩存、分析器、優化器、執行器等。存儲引擎層支持 InnoDB、MyISAM等. (1) 連接器&#xff1a;管理連接&#xff0c;權限認證…

nextjs+supabase vercel部署失敗

1.不能含有<any> 改成unknown或者增加類(如圖) 2.檢查vecel是否配置環境變量&#xff08;即supabase的url和anon-key&#xff09;

數據庫Mysql_聯合查詢

或許自己的不完美才是最完美的地方&#xff0c;那些讓自己感到不安的瑕疵&#xff0c;最終都會變成自己的特色。 ----------陳長生. 1.介紹 1.1.為什么要進行聯合查詢 在數據設計的時候&#xff0c;由于范式的需求&#xff0c;會被分為多個表&#xff0c;但是當我們要查詢數據…

(37)VTK C++開發示例 ---紋理地球

文章目錄 1. 概述2. CMake鏈接VTK3. main.cpp文件4. 演示效果 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;VTK開發 &#x1f448; 1. 概述 將圖片紋理貼到球體上&#xff0c;實現3D地球的效果。 該代碼使用了 VTK (Visualization Toolkit) 庫來創建一個紋理…

VMware-centOS7安裝redis分布式集群

1.部署redis包 1.1 在usr/local文件夾里創建文件夾 mkdir software 1.2 進入文件夾 cd /usr/local/software/ 下載redis wget http://download.redis.io/releases/redis-6.2.6.tar.gz解壓 tar zxvf redis-6.2.6.tar.gz重命名文件夾 mv redis-6.2.6 redis安裝gcc編譯器 yum i…

【RocketMQ Broker 相關源碼】- broker 啟動源碼(2)

文章目錄 1. 前言2. 創建 DefaultMessageStore3. DefaultMessageStore#load3.1 CommitLog#load3.2 loadConsumeQueue 加載 ConsumeQueue 文件3.3 創建 StoreCheckpoint3.4 indexService.load 加載 IndexFile 文件3.5 recover 文件恢復3.6 延時消息服務加載 4. registerProcesso…

認識含鹽褶皺和沖斷帶中的前造山運動蒸發巖變形

主要觀察結果的示意圖模型&#xff0c;并提出了三疊紀前造山蒸發巖變形的演化模型。&#xff08;a&#xff09; 蒸發巖的初始平緩隆起&#xff0c;在鹽枕和鹽背斜頂部有滑塌褶皺和同沉積伸展斷層。&#xff08;b&#xff09; 底辟形成&#xff0c;主動刺穿和拖動折疊長底辟&…

數據庫MySQL學習——day8(復習與鞏固基礎知識)

文章目錄 1. 數據庫基礎概念復習2. 常用SQL命令復習2.1 SELECT 查詢數據2.2 INSERT 插入數據2.3 UPDATE 更新數據2.4 DELETE 刪除數據 3. 表操作復習3.1 創建表3.2 修改表3.3 刪除表 4. 實踐任務4.1 創建樣例數據庫和表4.2 插入和更新數據4.3 使用WHERE、ORDER BY、LIMIT進行查…

TS 字面量類型

str是string類型l str2是常量&#xff0c;類型是字面量類型 用途&#xff1a;配合聯合類型確定更嚴謹精確的可選值利恩

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】1.3 客戶端工具選擇(psql/PGAdmin/DBeaver)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 1.3 客戶端工具選擇(psql/PGAdmin/DBeaver)1.3.1 工具定位與適用場景1.3.2 深度解析三大工具1.3.2.1 psql:命令行的終極掌控核心特性基礎操作示例優缺點分析1.3.2.2 PGAdmin:PostgreSQL 專屬管理平臺…

2023年第十四屆藍橋杯省賽B組Java題解【 簡潔易懂】

2023年第十四屆藍橋杯省賽B組Java 題解 比賽整體情況說明 第十四屆藍橋杯大賽省賽B組Java賽道共有10道題目&#xff0c;題型分布如下&#xff1a; 題目類型題量難度分布考察重點結果填空題53簡單 2中等基礎算法、數學邏輯、字符串處理編程大題52中等 3困難動態規劃、圖論、…