【Spring Cloud】Gateway 服務網關核心架構的執行流程和斷言

文章目錄

  • 基本概念
  • 執行流程
  • 斷言
    • 內置路由斷言工廠
    • 自定義路由斷言工廠
  • 總結

基本概念

路由(Route)是gateway中最基本的組件之一,表示一個具體的路由信息載體。主要定義了下面的幾個信息:

  • id:路由標識符,區別于其他Route。
  • uri:路由指向的目的地uri,即客戶端請求最終被轉發到的微服務。
  • order:用于多個Route之間的排序,數值越小排序越靠前,匹配優先級越高。
  • predicate:斷言的作用是進行條件判斷,只有斷言都返回真,才會真正的執行路由。
  • filter:過濾器用于修改請求和響應信息。

執行流程

在這里插入圖片描述
執行流程大體如下:

  1. Gateway ClientGateway Server 發送請求;
  2. 請求首先會被 HttpWebHandlerAdapter 進行提取組裝成網關上下文;
  3. 然后網關的上下文會傳遞到 DispatcherHandler,它負責將請求分發給RoutePredicateHandlerMapping
  4. RoutePredicateHandlerMapping 負責路由查找,并根據路由斷言判斷路由是否可用;
  5. 如果斷言成功,由FilteringWebHandler創建過濾器鏈并調用;
  6. 請求會依次經過PreFilter->微服務->PostFiter的方法,最終返回響應;

斷言

Predicate(斷言,謂詞)用于進行條件判斷,只有斷言都返回真,才會真正的執行路由。斷言就是說: 在什么條件下才能進行路由轉發。

內置路由斷言工廠

Spring Cloud Gateway 包括許多內置的斷言工廠,所有這些斷言都與HTTP請求的不同屬性匹配。具體如下:

(1)基于Datetime類型的斷言工廠,此類型的斷言根據時間做判斷,主要有三個:

  • AfterRoutePredicateFactory:接收一個日期參數,判斷請求日期是否晚于指定日期;
  • BeforeRoutePredicateFactory:接收一個日期參數,判斷請求日期是否早于指定日期;
  • BetweenRoutePredicateFactory:接收兩個日期參數,判斷請求日期是否在指定時間段內;

- After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]

(2)基于遠程地址的斷言工廠 RemoteAddrRoutePredicateFactory:接收一個IP地址段,判斷請求主機地址是否在地址段中

- RemoteAddr=192.168.1.1/24

(3)基于Cookie的斷言工廠 CookieRoutePredicateFactory ,接收兩個參數:cookie名字和一個正則表達式。判斷請求cookie是否具有給定名稱且值與正則表達式匹配。

- Cookie=chocolate, ch.

(4)基于Header的斷言工廠 HeaderRoutePredicateFactory,接收兩個參數:標題名稱和正則表達式。判斷請求Header是否具有給定名稱且值與正則表達式匹配。

- Header=X-Request-ld, \d+

(5)基于Host的斷言工廠 HostRoutePredicateFactory,接收一個參數:主機名模式。判斷請求的Host是否滿足匹配規則。

- Host=**.testhost.org

(6)基于Method請求方法的斷言工廠 MethodRoutePredicateFactory,接收一個參數:判斷請求類型是否跟指定的類型匹配。

- Method=GET

(7)基于Path請求路徑的斷言工廠 PathRoutePredicateFactory,接收一個參數:判斷請求的URI部分是否滿足路徑規則。

- Path=/foo/{segment}

(8)基于Query請求參數的斷言工廠 QueryRoutePredicateFactory,接收兩個參數:請求param和正則表達式,判斷請求參數是否具有給定名稱且值與正則表達式匹配。

- Query=baz, ba.

(9)基于路由權重的斷言工廠 WeightRoutePredicateFactory,接收一個[組名,權重],然后對于同一個組內的路由按照權重轉發

- id: weight_route1uri: host1predicates:- Path=/product/**- Weight=group3, 1
- id: weight_route2uri: host2predicates:- Path=/product/**- Weight=group3, 9

接下來我們驗證幾個內置斷言的使用:

server:port: 7000spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true  # 讓gateway可以發現nacos中的微服務lowerCaseServiceId: true # 將請求路徑上的服務名配置為小寫routes:- id: shop-product #當前路由標識,要求唯一uri: lb://shop-product #lb代表從nacos中獲取微服務,shop-product是微服務的名稱order: 1 #路由的優先級,數字越小級別越高predicates: #斷言(就是路由轉發要滿足的條件)- Path=/product/** #當請求路徑滿足Path指定的規則時,才進行路由轉發- Before=2019-08-30T15:46:00.000+08:00 #限制請求時間在2019-11-28之前- Method=POST #限制請求方式為postfilters: #過濾器,請求在傳遞過程中可以通過過濾器對其進行一定的修改- StripPrefix=1 #去掉請求路徑的第一層

自定義路由斷言工廠

我們來設定一個場景:假設我們的應用僅僅讓age在(min,max)之間的人來訪問。

1、在配置文件中,添加一個Age的斷言配置

spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true  # 讓gateway可以發現nacos中的微服務lowerCaseServiceId: true # 將請求路徑上的服務名配置為小寫routes:- id: shop-product #當前路由標識,要求唯一uri: lb://shop-product #lb代表從nacos中獲取微服務,shop-product是微服務的名稱order: 1 #路由的優先級,數字越小級別越高predicates: #斷言(就是路由轉發要滿足的條件)- Path=/product/** #當請求路徑滿足Path指定的規則時,才進行路由轉發- Age=18,60 #限制年齡只有在18到60歲之間的人能訪問filters: #過濾器,請求在傳遞過程中可以通過過濾器對其進行一定的修改- StripPrefix=1 #去掉請求路徑的第一層

2、自定義一個斷言工廠,實現斷言方法

@Component
//泛型用于接收一個配置類,配置類用于接收配置文件中的配置。
public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory<AgeRoutePredicateFactory.Config> {public AgeRoutePredicateFactory() {super(AgeRoutePredicateFactory.Config.class);}/*** 用于從配置文件中獲取參數值賦值到配置類中的屬性上**/@Overridepublic List<String> shortcutFieldOrder() {//這里的順序要跟配置文件中的參數順序一致return Arrays.asList("minAge","maxAge");}/*** 斷言**/@Overridepublic Predicate<ServerWebExchange> apply(AgeRoutePredicateFactory.Config config) {return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {//從 serverWebExchange 獲取傳入的參數String ageStr = serverWebExchange.getRequest().getQueryParams().getFirst("age");if(StringUtils.isNotEmpty(ageStr)) {int age = Integer.parseInt(ageStr);return age > config.getMinAge() && age < config.getMaxAge();}return true;}} ;}/*** 自定義一個配置類,用于接收配置文件中的參數**/@Datapublic static class Config {private int minAge;private int maxAge;}}

3、啟動測試
在這里插入圖片描述

測試發現當age在(18,60)之間可以訪問,其它范圍不能訪問。

總結

到這兒,Gateway 服務網關核心架構的執行流程和斷言就已經介紹完了。下一篇將為大家帶來Gateway 服務網關核心架構的過濾器相關的文章,敬請期待吧!

后續的文章,我們將繼續完善我們的微服務系統,集成更多的Alibaba組件。想要了解更多JAVA后端知識,請點擊文末名片與我交流吧。留下您的一鍵三連,讓我們在這個寒冷的東西互相溫暖吧!

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

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

相關文章

論文合集整理推薦2024.6.4

論文合集整理推薦2024.6.4 原創 小王搬運工 時序課堂 2024-06-04 20:12 四川 ?2012年論文合集&#xff1a;論文入口 ?2019年論文合集&#xff1a;論文入口 2021年論文合集&#xff1a;論文入口 2022年論文合集&#xff1a;論文入口 2023年論文合集&#xff1a;論文入口…

carbondata入庫數據查詢異常排查

1&#xff0c;背景&#xff1a;carbondata的入庫segments對應的狀態都是success&#xff0c;但是查詢的時候報錯&#xff0c; 2&#xff0c;排查內容 1&#xff0c;segments的狀態 success 2&#xff0c;任務執行記錄日志 正常 3&#xff0c;找到對應查詢的天&#xff0c;指定對…

8255A-LED

DATA SEGMENTPORTA EQU 280H ;A端口地址PORTB EQU 281H ;B端口地址PORTD EQU 283H ;命令口地址 DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX, DATAMOV DS, AXMOV DX, PORTDMOV AL, 10010000BOUT DX,ALMOV DX, 281H MOV AL, 00HOUT DX, ALWAIT1:MOV DX, POR…

【JavaEE精煉寶庫】多線程(4)深度理解死鎖、內存可見性、volatile關鍵字、wait、notify

目錄 一、死鎖 1.1 出現死鎖的常見場景&#xff1a; 1.2 產生死鎖的后果&#xff1a; 1.3 如何避免死鎖&#xff1a; 二、內存可見性 2.1 由內存可見性產生的經典案例&#xff1a; 2.2 volatile 關鍵字&#xff1a; 2.2.1 volatile 用法&#xff1a; 2.2.2 volatile 不…

C/C++ 檢測文件是否存在的方法

在C和C中&#xff0c;檢測文件是否存在的方法通常涉及到平臺特定的API或者使用標準庫的功能&#xff08;在C17及以后版本中&#xff09;。以下是幾種常見的方法&#xff1a; C 在C中&#xff0c;通常使用POSIX標準&#xff08;在Unix-like系統上&#xff09;或Windows API&am…

PostgreSQL的視圖pg_stat_user_tables

PostgreSQL的視圖pg_stat_user_tables pg_stat_user_tables 是 PostgreSQL 中的一個系統視圖&#xff0c;用于顯示用戶定義的表的統計信息。這些統計信息包括表的訪問情況、修改情況以及很多其他的性能指標。這個視圖為數據庫管理員提供了豐富的數據&#xff0c;可以幫助他們進…

使用 Scapy 庫編寫 ICMP 時間戳攻擊腳本

一、介紹 ICMP時間戳攻擊&#xff08;ICMP Timestamp Attack&#xff09;是一種利用ICMP協議中的Timestamp請求和響應消息來實施的攻擊。攻擊者發送大量的ICMP Timestamp請求消息到目標主機&#xff0c;以觸發目標主機對每個請求進行響應&#xff0c;從而消耗目標系統的網絡資…

Codeforces Round 950 (Div. 3)

好久沒寫題解了&#xff0c;今天來寫個題解。 A - 問題 Generator #include "bits/stdc.h" using namespace std;#define int long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0); #define all(x) x.begin(),x.end() #define pi pair<in…

【Linux】(一)——Linux基礎和Linux命令基礎語法

目錄 Linux基礎Linux發行版本Linux終端Linux命令 Linux基礎 Linux&#xff0c;通常指的是GNU/Linux操作系統&#xff0c;這是一個開源且免費使用的類UNIX操作系統。它的核心組件——Linux內核&#xff0c;由林納斯托瓦茲&#xff08;Linus Torvalds&#xff09;在1991年10月5日…

Arthas使用教程——JVM常用命令

JVM相關命令 dashboard——當前系統的實時數據面板 顯示當前 tomcat 的實時信息。 使用方式&#xff1a;dashboard 數據說明 ID: Java 級別的線程 ID&#xff0c;注意這個 ID 不能跟 jstack 中的 nativeID 一一對應。 NAME: 線程名 GROUP: 線程組名 PRIORITY: 線程優先級…

Rocky Linux安裝與基礎配置

目錄 背景與起源 主要特點 目標用戶 發展前景 下載 安裝 常用配置命令&#xff1a; 更換鏡像源 Rocky Linux 是一個開源的、由社區驅動的操作系統&#xff0c;旨在使用 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源碼構建的下游二進制兼容發行版。以下是關于…

優思學院|一文看懂新版FMEA與FMEA的七大步驟

FMEA的起源 FMEA最早起源于20世紀40年代的美國軍工行業。當時&#xff0c;美國軍方為了提高武器系統的可靠性和安全性&#xff0c;開始使用FMEA來識別和評估潛在的故障模式及其影響。1949年&#xff0c;美國軍方發布了《軍用程序手冊》&#xff08;Military Procedures Handbo…

【Android面試八股文】在Java中重載和重寫是什么意思,區別是什么?

文章目錄 在Java中重載和重寫是什么意思,區別是什么?這道題想考察什么 ?考察的知識點考生應該如何回答重載(Overloading)重寫(Overriding)重載和重寫的區別在Java中重載和重寫是什么意思,區別是什么? 這道題想考察什么 ? Java基礎 考察的知識點 面向對象多態的基…

五種網絡IO模型

目錄 前言 文件描述符 為什么要多種io模型 同步IO 1.阻塞IO 2.非阻塞IO 3.多路復用IO&#xff08;事件驅動IO&#xff09; select: poll&#xff1a; epoll&#xff1a; 4.信號驅動IO 異步IO 區別 前言 文件描述符 首先我們了解一下文件描述符是什么&#xff1a;…

【Python報錯】已解決AttributeError: ‘method‘ object has no attribute ‘xxx‘

解決Python報錯&#xff1a;AttributeError: ‘method’ object has no attribute ‘xxx’ 在Python中&#xff0c;AttributeError通常表明你試圖訪問的對象沒有你請求的屬性或方法。如果你遇到了AttributeError: method object has no attribute xxx的錯誤&#xff0c;這通常意…

批量處理腳本,用于刪除指定目錄下3天前的備份文件和日志。

echo off echo 刪除3天前的備份文件和日志 set SrcDirD:\home set DaysAgo3 echo 準備刪除3天前的備份文件和日志 forfiles /p %SrcDir% /d -%DaysAgo% /c "cmd /c del /f /q /a path && rd /s /q path" echo 正在執行刪除&#xff0c;請稍等…… set SrcDi…

奇跡MU最強法師介紹

1、黑龍波 釋放出深淵中的黑龍之魂&#xff0c;對一定范圍內的目標造成中等程度傷害。 奧義&#xff1a; 怒哮——法師釋放出深淵龍魂的怨怒之力&#xff0c;在電閃雷鳴中中咆哮的龍魂將對敵人額外造成少量傷害。 魂陣——法師利用法陣控制黑龍之魂進行更大范圍的攻擊&…

如何使用SeaFile文件共享服務器結合內網穿透將家中電腦變成個人云盤

文章目錄 1. 前言2. SeaFile云盤設置2.1 Owncould的安裝環境設置2.2 SeaFile下載安裝2.3 SeaFile的配置 3. cpolar內網穿透3.1 Cpolar下載安裝3.2 Cpolar的注冊3.3 Cpolar云端設置3.4 Cpolar本地設置 4.公網訪問測試5.結語 1. 前言 本文主要為大家介紹&#xff0c;如何使用兩個…

opt 優化

【整理】深入理解拉格朗日乘子法&#xff08;Lagrange Multiplier) 和KKT條件 【amos注】&#xff1a;通俗易懂&#xff0c;讓人易于理解。

【Oracle篇】rman全庫異機恢復:從RAC環境到單機測試環境的轉移(第四篇,總共八篇)

&#x1f4ab;《博主介紹》&#xff1a;?又是一天沒白過&#xff0c;我是奈斯&#xff0c;DBA一名? &#x1f4ab;《擅長領域》&#xff1a;??擅長Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式數據倉庫)、Linux&#xff0c;也在擴展大數據方向的知識面??…