Spring?Cloud?Gateway與Envoy?Sidecar在微服務(wù)請(qǐng)求路由中的架構(gòu)設(shè)計(jì)
Spring Cloud Gateway與Envoy Sidecar在微服務(wù)請(qǐng)求路由中的架構(gòu)設(shè)計(jì)分享
在現(xiàn)代微服務(wù)架構(gòu)中,請(qǐng)求路由層承擔(dān)著流量分發(fā)、安全鑒權(quán)、流量控制等多重職責(zé)。傳統(tǒng)的單一網(wǎng)關(guān)方案往往面臨可擴(kuò)展性和可維護(hù)性挑戰(zhàn)。本文將從真實(shí)生產(chǎn)環(huán)境出發(fā),分享如何結(jié)合Spring Cloud Gateway與Envoy Sidecar實(shí)現(xiàn)高可用、可擴(kuò)展的請(qǐng)求路由設(shè)計(jì)。
1. 業(yè)務(wù)場(chǎng)景描述
- 我們的電商平臺(tái)包含幾十個(gè)微服務(wù),接口種類繁多。
- 需要統(tǒng)一的流量入口,用于鑒權(quán)、限流、灰度發(fā)布、權(quán)重路由等。
- 隨著服務(wù)規(guī)模擴(kuò)大,單臺(tái)網(wǎng)關(guān)承載壓力和部署頻率成為瓶頸。
- 期望將網(wǎng)關(guān)功能解耦、輕量化,并支持不同協(xié)議(HTTP/ gRPC)路由。
2. 技術(shù)選型過(guò)程
2.1 Spring Cloud Gateway(SCG)
- 基于Reactor Netty,易于與Spring生態(tài)集成。
- 提供路由匹配、過(guò)濾鏈、限流器等功能。
- 但純Java實(shí)現(xiàn)對(duì)高并發(fā)場(chǎng)景下的性能存在一定開(kāi)銷。
2.2 Envoy Sidecar
- CNCF項(xiàng)目,采用C++高性能實(shí)現(xiàn),支持豐富協(xié)議。
- 提供外置代理能力,可與服務(wù)部署在同一Pod中。
- 配置靈活,支持動(dòng)態(tài)下發(fā)路由和集群健康檢查。
2.3 架構(gòu)方案對(duì)比
| 方案 | 優(yōu)點(diǎn) | 缺點(diǎn) | | ------------ | ------------------------------ | ---------------------------- | | 單一SCG網(wǎng)關(guān) | 易集成、可編程性強(qiáng) | 性能瓶頸、擴(kuò)縮容慢 | | Envoy網(wǎng)關(guān) | 高性能、協(xié)議豐富 | 配置復(fù)雜、與業(yè)務(wù)耦合度高 | | SCG+Envoy | 雙層路由:輕量協(xié)議過(guò)濾+業(yè)務(wù)路由 | 運(yùn)維成本上升 |
綜合考慮后,我們采用SCG+Envoy Sidecar的雙層網(wǎng)關(guān)架構(gòu),將Envoy作為輕量協(xié)議入口,SCG作為業(yè)務(wù)路由與過(guò)濾鏈執(zhí)行。
3. 實(shí)現(xiàn)方案詳解
3.1 架構(gòu)圖
+-----------------+ +--------------+ +-------------+ | Client | ---> | Envoy Sidecar| ---> | Spring Cloud| | (HTTP/gRPC/X) | | Load Balancer| | Gateway | +-----------------+ +--------------+ +-------------+ | | v v +--------------+ +--------------+ | microservice1| | microservice2| +--------------+ +--------------+
3.2 Envoy Sidecar配置
在每個(gè)Pod中部署Envoy Sidecar,示例envoy.yaml:
static_resources:
listeners:
- name: listener_http
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: svc
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: spring_gateway }
http_filters:
- name: envoy.filters.http.router
clusters:
- name: spring_gateway
connect_timeout: 1s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: spring_gateway
endpoints:
- lb_endpoints:
- endpoint: { address: { socket_address: { address: spring-gateway.default.svc.cluster.local, port_value: 9090 } } }3.3 Spring Cloud Gateway配置
在Spring Boot項(xiàng)目application.yml中:
server:
port: 9090
spring:
cloud:
gateway:
default-filters:
- StripPrefix=1
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/user/**
filters:
- RewritePath=/user/(?.*), /${path}
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/order/**
filters:
- RewritePath=/order/(?.*), /${path}
discovery:
locator:
enabled: true
lower-case-service-id: true3.4 項(xiàng)目結(jié)構(gòu)示例
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部署時(shí),每個(gè)Pod掛載Envoy Sidecar與Spring Cloud Gateway
- 利用Helm Chart統(tǒng)一管理
- CI/CD流水線可拆分鏡像構(gòu)建與Envoy配置下發(fā)
4. 踩過(guò)的坑與解決方案
- Envoy與SCG端口沖突:
- 問(wèn)題:兩者默認(rèn)端口可能沖突導(dǎo)致啟動(dòng)失敗。
- 解決:統(tǒng)一規(guī)劃端口,Envoy監(jiān)聽(tīng)8080,SCG監(jiān)聽(tīng)9090。
- 動(dòng)態(tài)路由更新滯后:
- 問(wèn)題:服務(wù)注冊(cè)中心(Eureka)變更后,Envoy無(wú)法及時(shí)感知。
- 解決:借助xDS API或Sidecar自動(dòng)重啟機(jī)制,實(shí)現(xiàn)配置熱更新。
- 證書(shū)配置復(fù)雜:
- 問(wèn)題:安全通信需TLS,證書(shū)自動(dòng)化下發(fā)難度大。
- 解決:結(jié)合SPIFFE/SDS動(dòng)態(tài)管理證書(shū),Envoy自動(dòng)拉取。
- 高并發(fā)下延遲增大:
- 問(wèn)題:雙層路由增加網(wǎng)絡(luò)跳數(shù)。
- 解決:開(kāi)啟直連模式,對(duì)高頻熱點(diǎn)路徑直連服務(wù),跳過(guò)SCG層。
5. 總結(jié)與最佳實(shí)踐
- 雙層網(wǎng)關(guān)——Envoy側(cè)車+Spring Cloud Gateway結(jié)合了高性能與可編程性。
- 配置管理:采用xDS、Helm 與GitOps流水線實(shí)現(xiàn)配置動(dòng)態(tài)化。
- 健康檢查與熔斷:Envoy與SCG各自側(cè)重層面,保障系統(tǒng)高可用。
- 安全:建議使用mTLS或SPIFFE證書(shū)管理框架統(tǒng)一下發(fā)。
- 性能優(yōu)化:對(duì)核心路徑可直接繞過(guò)SCG,降低網(wǎng)絡(luò)跳數(shù)。
通過(guò)上述方案,既保留了Spring Cloud Gateway的靈活可編程特性,又利用Envoy的高性能代理能力,實(shí)現(xiàn)了高可用、可擴(kuò)展的微服務(wù)請(qǐng)求路由架構(gòu)。若有更多實(shí)踐問(wèn)題,歡迎在評(píng)論區(qū)交流!
到此這篇關(guān)于python基于動(dòng)態(tài)實(shí)例的命令處理設(shè)計(jì)的文章就介紹到這了,更多相關(guān)python基于動(dòng)態(tài)實(shí)例的命令處理設(shè)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
23種設(shè)計(jì)模式(19)java責(zé)任鏈模式
這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java責(zé)任鏈模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
JAVA幫助文檔全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理
JDK(Java Development Kit,Java開(kāi)發(fā)包,Java開(kāi)發(fā)工具)是一個(gè)寫Java的applet和應(yīng)用程序的程序開(kāi)發(fā)環(huán)境。它由一個(gè)處于操作系統(tǒng)層之上的運(yùn)行環(huán)境還有開(kāi)發(fā)者編譯,調(diào)試和運(yùn)行用Java語(yǔ)言寫的applet和應(yīng)用程序所需的工具組成2014-01-01
在SpringBoot項(xiàng)目中連接SQL Server的幾種實(shí)現(xiàn)方式
本文介紹了在SpringBoot項(xiàng)目中連接SQLServer的三種常見(jiàn)方法:使用Microsoft官方的JDBC驅(qū)動(dòng)、第三方的jTDS驅(qū)動(dòng)以及Microsoft提供的官方SpringBootStarter,每種方法均提供了對(duì)應(yīng)的依賴配置和YAML配置示例,幫助開(kāi)發(fā)者輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接2025-09-09
Java使用Spire.PDF for Java實(shí)現(xiàn)將PDF文檔轉(zhuǎn)換為圖片
在文檔處理場(chǎng)景中,PDF 轉(zhuǎn)圖片是一項(xiàng)常見(jiàn)需求,本文將介紹如何使用 Spire.PDF for Java 庫(kù)實(shí)現(xiàn)這一功能,有需要的小伙伴可以參考一下2025-09-09
idea中使用Inputstream流導(dǎo)致中文亂碼解決方法
很多朋友遇到一個(gè)措手不及的問(wèn)題當(dāng)idea中使用Inputstream流導(dǎo)致中文亂碼及Java FileInputStream讀中文亂碼問(wèn)題,針對(duì)這兩個(gè)問(wèn)題很多朋友不知道該如何解決,下面小編把解決方案分享給大家供大家參考2021-05-05
java書(shū)店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(3)
這篇文章主要介紹了java書(shū)店系統(tǒng)畢業(yè)設(shè)計(jì),第三步系統(tǒng)總體設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
SpringBoot接口如何對(duì)參數(shù)進(jìn)行校驗(yàn)
這篇文章主要介紹了SpringBoot接口如何對(duì)參數(shù)進(jìn)行校驗(yàn),在以SpringBoot開(kāi)發(fā)Restful接口時(shí),?對(duì)于接口的查詢參數(shù)后臺(tái)也是要進(jìn)行校驗(yàn)的,同時(shí)還需要給出校驗(yàn)的返回信息放到上文我們統(tǒng)一封裝的結(jié)構(gòu)中2022-07-07
Java解決同時(shí)出庫(kù)入庫(kù)訂單號(hào)自動(dòng)獲取問(wèn)題解決
在Java中,處理多線程環(huán)境下的訂單號(hào)生成問(wèn)題可以采用多種策略,如使用AtomicLong保證線程安全,通過(guò)定義訂單號(hào)生成器并利用線程模擬出庫(kù)和入庫(kù)操作,每個(gè)線程從訂單號(hào)生成器中獲取唯一訂單號(hào),感興趣的朋友一起看看吧2024-09-09

