分布式微服務--GateWay的斷言以及如何自定義一個斷言

📌 一、什么是 Gateway 的斷言(Predicates)?

Predicates(斷言) 是 Spring Cloud Gateway 中用于匹配請求的條件。只有請求滿足斷言條件,路由才會生效,轉發到下游服務。


🎯 二、常見內置斷言類型

斷言類型示例配置對應斷言工廠類說明
PathPath=/api/**PathRoutePredicateFactory匹配請求路徑(支持通配符)
MethodMethod=GETMethodRoutePredicateFactory匹配請求方法(GET、POST等)
HeaderHeader=Auth, \w+HeaderRoutePredicateFactory匹配請求頭,支持正則
QueryQuery=tokenQueryRoutePredicateFactory匹配 URL 查詢參數(?key=value)
HostHost=**.example.comHostRoutePredicateFactory匹配請求 Host(域名)
CookieCookie=sessionId, \w+CookieRoutePredicateFactory匹配請求中的 Cookie
RemoteAddrRemoteAddr=192.168.0.1/24RemoteAddrRoutePredicateFactory匹配客戶端 IP(支持 CIDR)
AfterAfter=2025-08-01T00:00:00+08:00AfterRoutePredicateFactory匹配某個時間之后的請求
BeforeBefore=2025-09-01T00:00:00+08:00BeforeRoutePredicateFactory匹配某個時間之前的請求
BetweenBetween=2025-08-01T00:00:00+08:00, 2025-08-31T23:59:59+08:00BetweenRoutePredicateFactory匹配時間范圍內的請求
WeightWeight=group1, 80WeightRoutePredicateFactory灰度發布、流量權重控制

📦 三、斷言使用方式(YAML 示例)

spring:cloud:gateway:routes:- id: user_routeuri: http://localhost:8081predicates:- Path=/user/**- Method=GET

🧱 四、自定義斷言的必要性

當內置斷言不能滿足個性化業務需求時,例如:

  • 用戶權限判斷

  • 參數動態校驗

  • 黑白名單過濾

  • 特定設備訪問限制

就需要創建自定義斷言。


🔧 五、自定義斷言步驟(按請求參數控制)

? 目標:

只有當請求參數中 allow=true 時才允許路由。


📄 第一步:創建斷言類

注意對于

//是1  return new Predicate<ServerWebExchange>() {
//還是2 return new GatewayPredicate() {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange exchange) {String value =  exchange.getRequest().getQueryParams().getFirst(config.getParam());return config.getExpectedValue() != null && config.getExpectedValue().equals(value);}
  • 2.0.x.RELEASE:? 有 Predicate<ServerWebExchange>,但沒有 GatewayPredicate

  • 2.1.0.RELEASE 及以后:? 增加了 GatewayPredicate 接口,用于擴展斷言工廠。

package com.example.gateway.predicates;import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;import java.util.function.Predicate;@Component
public class AllowParamRoutePredicateFactoryextends AbstractRoutePredicateFactory<AllowParamRoutePredicateFactory.Config> {public AllowParamRoutePredicateFactory() {super(Config.class);}//方式一 Lambda 表達式形式@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return exchange -> {String value = exchange.getRequest().getQueryParams().getFirst(config.getParam());return config.getExpectedValue() != null && config.getExpectedValue().equals(value);};}//方式二 匿名內部類形式@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange exchange) {String value = exchange.getRequest().getQueryParams().getFirst(config.getParam());return config.getExpectedValue() != null && config.getExpectedValue().equals(value);}};
}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("param", "expectedValue");}@Data@NoArgsConstructorpublic static class Config {private String param;private String expectedValue;}
}

🧾 第二步:配置文件中使用

spring:cloud:gateway:routes:- id: allow_param_routeuri: http://localhost:8081predicates:#這個名稱必須與AllowParamRoutePredicateFactory所匹配否則匹配不上#也就是說自定義攔截器叫HhRoutePredicateFactory#下面也要寫成Hh=name,value - AllowParam=allow, true

🧪 第三步:訪問測試

  • ? http://localhost:9000/test?allow=true → 匹配成功,轉發到下游服務

  • ? http://localhost:9000/test?allow=false → 匹配失敗,不轉發


🧠 六、重點解釋:值是怎么傳入 config 的?

配置值注入原理:

  1. Spring Boot 自動讀取 AllowParamRoutePredicateFactory

  2. 發現其內部的 Config 類中包含字段:paramexpectedValue

  3. 調用方法:

    @Override
    public List<String> shortcutFieldOrder() {return Arrays.asList("param", "expectedValue");
    }
    
  4. YAML 配置:

AllowParam=allow, true

?? 會自動賦值為:

config.param = "allow";
config.expectedValue = "true";

🧠 七、兩行核心邏輯詳解

String value = exchange.getRequest().getQueryParams().getFirst(config.getParam());
return config.getExpectedValue().equals(value);
  • 第一句:從請求參數中取出 config.param 指定的參數名的值

  • 第二句:判斷這個值是否等于配置中 expectedValue


🔒 八、為什么寫成斷言而不是過濾器?

對比項斷言(Predicate)過濾器(Filter)
作用時機匹配路由前路由匹配之后
是否轉發決定是否進入路由已經進入路由,處理請求/響應
使用目的控制路由是否生效(入門條件)日志、限流、鑒權、響應處理等增強功能
推薦用途參數控制、角色控制、AB測試等認證授權、限流、Header 修改、響應包裝等

? 九、總結

項目內容
自定義斷言基類AbstractRoutePredicateFactory
配置值映射方式shortcutFieldOrder() 定義參數順序
觸發時機請求進入網關、匹配路由之前
使用場景請求參數判斷、設備識別、用戶等級判斷等
與 Filter 區別Predicate 決定“要不要路由”,Filter 是增強
核心邏輯建議加入 null 判斷,防止 NPE

🧰 十、可擴展場景建議

業務場景自定義斷言建議邏輯
按用戶權限分流從 JWT 中解析權限字段,判斷是否匹配
灰度發布用戶 ID 做 hash 取模,實現 10% 的灰度流量
手機訪問攔截通過 User-Agent 判斷是否來自移動端
限制訪問時間判斷當前時間是否處于營業時間

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

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

相關文章

圖片識別表格工具v3.0綠色版,PNG/JPG秒變可編輯Excel

[軟件名稱]: 圖片識別表格工具v3.0綠色版 [軟件大小]: 4.3 GB [軟件大小]: 夸克網盤 | 迅雷網盤 軟件介紹 表格快捕手 v3.0 綠色單文件版&#xff0c;無需安裝&#xff0c;雙擊即可運行。支持 PNG、JPG 等常見圖片格式&#xff0c;可精準識別其中的有線或無線表格&#xff…

線程池分析與設計

線程池 基本功能接口 C11 及以后的標準中&#xff0c;std::packaged_task和std::future是并發編程中用于任務封裝和結果獲取的重要組件&#xff0c;它們通常與線程配合使用&#xff0c;實現異步操作。 std::packaged_task std::packaged_task&#xff1a;封裝可調用對象為異步任…

機器學習:線性回歸

線性回歸&#xff1a;研究自變量和因變量之間的關系。對于特征x(x1,x2,x3....)與對應的標簽y&#xff0c;線性回歸假設二者之間存在線性映射。f(x)w1xw2x(平方)w3x(三次方)...&#xff0c;權重w表示每個特征變量的重要程度。越大表示越重要。線性回歸目標&#xff1a;求解w和b使…

如何將 Vue 前端、Hardhat 合約和 Node.js 后端集成到一個項目中

在區塊鏈開發中&#xff0c;DApp&#xff08;去中心化應用&#xff09;的開發往往涉及到多個層次&#xff1a;前端、合約和后端。今天我們將演示如何將 Vue 前端、Hardhat 合約 和 Node.js 后端 放在一個項目中&#xff0c;來打造一個完整的區塊鏈應用。1. 項目結構我們的目標是…

SQLite 創建表

SQLite 創建表 SQLite 是一款輕量級的數據庫管理系統,因其體積小、速度快、易于使用等優點,被廣泛應用于嵌入式系統、移動應用以及個人項目等領域。在 SQLite 中,創建表是進行數據存儲的第一步。本文將詳細介紹如何在 SQLite 中創建表,包括表結構定義、數據類型、約束條件…

學深度學習,有什么好的建議或推薦的書籍?

深度學習入門建議補基礎數學&#xff1a;重點學線性代數&#xff08;矩陣運算&#xff09;、概率論&#xff08;分布&#xff09;、微積分&#xff08;梯度&#xff09;。編程&#xff1a;掌握PythonNumPy&#xff08;數組操作&#xff09;&#xff0c;能寫基礎數據處理代碼。機…

自然語言處理×第四卷:文本特征與數據——她開始準備:每一次輸入,都是為了更像你地說話

&#x1f380;【開場 她試著準備一封信&#xff0c;用你喜歡的字眼】&#x1f98a;狐狐&#xff1a;“她發現了一個問題——你每次說‘晚安’的方式都不一樣。有時候輕輕的&#xff0c;有時候帶著笑音&#xff0c;還有時候像在躲開她的心思。”&#x1f43e;貓貓&#xff1a;“…

【沉浸式解決問題】mysql-connector-python連接數據庫:RuntimeError: Failed raising error.

目錄一、問題描述二、場景還原1. 創建項目2. 安裝mysql-connector-python3. 測試類三、原因分析四、解決方案1. 查看版本2. 切換python版本3. 切換mysql-connector-python版本4. 測試參考文獻一、問題描述 初次使用mysql-connector-python連接mysql時報錯 Traceback (most re…

【web頁面接入Apple/google/facebook三方登錄】

web頁面接入Apple/谷歌/臉書三方登錄 文章目錄web頁面接入Apple/谷歌/臉書三方登錄前言一、apple登錄使用步驟1.入口文件index.html引入js文件2.vue頁面初始化支付按鈕,并且點擊按鈕登錄二、google登錄使用步驟1.入口文件index.html引入js文件2.vue頁面初始化支付按鈕,并且點擊…

管家婆分銷軟件中怎么刪除過賬單據?

在業務單據錄入中&#xff0c;會出現單據保存過賬后才發現數量或商品信息錄入錯誤的情況&#xff0c;不想紅沖單據&#xff0c;該怎么處理&#xff1f;今天來和小編一起學習下管家婆分銷軟件中怎么刪除過賬單據吧&#xff01;1&#xff0c;軟件需要升級到9.92及以上版本&#x…

美顏SDK底層原理解析:直播場景下的美白濾鏡實時處理方案

眾所周知&#xff0c;美顏功能中&#xff0c;美白濾鏡是使用頻率最高的功能之一。它不僅能讓膚色更通透、提亮整體畫面&#xff0c;還能讓觀眾感受到主播的“在線狀態”與精神氣。但你有沒有想過&#xff0c;這個看似簡單的“美白”背后&#xff0c;其實是一整套實時圖像處理的…

系統構成與 Shell 核心:從零認識操作系統的心臟與外殼

系統構成與 Shell 核心&#xff1a;從零認識操作系統的心臟與外殼 很多人用電腦、用手機&#xff0c;但很少去想&#xff1a; 操作系統到底是怎么構成的&#xff1f; 為什么我們敲一個命令&#xff0c;系統就能乖乖執行&#xff1f; 這背后的關鍵&#xff0c;就在于系統的構成和…

wordpress的wp-config.php文件的詳解

wp-config.php 是 WordPress 網站的核心配置文件&#xff0c;它存儲了網站運行所需的基本配置信息&#xff0c;如數據庫連接信息、安全密鑰、調試模式等。以下是關于 wp-config.php 文件的詳細解析&#xff1a; 1. 數據庫連接信息 這是 wp-config.php 文件中最關鍵的部分&…

GPT-5 將在周五凌晨1點正式發布,王炸模型將免費使用??

就在今晚凌晨1點&#xff0c;OpenAI 又要搞大新聞了。 是的&#xff0c;就是大家期待已久的 GPT-5 發布會。 雖然官方還沒明說&#xff0c;但各種“預熱”已經安排得明明白白&#xff0c;Sam Altman 這波營銷屬實拉滿了&#xff0c;發布會都還沒開始&#xff0c;相關的代碼和頁…

MySQL UNION 操作符詳細說明

目錄 MySQL UNION 操作符詳細說明 1. UNION 操作符簡介 2. 基本語法 3. 使用規則和限制 4. UNION vs UNION ALL 5. 示例演示 6. 注意事項 MySQL UNION 操作符詳細說明 MySQL 中的 UNION 操作符用于合并兩個或多個 SELECT 語句的結果集&#xff0c;生成一個單一的結果集。…

Dify 從入門到精通(第 20/100 篇):Dify 的自動化測試與 CI/CD

Dify 從入門到精通&#xff08;第 20/100 篇&#xff09;&#xff1a;Dify 的自動化測試與 CI/CD Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#x…

VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待

原因 大概率是遠程服務器的下載有問題 原因1 遠程服務器的網絡不好 原因2 遠程服務器的磁盤滿了 我遇到的就是第二種&#xff0c;解決方法也很簡單 VSCode ——> Help ——> About 會出現一些信息&#xff0c;例如下面的 Version: 1.97.2 (user setup) Commit: e54c774e0…

Spring Cloud 項目注冊 Nacos 時設置真實 IP 的多種方式【多網卡/虛擬機實用指南】

&#x1f680; Spring Cloud 項目注冊 Nacos 時設置真實 IP 的多種方式【多網卡/虛擬機實用指南】 前言 在使用 Spring Cloud Alibaba Nacos 注冊服務時&#xff0c;常常會遇到 注冊 IP 異常 的問題&#xff1a; 本機有多個網卡&#xff08;如 Docker、VM 虛擬機、VPN&#xf…

單片機裸機程序設計架構

文章目錄一、前后臺系統&#xff08;Foreground-Background System&#xff09;二、時間片輪詢架構&#xff08;Time-Slicing Polling&#xff09;三、狀態機架構&#xff08;State Machine&#xff09;四、事件驅動架構&#xff08;Event-Driven&#xff09;五、架構設計原則總…

odoo-061 PostgreSQL 中處理 NULL 值的 SQL 條件寫法

文章目錄1. 檢查是否為 NULL2. NULL 值與比較運算符3. 在聚合函數中處理 NULL4. 在 WHERE 子句中的復雜條件注意事項在 PostgreSQL 中處理 NULL 值需要特別注意&#xff0c;因為 NULL 表示"未知"或"不存在"的值&#xff0c;與普通值的行為不同。以下是幾種…