分布式微服務--GateWay(1)

一、什么是微服務網關(API Gateway)

  • 定義:微服務網關是整個系統請求的統一入口,負責請求轉發、過濾處理、安全校驗等。

  • 作用

    • 請求路由

    • 日志記錄

    • 權限控制

    • 參數校驗

    • 解決跨域問題

    • 黑白名單控制

    • 限流、熔斷、降級

    • 統一前后端接口調用


二、過濾器與網關的區別

對比項過濾器(Filter)網關(Gateway)
作用范圍單個微服務內部整個微服務系統
實現方式@WebFilter、OncePerRequestFilterSpring Cloud Gateway
適用場景局部處理、日志、攔截器全局處理、統一入口、鑒權


三、Zuul vs Gateway

對比項Zuul(1代網關)Gateway(2代網關)
所屬公司NetflixSpring 官方
技術架構Servlet、阻塞式WebFlux、非阻塞響應式
性能較差高性能、支持長連接
生態整合較弱完美整合 Spring 生態
適合場景兼容性要求高的舊項目新項目優選、高并發場景

四、快速構建 Gateway 項目

Maven 依賴

//注意:會和spring-webmvc的依賴沖突,需要排除spring-webmvc
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

????????在使用 spring-cloud-starter-gateway 時,不能再同時使用 spring-boot-starter-web,否則會產生沖突或運行時報錯。


? 原因詳解
🔧 spring-cloud-starter-gateway 是基于 Spring WebFlux(響應式編程)
  • 內部依賴的是 spring-boot-starter-webflux

  • 使用響應式的非阻塞式 Netty 服務器(不是 Tomcat)

  • 框架核心類如:WebHandlerServerWebExchangeMonoFlux

? spring-boot-starter-web 是基于 Spring MVC(Servlet 阻塞式編程)
  • 內部使用的是 spring-web + spring-webmvc

  • 默認使用嵌入式 Tomcat

  • 與 WebFlux 核心機制不兼容

application.yml 配置

server:port: 80spring:application:name: gateway-servicecloud:gateway:discovery:  //二選一locator:enabled: true  # 開啟服務注冊自動路由routes:     //二選一- id: example-routeuri: http://www.example.com/predicates:- Path=/example/**
? discovery.locator.enabled: true(自動路由)
  • 自動將注冊中心的服務映射成路由,無需手動配置。

  • 訪問格式:http://網關地址/服務名/**

  • 適合:快速開發、測試環境。

  • 不靈活:路徑固定為服務名,不能自定義。


? 手動配置 routes
  • 你手動指定路由規則(路徑、服務名、過濾器等)。

  • 更靈活:可以自定義路徑、加過濾器、權限控制等。

  • 適合:生產環境。


? 是否二選一?
  • 一般只用一個即可

  • 正式環境推薦:關閉 discovery.locator.enabled,手動寫 routes


五、整合 Nacos 實現服務注冊與發現

添加依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml 示例

spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:discovery:locator:enabled: trueroutes:- id: memberuri: lb://member-servicepredicates:- Path=/member/**filters:- StripPrefix=1
? 兩種 uri 寫法的區別
🟩 第一種:
routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/user/**

解釋:

  • uri: lb://user-service 表示使用服務發現 + 負載均衡

  • lb:// 前綴 = load balancer,Spring Cloud Gateway 會去注冊中心(如 Nacos)里找名為 user-service 的服務,并自動負載均衡調用。

  • 這個寫法 必須依賴 Nacos 或其他服務注冊中心,否則會報錯:服務找不到。


🟩 第二種:
routes:- id: example-routeuri: http://www.example.com/predicates:- Path=/example/**

解釋:

  • uri: http://... 表示直接轉發到固定的 HTTP 地址。

  • 不需要注冊中心,Gateway 會將請求直接轉發到 www.example.com

  • 不需要 Nacos 等服務發現組件


? 總結對比表
配置方式是否需要注冊中心(如 Nacos)說明
uri: lb://user-service? 需要從注冊中心獲取服務實例,負載均衡
uri: http://www.example.com/? 不需要直接轉發到固定地址

? 最常用的判斷邏輯

是否用到了 lb://?如果用到了,就需要服務注冊中心(Nacos)。否則不需要。


六、Nginx 與 Gateway 的區別

項目NginxSpring Cloud Gateway
編程語言C語言Java
擴展性靠 Lua 二次開發基于 Java/Spring 插件式開發
所屬層級網絡層(L7)反向代理微服務層
適合高性能網絡轉發服務間通信、認證授權、動態路由


七、自定義全局過濾器(如 Token 攔截)

想要了解更多過濾器的知識可以去看博主的另一篇文章的第四節有講解及小例子

分布式微服務--GateWay(補充)-CSDN博客

@Component
public class TokenFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");if (token == null || token.isEmpty()) {ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.BAD_REQUEST);DataBuffer buffer = response.bufferFactory().wrap("token not is null".getBytes());return response.writeWith(Mono.just(buffer));}return chain.filter(exchange);}
}

八、接口安全措施總結

  1. 冪等性控制:使用 token 防重復提交

  2. HTTPS 加密傳輸

  3. MD5 簽名防篡改

  4. API 權限控制(白名單、黑名單、OAuth2)

  5. 熔斷、降級、隔離防止雪崩

  6. Swagger 文檔統一管理


九、網關高可用架構

  • 使用 Nginx / LVS + Gateway 實現高可用網關

  • 網關本身無狀態,可水平擴展

  • 示例 Nginx 配置:

upstream gateway_cluster {server 127.0.0.1:8081;server 127.0.0.1:8082;
}server {listen 80;server_name gateway.example.com;location / {proxy_pass http://gateway_cluster;}
}

🔁 十、動態路由實現(基于數據庫)

表結構

CREATE TABLE boyatop_gateway (id INT AUTO_INCREMENT PRIMARY KEY,route_id VARCHAR(50),route_name VARCHAR(255),route_pattern VARCHAR(255),route_type VARCHAR(10),route_url VARCHAR(255)
);

核心代碼

public void loadRoute(GateWayEntity gateway) {RouteDefinition definition = new RouteDefinition();definition.setId(gateway.getRouteId());PredicateDefinition predicate = new PredicateDefinition();predicate.setName("Path");predicate.addArg("pattern", gateway.getRoutePattern());FilterDefinition filter = new FilterDefinition();filter.setName("StripPrefix");filter.addArg("_genkey_0", "1");URI uri = gateway.getRouteType().equals("0") ?UriComponentsBuilder.fromUriString("lb://" + gateway.getRouteUrl()).build().toUri(): UriComponentsBuilder.fromHttpUrl(gateway.getRouteUrl()).build().toUri();definition.setUri(uri);definition.setPredicates(List.of(predicate));definition.setFilters(List.of(filter));routeDefinitionWriter.save(Mono.just(definition)).subscribe();publisher.publishEvent(new RefreshRoutesEvent(this));
}

🔄 十一、謂詞(斷言)與過濾器

  • 謂詞(Predicates):判斷是否匹配請求

    • Path=/xxx/**

    • After=時間

    • Host=xxx.example.com

    • Method=GET

    • Header=X-Request-Id, \d+

    • Weight=group1, 2

  • 過濾器(Filters):處理請求前/后邏輯

    • StripPrefix=1

    • AddRequestHeader=X-Name, value

    • RewritePath=/old/(?<segment>.*), /new/${segment}

    • Retry、CircuitBreaker


🌍 十二、解決跨域問題(CORS)

全局跨域過濾器實現

@Component
public class CorsFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpResponse response = exchange.getResponse();HttpHeaders headers = response.getHeaders();headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "*");headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");return chain.filter(exchange);}
}

🔬 十三、源碼啟動流程(核心組件)

  1. GatewayClassPathWarningAutoConfiguration:校驗是否依賴 webflux

  2. GatewayAutoConfiguration:加載所有核心 Bean(如 RouteDefinitionLocator)

  3. RoutePredicateHandlerMapping:路由匹配

  4. FilteringWebHandler:執行過濾器鏈

  5. GatewayFilterChain:按順序執行自定義/內置過濾器

  6. GatewayLoadBalancerClientAutoConfiguration:整合負載均衡器

  7. GatewayRedisAutoConfiguration:限流配置

  8. GatewayDiscoveryClientAutoConfiguration:注冊中心服務發現


🧠 十四、常見錯誤總結

  • 錯誤:required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer'

  • 原因:Spring Cloud Gateway 使用 webflux,請刪除 spring-boot-starter-web 依賴,使用 spring-boot-starter-webflux


📚 十五、關鍵詞匯速查表

名稱說明
Route路由配置(包含 id、uri、predicates、filters)
Predicate請求匹配規則(Path、Method、Header、Host)
Filter請求過濾器,可修改請求/響應
lb://使用服務名轉發(注冊中心)
StripPrefix去除路徑前綴
RefreshRoutesEvent動態刷新路由事件

📎 官方參考文檔

  • Spring Cloud Gateway

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

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

相關文章

大文件斷點續傳(vue+springboot+mysql)

斷點續傳vue前端代碼后端代碼controller 層service層持久層主表&#xff0c;初始化單次上傳文件表&#xff0c;單次上傳所有的文件記錄文件分塊表科普信息參考其他博主 流程圖 vue前端代碼 這里是只做了demo示例&#xff0c;主線測試沒什么問題&#xff0c;前端同學可參考修…

Nodejs》》MySql

Node.js 操作MySQL數據庫 文檔 # 項目要先安裝mysql包npm i mysqlxx // 安裝指定版本npm i mysql // 默認安裝最新版本 # 連接 mysq// 使用連接池連接const mysql require(mysql)# 建立連接const db mysql.createPool({host:, // 數據庫的IP地址user:ro…

金倉數據庫常見問題(持續更新)

目錄 1.查看大小是否敏感寫參數&#xff0c;提示&#xff1a;未認可的配置參數 "case_sensitive" 2.sys_backup.sh init時提示can not connect the primary node 3.設置邏輯備份運行腳本時提示錯誤are not allowed to use this program (crontab) 4.修改表字段類…

Docker Buildx最佳實踐:多架構鏡像構建指南

文章目錄為什么需要 Docker Buildx安裝與啟用 Docker Buildx創建多架構構建器實例構建多架構鏡像優化構建性能調試多架構構建實戰案例&#xff1a;構建 Go 應用多架構鏡像總結Docker Buildx 是 Docker 官方推出的擴展工具&#xff0c;用于支持多平臺鏡像構建&#xff0c;簡化跨…

你用的是什么鍵盤?

在電競行業飛速發展的當下&#xff0c;游戲鍵盤作為玩家操作的核心載體&#xff0c;其性能表現直接影響著游戲體驗與競技結果。而賽卓電子推出的磁軸鍵盤專用芯片 SC4823&#xff0c;憑借一系列突破性的技術特性&#xff0c;正成為游戲鍵盤領域的性能革新者。?對于游戲玩家而言…

Activiti 中各種 startProcessInstance 接口之間的區別

前言在用 RuntimeService 接口啟動流程實例時&#xff0c;總是分不清楚不同 startProcessInstanceXXX 接口之間的區別&#xff0c;這篇文章基于 Activiti 7.0.0.GA 版本&#xff0c;對這一類接口進行一個梳理和歸類。詳解接口列表RuntimeService 接口中以 startProcessInstance…

新手BUG:函數中 static 變量的賦值語句只會執行一次

在 C 函數中使用 static 變量時&#xff0c;很多新手會陷入一個認知誤區&#xff1a;認為變量的初始化語句會在每次函數調用時執行。比如在bool funcA() { // Q&#xff1a;多次調用funcA&#xff0c;funcB會被執行幾次&#xff1f;// A&#xff1a;1次static bool value func…

Python 基礎詳解:數據類型(Data Types)—— 程序的“數據基石”

一、引言&#xff1a;為什么數據類型如此重要&#xff1f;在 Python 編程中&#xff0c;數據類型決定了&#xff1a;數據的存儲方式可以對數據執行的操作數據的取值范圍不同類型之間的運算規則理解數據類型是編寫正確、高效程序的基礎。Python 是動態類型語言&#xff0c;雖然你…

WindowsLinux系統 安裝 CUDA 和 cuDNN

Windows安裝前的準備工作 檢查硬件兼容性&#xff1a;確認電腦顯卡為 NVIDIA GPU。通過快捷鍵 Win R 喚出“運行”&#xff0c;輸入“control /name Microsoft.DeviceManager”喚出“設備管理器”&#xff0c;點擊“顯示適配器”查看是否有 NVIDIA 字樣。 驗證 CUDA 支持性&a…

工業數采引擎-通信鏈路SOCKET

通信庫&#xff1a;DotNetty 封裝實現&#xff1a;TcpServer、TcpClient、Udp TCP協議特性&#xff1a;面向連接協議&#xff1b;每個新連接都會創建獨立的ChannelHandler實例&#xff1b;TcpHandler構造函數在每次客戶端連接時觸發 UDP協議特性&#xff1a;無連接協議&#…

PHP小白零基礎入門(附視頻教程)

概述 PHP是一種通用開源腳本語言&#xff0c;常用于服務器端Web開發&#xff0c;具有語法簡單、上手快等特點。視頻教程&#xff1a;https://pan.quark.cn/s/8f214c23301b 搭建開發環境&#xff1a; 選擇集成工具&#xff1a;可選擇XAMPP&#xff08;支持Windows/Mac/Linux…

驗證碼等待時間技術在酒店自助入住、美容自助與社區場景中的應用必要性研究—仙盟創夢IDE

代碼 代碼 完整<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>驗證碼倒計時</title><s…

Flask從入門到實戰:基礎、進階、項目架構與接口測試

本文將帶你從零開始掌握Flask框架&#xff0c;涵蓋基礎使用、進階技巧、項目架構設計&#xff0c;并提供完整的接口測試客戶端代碼。 目錄一、Flask基礎入門1.1 Flask簡介與安裝1.2 第一個Flask應用1.3 路由與請求處理1.4 請求與響應處理二、Flask進階使用2.1 模板引擎Jinja22.…

華為云產品圖解

框架圖核心說明: 1. 分層邏輯清晰 基礎設施層(IaaS):提供最基礎的計算(ECS/BMS)、存儲(OBS/EVS)、網絡(VPC/CDN)資源,是所有上層服務的 “物理底座”。 平臺服務層(PaaS):基于 IaaS 構建,提供容器編排(CCE)、數據庫(GaussDB)、大數據與 AI(ModelArts)、中…

Git 中如何回退到以前的提交記錄?

回答重點要在 Git 中回退到以前的提交記錄&#xff0c;你可以使用 git reset 命令。這個命令有三個常用選項來控制你想要回退的程度&#xff1a;1&#xff09; git reset --soft <commit> &#xff1a;僅修改 HEAD 指針&#xff0c;不修改索引和工作區內容。2&#xff09…

JavaWeb03——基礎標簽及樣式(表單)(黑馬視頻筆記)

1.表單標簽 及 表單屬性表單標簽是 &#xff1a;<form> 表單屬性有&#xff1a;action 和 method&#xff1b;action屬性&#xff1a;規定向何處發送表單數據。method屬性&#xff1a;規定用什么方法發送數據。&#xff08;get和post&#xff09;get:在發送的url后面拼接…

STM32的SPI通信(軟件讀寫W25Q64)

在了解完I2C通信后&#xff0c;不免會接觸到到SPI通信。而一開始&#xff0c;可能會覺得兩者好似沒什么區別。為什么要學SPI呢&#xff0c;I2C和SPI有什么區別呢。為此我詳細展開說說。1.什么是 SPI&#xff1f;SPI&#xff0c;全稱 Serial Peripheral Interface&#xff0c;中…

子詞分詞器(Byte Pair Encoding + WordPiece)

參考文章&#xff1a;子詞分詞器BPE和WordPiece理解_wordpeice-CSDN博客 子詞分詞器BPE和WordPiece理解_wordpeice-CSDN博客 WordPiece 和 BPE 的區別-CSDN博客 點互信息&#xff08;PMI&#xff09;和正點互信息&#xff08;PPMI&#xff09;-CSDN博客 https://zhuanlan.z…

阿里招AI產品運營

AI產品運營&#xff08;崗位信息已經過jobleap.cn授權&#xff0c;可在csdn發布&#xff09;靈犀互娛 廣州收錄時間&#xff1a; 2025年08月05日職位描述負責AI技術在游戲行業的應用與落地&#xff0c;專注于海外市場的運營中臺建設&#xff1b; 將結合AI技術與游戲行業特點&a…

Git 分支遷移完整指南(結合分支圖分析)

基于分支圖的當前狀態分析 分支圖關鍵信息解讀?分支結構?&#xff1a; #mermaid-svg-gc9SPnwlbrM2FzHf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gc9SPnwlbrM2FzHf .error-icon{fill:#552222;}#mermaid-svg-…