Spring Cloud Gateway与Envoy Sidecar在微服务请求路由中的架构设计

 更新时间:2025年08月04日 08:52:43   作者:yfceshi  
本文将从真实生产环境出发,分享如何结合Spring Cloud Gateway与Envoy Sidecar实现高可用、可扩展的请求路由设计,感兴趣的朋友跟随小编一起看看吧

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_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项目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: 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的高性能代理能力,实现了高可用、可扩展的微服务请求路由架构。若有更多实践问题,欢迎在评论区交流!

到此这篇关于python基于动态实例的命令处理设计的文章就介绍到这了,更多相关python基于动态实例的命令处理设计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 23种设计模式(19)java责任链模式

    23种设计模式(19)java责任链模式

    这篇文章主要为大家详细介绍了23种设计模式之java责任链模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理

    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版整理

    JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运行用Java语言写的applet和应用程序所需的工具组成
    2014-01-01
  • 在SpringBoot项目中连接SQL Server的几种实现方式

    在SpringBoot项目中连接SQL Server的几种实现方式

    本文介绍了在SpringBoot项目中连接SQLServer的三种常见方法:使用Microsoft官方的JDBC驱动、第三方的jTDS驱动以及Microsoft提供的官方SpringBootStarter,每种方法均提供了对应的依赖配置和YAML配置示例,帮助开发者轻松实现数据库连接
    2025-09-09
  • jfreechart画折线图的方法

    jfreechart画折线图的方法

    这篇文章主要为大家详细介绍了jfreechart画折线图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 详解Java中Javassist的使用

    详解Java中Javassist的使用

    常用的一些操作字节码的技术有 ASM、AspectJ、Javassist 等。本文主要为大家介绍了Javassist使用的相关知识,感兴趣的小伙伴可以了解一下
    2023-04-04
  • Java使用Spire.PDF for Java实现将PDF文档转换为图片

    Java使用Spire.PDF for Java实现将PDF文档转换为图片

    在文档处理场景中,PDF 转图片是一项常见需求,本文将介绍如何使用 Spire.PDF for Java 库实现这一功能,有需要的小伙伴可以参考一下
    2025-09-09
  • idea中使用Inputstream流导致中文乱码解决方法

    idea中使用Inputstream流导致中文乱码解决方法

    很多朋友遇到一个措手不及的问题当idea中使用Inputstream流导致中文乱码及Java FileInputStream读中文乱码问题,针对这两个问题很多朋友不知道该如何解决,下面小编把解决方案分享给大家供大家参考
    2021-05-05
  • java书店系统毕业设计 用户模块(3)

    java书店系统毕业设计 用户模块(3)

    这篇文章主要介绍了java书店系统毕业设计,第三步系统总体设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • SpringBoot接口如何对参数进行校验

    SpringBoot接口如何对参数进行校验

    这篇文章主要介绍了SpringBoot接口如何对参数进行校验,在以SpringBoot开发Restful接口时, 对于接口的查询参数后台也是要进行校验的,同时还需要给出校验的返回信息放到上文我们统一封装的结构中
    2022-07-07
  • Java解决同时出库入库订单号自动获取问题解决

    Java解决同时出库入库订单号自动获取问题解决

    在Java中,处理多线程环境下的订单号生成问题可以采用多种策略,如使用AtomicLong保证线程安全,通过定义订单号生成器并利用线程模拟出库和入库操作,每个线程从订单号生成器中获取唯一订单号,感兴趣的朋友一起看看吧
    2024-09-09

最新评论