Spring Cloud Gateway與Envoy Sidecar在微服務請求路由中的架構設計分享

cover

Spring Cloud Gateway與Envoy Sidecar在微服務請求路由中的架構設計分享

在現代微服務架構中,請求路由層承擔著流量分發、安全鑒權、流量控制等多重職責。傳統的單一網關方案往往面臨可擴展性和可維護性挑戰。本文將從真實生產環境出發,分享如何結合Spring Cloud Gateway與Envoy Sidecar實現高可用、可擴展的請求路由設計。

1. 業務場景描述

  • 我們的電商平臺包含幾十個微服務,接口種類繁多。
  • 需要統一的流量入口,用于鑒權、限流、灰度發布、權重路由等。
  • 隨著服務規模擴大,單臺網關承載壓力和部署頻率成為瓶頸。
  • 期望將網關功能解耦、輕量化,并支持不同協議(HTTP/ gRPC)路由。

2. 技術選型過程

2.1 Spring Cloud Gateway(SCG)

  • 基于Reactor Netty,易于與Spring生態集成。
  • 提供路由匹配、過濾鏈、限流器等功能。
  • 但純Java實現對高并發場景下的性能存在一定開銷。

2.2 Envoy Sidecar

  • CNCF項目,采用C++高性能實現,支持豐富協議。
  • 提供外置代理能力,可與服務部署在同一Pod中。
  • 配置靈活,支持動態下發路由和集群健康檢查。

2.3 架構方案對比

| 方案 | 優點 | 缺點 | | ------------ | ------------------------------ | ---------------------------- | | 單一SCG網關 | 易集成、可編程性強 | 性能瓶頸、擴縮容慢 | | Envoy網關 | 高性能、協議豐富 | 配置復雜、與業務耦合度高 | | SCG+Envoy | 雙層路由:輕量協議過濾+業務路由 | 運維成本上升 |

綜合考慮后,我們采用SCG+Envoy Sidecar的雙層網關架構,將Envoy作為輕量協議入口,SCG作為業務路由與過濾鏈執行。

3. 實現方案詳解

3.1 架構圖

+-----------------+      +--------------+      +-------------+
| Client          | ---> | Envoy Sidecar| ---> | Spring Cloud|
| (HTTP/gRPC/X)   |      | Load Balancer|      | Gateway     |
+-----------------+      +--------------+      +-------------+|                 |v                 v+--------------+   +--------------+| microservice1|   | microservice2|+--------------+   +--------------+

3.2 Envoy Sidecar配置

在每個Pod中部署Envoy Sidecar,示例envoy.yaml

static_resources:listeners:- name: listener_httpaddress:socket_address: { address: 0.0.0.0, port_value: 8080 }filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: svcdomains: ["*"]routes:- match: { prefix: "/" }route: { cluster: spring_gateway }http_filters:- name: envoy.filters.http.routerclusters:- name: spring_gatewayconnect_timeout: 1stype: STRICT_DNSlb_policy: ROUND_ROBINload_assignment:cluster_name: spring_gatewayendpoints:- lb_endpoints:- endpoint: { address: { socket_address: { address: spring-gateway.default.svc.cluster.local, port_value: 9090 } } }

3.3 Spring Cloud Gateway配置

在Spring Boot項目application.yml中:

server:port: 9090
spring:cloud:gateway:default-filters:- StripPrefix=1routes:- id: user-serviceuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- RewritePath=/user/(?<path>.*), /${path}- id: order-serviceuri: lb://ORDER-SERVICEpredicates:- Path=/order/**filters:- RewritePath=/order/(?<path>.*), /${path}discovery:locator:enabled: truelower-case-service-id: true

3.4 項目結構示例

gateway-service/
├── src/main/java/
│   └── com.example.gateway
│       ├── GatewayApplication.java
│       └── filters/
│           └── AuthFilter.java
├── src/main/resources/
│   └── application.yml
└── Dockerfile

3.5 部署與CI/CD

  • 使用Kubernetes Deployment部署時,每個Pod掛載Envoy Sidecar與Spring Cloud Gateway
  • 利用Helm Chart統一管理
  • CI/CD流水線可拆分鏡像構建與Envoy配置下發

4. 踩過的坑與解決方案

  1. Envoy與SCG端口沖突

    • 問題:兩者默認端口可能沖突導致啟動失敗。
    • 解決:統一規劃端口,Envoy監聽8080,SCG監聽9090。
  2. 動態路由更新滯后

    • 問題:服務注冊中心(Eureka)變更后,Envoy無法及時感知。
    • 解決:借助xDS API或Sidecar自動重啟機制,實現配置熱更新。
  3. 證書配置復雜

    • 問題:安全通信需TLS,證書自動化下發難度大。
    • 解決:結合SPIFFE/SDS動態管理證書,Envoy自動拉取。
  4. 高并發下延遲增大

    • 問題:雙層路由增加網絡跳數。
    • 解決:開啟直連模式,對高頻熱點路徑直連服務,跳過SCG層。

5. 總結與最佳實踐

  • 雙層網關——Envoy側車+Spring Cloud Gateway結合了高性能與可編程性。
  • 配置管理:采用xDS、Helm 與GitOps流水線實現配置動態化。
  • 健康檢查與熔斷:Envoy與SCG各自側重層面,保障系統高可用。
  • 安全:建議使用mTLS或SPIFFE證書管理框架統一下發。
  • 性能優化:對核心路徑可直接繞過SCG,降低網絡跳數。

通過上述方案,既保留了Spring Cloud Gateway的靈活可編程特性,又利用Envoy的高性能代理能力,實現了高可用、可擴展的微服務請求路由架構。若有更多實踐問題,歡迎在評論區交流!

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

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

相關文章

GitHub Pages+Jekyll 靜態網站搭建(二)

GitHub PagesJekyll 靜態網站搭建&#xff08;二&#xff09;GitHub PagesJekyll 靜態網站搭建&#xff08;二內容簡介搭建模板網站部署工作流程GitHub PagesJekyll 靜態網站搭建&#xff08;二 內容簡介 &#x1f6a9; Tech Contents 該文主要涉及Jekyll主題的下載與使用。Gi…

Django 實戰:I18N 國際化與本地化配置、翻譯與切換一步到位

文章目錄一、國際化與本地化介紹定義相關概念二、安裝配置安裝 gettext配置 settings.py三、使用國際化視圖中使用序列化器和模型中使用四、本地化操作創建或更新消息文件消息文件說明編譯消息文件五、項目實戰一、國際化與本地化介紹 定義 國際化和本地化的目標&#xff0c;…

通過國內扣子(Coze)搭建智能體并接入discord機器人

國內的扣子是無法直接授權給discord的&#xff0c;但是用國外的coze的話&#xff0c;大模型調用太貴&#xff0c;如果想要接入國外的平臺&#xff0c;那就需要通過調用API來實現。 1.搭建智能體&#xff08;以工作流模式為例&#xff09; 首先&#xff0c;我們需要在扣子平臺…

【辦公類-107-02】20250719視頻MP4轉gif(削減MB)

背景需求 最近在寫第五屆智慧項目結題(一共3篇)寫的昏天黑地,日以繼夜。 我自己《基于“AI技術”的幼兒園教學資源開發和運用》提到了AI繪畫、AI視頻和AI編程。 為了更好的展示AI編程的狀態,我在WORD里面插入了MP4轉gif的動圖。 【教學類-75-04】20241023世界名畫-《蒙…

一文講清楚React的render優化,包括shouldComponentUpdate、PureComponent和memo

文章目錄一文講清楚React的render優化&#xff0c;包括shouldComponentUpdate、PureComponent和memo1. React的渲染render機制2. shouldComponentUpdate2.1 先上單組件渲染&#xff0c;驗證state變化2.2 上父子組件&#xff0c;驗證props2. PureComponent2.1 單組件驗證state2.…

物聯網iot、mqtt協議與華為云平臺的綜合實踐(萬字0基礎保姆級教程)

本學期的物聯網技術與應用課程&#xff0c;其結課設計內容包含&#xff1a;mqtt、華為云、PyQT5和MySQL等結合使用&#xff0c;完成了從華為云配置產品信息以及轉發規則&#xff0c;到mqtt命令轉發&#xff0c;再到python編寫邏輯代碼實現相關功能&#xff0c;最后用PyQT5實現面…

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson項目

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson項目 下面我將詳細介紹如何在IntelliJ IDEA中使用Maven搭建一個集成Fastjson的SpringBoot項目&#xff0c;包含完整的環境配置和代碼實現。 一、環境準備 軟件要求 IntelliJ IDEA 2021.x或更高版本JDK 1.8或更高版本&#x…

Java從入門到精通!第九天, 重點!(集合(一))

十一、集合1. 為什么要使用集合(1) 數組存在的弊端1) 數組在初始化之后&#xff0c;長度就不能改變&#xff0c;不方便擴展。2) 數組中提供的屬性和方法比較少&#xff0c;不便于進行添加、刪除、修改等操作&#xff0c;并且效率不高&#xff0c;同時無法直接存儲元素的個數。3…

為什么使用時序數據庫

為什么使用時序數據庫&#xff1f; 時序數據庫&#xff08;Time-Series Database, TSDB&#xff09;是專為時間序列數據優化的數據庫&#xff0c;相比傳統關系型數據庫&#xff08;如MySQL&#xff09;或NoSQL數據庫&#xff08;如MongoDB&#xff09;&#xff0c;它在以下方面…

計算機網絡:(十一)多協議標記交換 MPLS

計算機網絡&#xff1a;&#xff08;十一&#xff09;多協議標記交換 MPLS前言一、傳統網絡的問題二、MPLS&#xff1a;給數據包貼個“標簽”三、MPLS的工作流程1. 入站2. 中間3. 出站四、MPLS的能力前言 前面我們講解了計算機網絡中網絡層的相關知識&#xff0c;包括網絡層轉發…

docker run elasticsearch 報錯

谷粒商城 p103 前提條件&#xff1a; 下載鏡像文件 #存儲和檢索數據 docker pull elasticsearch:7.4.2 #可視化檢索數據 docker pull kibana:7.4.2 創建掛載的文件和配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.h…

巧用Callbre RVE生成DRC HTML report及CTO的使用方法

對于后端版圖人員&#xff0c;在芯片TO前的LV signoff階段&#xff0c;猶如一段漫長而有期待的朝圣之旅&#xff0c;需要耐心&#xff0c;毅力和信心&#xff0c;在龐雜的DRC中找到一條收斂之路。為了讓此路更為清晰收斂&#xff0c;Calibre提供了一套可追溯對比的富文本方式-H…

產品需求文檔(PRD)格式全解析:從 RP 到 Word 的選擇與實踐

產品需求文檔&#xff08;PRD&#xff09;的形式多種多樣&#xff0c;但核心目標始終一致&#xff1a;清晰傳遞產品需求&#xff0c;讓團隊高效協作。不同公司對 PRD 的格式要求可能不同&#xff0c;有的偏愛直接在原型工具中撰寫&#xff0c;有的則習慣用 Word 整理歸檔。本文…

【C++】入門階段

一、初始化C中的初始化指為變量賦予初始值的過程。初始化方式多樣&#xff0c;適用于不同場景。char cha0; char chb{0}; char chc(\0); char chdcha; char che{};注意事項優先使用列表初始化&#xff08;{}&#xff09;&#xff0c;避免窄化轉換風險。在c11中{ }在變量&#x…

tailscale在ubuntu22.04上使用

支持 x86 和 ARM 架構 CPU 的軟件包已提供 32 位和 64 位版本。 添加 Tailscale 的軟件包簽名密鑰及倉庫&#xff1a; curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null c…

深入解析Linux文件重定向原理與dup2系統調用

在Linux中&#xff0c;重定向&#xff08;Redirection&#xff09;是一種強大的功能&#xff0c;允許用戶控制命令的輸入來源&#xff08;stdin&#xff09;和輸出目標&#xff08;stdout和stderr&#xff09;。通過重定向&#xff0c;你可以將命令的輸出保存到文件、從文件讀取…

QGIS制作的儀表盤工程

在QGIS的官方資源庫下載了一個QGIS制作的儀表盤工程&#xff0c;感覺非常炫酷&#xff01;分享給大家&#xff01;下面的儀表盤會將選中的道路數及長度&#xff0c;動態顯示在相應的儀表項中&#xff01;下面的儀表盤會將選中的道路數及長度&#xff0c;動態顯示在相應的儀表項…

Python高級數據類型:集合(Set)

集合是Python中一種非常有用的數據結構&#xff0c;它與列表類似但具有獨特的特性。本文將全面介紹集合的所有知識點&#xff0c;從基礎概念到高級用法&#xff0c;幫助初學者徹底掌握集合的使用。1. 集合簡介1.1 什么是集合&#xff1f;集合&#xff08;Set&#xff09;是Pyth…

【Unity編輯器開發GUI.Window】

Unity GUI.Window 筆記 根據官方文檔2021版本的&#xff0c;點擊鏈接跳轉記錄 概述 GUI.Window 是 Unity IMGUI 系統中用于創建彈出窗口的核心方法&#xff0c;具有以下關鍵特性&#xff1a; 浮動窗口&#xff1a;浮于普通 GUI 控件之上焦點控制&#xff1a;可通過點擊獲得焦…

CAN通信驅動開發注意事項

以下是CAN通信驅動開發的關鍵注意事項相關的整理,涵蓋硬件配置、協議實現、錯誤處理及性能優化等方面: 一、硬件層配置要點 引腳復用與時鐘 確認MCU的CAN控制器引腳是否與GPIO復用,正確配置復用模式。 檢查CAN控制器時鐘源,確保波特率計算基準準確。 收發器(Transceiver)…