SpringCloud組件——Gateway

一.網關

1.問題提出

我們通過Eureka,Nacos解決了服務注冊,服務發現的問題,使用SpringCloud LoadBalance解決了負載均衡的問題,使用OpenFeign解決了遠程調用的問題。

但是當前所有微服務的接口都是直接對外暴露的,可以直接通過外部訪問。為了保證對外服務的安全性,?服務端實現的微服務接口通常都帶有?定的權限校驗機制。

由于使用了微服務,原本?個應用的多個模塊拆分成了多個應用,我們不得不實現多次校驗邏輯。當這套邏輯需要修改時,我們需要修改多個應用,比較麻煩。

這個時候就可以使用網關Gateway了。

2.API網關

API網關也是?個服務,通常是后端服務的唯一入口。它的定義類似設計模式中的Facade模式。它就類似整個微服務架構的門面,所有的外部客戶端訪問,都需要經過它來進行調度和過濾。

網關的核心功能:

1)權限控制:作為入口,可對用戶進行權限校驗,對校驗失敗的用戶進行攔截;

2)動態路由:?切請求先經過網關,但網關不處理業務,而是根據某種規則,把請求轉發到某個微服務;

3)負載均衡:當路由的目標服務有多個時,需要做負載均衡;

4)限流:請求流量過高時,按照網關中配置微服務能夠接受的流量進行放行。

二.SpringCloudGateway

由于API網關是一個服務,所以我們要先創建一個項目(服務)。

1.引入網關依賴

<!--網關-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--Nacos-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--負載均衡-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2.編寫啟動類

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

3.添加Gateway的路由配置

創建application.yml文件,添加配置:

server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:metrics:enabled: trueroutes:- id: order-service   uri: lb://order-service/ predicates:   - Path=/order/**,/feign/**- id: product-serviceuri: lb://product-service/predicates:- Path=/product/**

字段說明:

1)id:自定義路由ID,保持唯一,不能重復;

2)uri:目標服務地址,支持普通URI及 lb:// 應用注冊服務名稱。lb標識負載均衡,使用 lb:// 方式標識從注冊中心獲取服務地址;

3)predicates:路由條件,根據匹配結果決定是否執行該請求路由,上述代碼中,我們把符合Path規則的一切請求,都代理到uri參數指定的地址。

三.Route Predicate Factories

Route Predicate Factories,在Spring Cloud Gateway中,Predicate提供了路由規則的匹配機制。

這里舉幾個例子給大家看。

After匹配指定日期之后的請求
Before匹配指定日期之前的請求
Between匹配兩個指定時間之間的請求 datetime2 的參數必須在 datetime1 之后

具體寫一下After的例子:

可以先通過下面的代碼獲取時間:

System.out.println(ZonedDateTime.now());

在配置網關的配置文件中添加:

predicates:- Path=/product/**- After=2025-04-28T15:40:18.609323500+08:00[Asia/Shanghai]

詳細內容大家可以去Spring官網查看:Route Predicate Factories :: Spring Cloud Gateway

四.Gateway Filter Factories

1.簡介

Predicate決定了請求由哪?個路由處理,如果在請求處理前后需要加?些邏輯,這就是Filter(過濾器)的作用范圍了。

Filter分為兩種類型:

1)Pre類型過濾器:路由處理之前執行(請求轉發到后端服務之前執行),在Pre類型過濾器中可以做鑒權,限流等.;

2)Post類型過濾器::求執行完成后,將結果返回給客戶端之前執行。

Spring Cloud Gateway中內置了很多Filter,用于攔截和鏈式處理web請求。

Spring Cloud Gateway從作用范圍上,也看把Filter可分為兩類:

1)GatewayFilter:應用到單個路由或者?個分組的路由上;

2)GlobalFilter:應用到所有的路由上,也就是對所有的請求生效。

2.GatewayFilter

GatewayFilter也是將配置信息放在配置文件中,Spring Cloud Gateway提供了不少Filter,具體大家可以去官網看:AddRequestHeader GatewayFilter Factory :: Spring Cloud Gateway

左面的那些就是Filter,下面我舉一個例子:AddRequestParameter

spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgfilters:- AddRequestParameter=userName,Kobayashi

使用這個Filter可以為所有請求添加一個參數userName。

在Spring Cloud Gateway提供的所有Filter中,有一個特殊的Filter:Default Filters,默認過濾器。

默認過濾器可以對全部路由生效:

spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- PrefixPath=/httpbin

其實從代碼中也可以看出,default-filters是與routes同級的,這也能說明默認過濾器不僅僅是對某一些路由生效,而是對所有路由生效。

3.GlobalFilter

GlobalFilter是Spring Cloud Gateway中的全局過濾器。

1)添加過濾器

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2)添加配置

spring:cloud:gateway:metrics:enabled: true
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysshutdown:enabled: true

4.過濾器執行順序

請求路由后,網關會把當前項目中的GatewayFilter和GlobalFilter合并到?個過濾器鏈(集合)中,并進行排序,依次執行過濾器。

每?個過濾器都必須指定?個int類型的order值,默認值為0,表示該過濾的優先級。order值越小,優先級越高,執行順序越靠前。

1)Filter通過實現Order接口或者添加@Order注解來指定order值。

2)SpringCloudGateway提供的Filter由Spring指定。用戶也可以自定義Filter,由用戶指定。

3)當過濾器的order值?樣時,會按照defaultFilter>GatewayFilter>GlobalFilter的順序執行。

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

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

相關文章

C#中構造器及屬性的加載順序

一.基本原則: 先加載靜態構造函數和靜態字段,后加載普通構造函數和普通字段;先加載基類再加載子類; 二.具體的加載順序: 父類靜態字段--->父類靜態構造函數--->子類靜態字段--->子類靜態構造函數--->父類實例字段---> 父類實例構造函數--->子類實例字段-…

Python面試問題

一、Python 基礎 1. Python 的特點 動態類型&#xff1a;變量無需聲明類型。解釋型語言&#xff1a;逐行解釋執行。支持多種編程范式&#xff08;面向對象、函數式、過程式&#xff09;。 2. 列表&#xff08;List&#xff09;與元組&#xff08;Tuple&#xff09;的區別 特…

計算機視覺進化論:YOLOv12、YOLOv11與Darknet系YOLOv7的微調實戰對比

摘要 YOLO系列作為實時目標檢測領域的重要里程碑&#xff0c;持續引領速度與精度的平衡發展。本文圍繞YOLOv7&#xff08;基于Darknet框架&#xff09;、YOLOv11及YOLOv12&#xff0c;系統、深入地對比了三款模型的架構創新、微調策略、核心技術及應用場景。我們詳細解析了三者…

SQL Server 存儲過程開發規范

SQL Server 存儲過程開發規范&#xff08;高級版&#xff09; 1. 總則 1.1 目標 本規范旨在&#xff1a; 提高存儲過程的事務一致性、異常可追蹤性、錯誤透明度。 統一日志記錄、錯誤碼管理、鏈路追蹤&#xff08;Trace ID&#xff09;。 支持復雜事務場景&#xff08;嵌套…

opendds的配置

配置的使用 文檔中說明有4種使用配置的方式&#xff1a; 環境變量 命令行參數&#xff08;將覆蓋環境變量中的配置&#xff09; 配置文件&#xff08;不會覆蓋環境變量或命令行參數中的配置&#xff09; 用戶調用的 API&#xff08;將覆蓋現有配置&#xff09; 這里對開發…

(Go Gin)上手Go Gin 基于Go語言開發的Web框架,本文介紹了各種路由的配置信息;包含各場景下請求參數的基本傳入接收

1. 路由 gin 框架中采用的路優酷是基于httprouter做的 HttpRouter 是一個高性能的 HTTP 請求路由器&#xff0c;適用于 Go 語言。它的設計目標是提供高效的路由匹配和低內存占用&#xff0c;特別適合需要高性能和簡單路由的應用場景。 主要特點 顯式匹配&#xff1a;與其他路由…

Marin說PCB之----板材的替換注意事項

由于最近很多武林上的主流門派都需要采用將的本方案&#xff0c;小編所在的宗門古族也是不例外了&#xff0c;宗門大長老韓立現在想把之前一直在用的板材EM370Z替換成生益的Autolad3&#xff0c;讓我去拿資料分析一下是否可以替換。下圖所示是就是小編我做的一個表格關于兩家板…

4月28日信息差全景:國際局勢、科技突破與市場震蕩一、國際政治與安全:俄烏沖突關鍵轉折

一、國際政治與安全:俄烏沖突關鍵轉折 1. 烏克蘭反攻進展與情報差異 前線動態: 俄國防部稱在頓涅茨克擊退烏軍三次進攻,摧毀12輛坦克;烏方則宣布在巴赫穆特南部推進2公里,雙方戰報存在顯著差異。 信息差根源:戰場信息管控導致西方媒體與俄媒報道截然不同。 國際援助: 美…

關系數據的可視化

目錄 【實驗目的】 【實驗原理】 【實驗環境】 【實驗步驟】 一、安裝Python所需要的第三方模塊 二、實驗 【實驗總結】 【實驗目的】 1.掌握關系數據在大數據中的應用 2.掌握關系數據可視化方法 3. python 程序實現圖表 【實驗原理】 在傳統的觀念里面&#xff0…

夏季道路安全的AI革命:節省人力、提升效率

AI夏季道路安全&#xff1a;用智能算法守護每一條街道 背景&#xff1a;夏季道路安全的挑戰與機遇 夏季是道路安全事件的高發期。高溫天氣容易導致駕駛員疲勞、行人行為異常&#xff08;如跌倒或中暑&#xff09;&#xff0c;同時&#xff0c;車流量增加、夜間活動頻繁…

HTML標記語言_@拉鉤教育【筆記】

目錄 1.文本標簽 2.格式化標簽 3.圖片標簽 4.超鏈接標簽 5.表格標簽 6表單標簽 6.1 6.2 6.3 7.行內框架(超鏈接內套一個頁面) 8.多媒體標簽(音/視頻) 1.文本標簽 2.格式化標簽 3.圖片標簽 4.超鏈接標簽 5.表格標簽 6表單標簽 6.1 6.2 6.3 7.行內框架(超鏈接內套一個…

Python 中調用方法內部定義的類詳解(類在方法中的各種操作)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、基本概念1.1 方法內部定義類概述1.2 方法內部定義類的特點1.3 替代方案二、基本使用2.1 直接在方法內部使用2.2 返回類定義供外部使用2.3 返回類的實例2.4 作為閉包使用(訪問外部變量)三、高級用法3.1 動態類創…

第36課 常用快捷操作——用“鼠標右鍵”退出當前命令

概述 在AD 20軟件中&#xff0c;很多的命令都是可以一直連續下去的&#xff0c;比方說放置一個元器件符號&#xff0c;如果你當中不取消的話&#xff0c;那就可以一直執行下去&#xff0c;放完一個接著放下一個&#xff0c;放完一個接著放下一個…… 想要退出這種連續進行的命…

FFTW3.3.10庫與QT結合的使用

FFTW&#xff08;Fastest Fourier Transform in the West&#xff09;是世界上最快的FFT&#xff0c; 實測計算長度為10000的double數組&#xff0c; 單次運行時間在2ms左右。為了詳細了解FFTW以及為編程方便&#xff0c;特將用戶手冊看了一下&#xff0c;并結合手冊制作了以下…

服務器異地備份,服務器異地備份有哪些方法?

服務器異地備份是應對區域性災難&#xff08;如地震、火災、洪水&#xff09;或人為事故&#xff08;如誤刪除、勒索病毒攻擊&#xff09;的關鍵策略&#xff0c;其核心在于將數據副本存儲在物理隔離的地理位置&#xff0c;確保主數據中心故障時仍可恢復業務。 以下是主流的異地…

導軌表面硬化處理有哪些?

導軌是機器工作的重要組成部分&#xff0c;它與滑塊緊密配合&#xff0c;保證機器的運轉精度和定位精度。為了提高導軌的耐磨性能和使用壽命&#xff0c;通常在導軌表面加工硬化層。硬化層一般是在導軌表面形成一層高硬度和高強度的薄層&#xff0c;有效地提高了導軌的耐磨性能…

Android Compose vs 傳統View系統:全面對比與選型指南

Android Compose vs 傳統View系統&#xff1a;全面對比與選型指南 一、引言 隨著Android Jetpack Compose的正式發布&#xff0c;Android開發迎來了全新的聲明式UI框架。本文將全面對比Compose與傳統View系統的差異&#xff0c;幫助開發者做出合理的技術選型。 二、核心架構…

C#中實現JSON解析器

JSON(JavaScript Object Notation)即 JavaScript 對象表示法,是一種輕量級的數據交換格式。 起源與發展 JSON 源于 JavaScript 編程語言,是 JavaScript 對象字面量語法的一個子集。但如今它已經獨立于 JavaScript,成為一種通用的數據格式,廣泛應用于各種編程語言和系統…

【Maven】子POM與父POM

文章目錄 子POM與父POM一、繼承的內容1.子 POM 可以繼承父 POM 的內容2.子 POM 中聲明相同配置覆蓋規則示例 子POM與父POM 一、繼承的內容 在 Maven 項目結構中&#xff0c;子 POM&#xff08;子模塊&#xff09;可以繼承父 POM 的很多配置。合理使用繼承機制可以大大減少重復…

12前端項目----添加購物車1.0

商品添加購物車 商品數量添加購物車瀏覽器本地存儲localStoragesessionStorage添加成功頁面 商品數量 輸入為數字&#xff0c;最少為1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…