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. 踩过的坑与解决方案
- envoy与scg端口冲突:
- 问题:两者默认端口可能冲突导致启动失败。
- 解决:统一规划端口,envoy监听8080,scg监听9090。
- 动态路由更新滞后:
- 问题:服务注册中心(eureka)变更后,envoy无法及时感知。
- 解决:借助xds api或sidecar自动重启机制,实现配置热更新。
- 证书配置复杂:
- 问题:安全通信需tls,证书自动化下发难度大。
- 解决:结合spiffe/sds动态管理证书,envoy自动拉取。
- 高并发下延迟增大:
- 问题:双层路由增加网络跳数。
- 解决:开启直连模式,对高频热点路径直连服务,跳过scg层。
5. 总结与最佳实践
- 双层网关——envoy侧车+spring cloud gateway结合了高性能与可编程性。
- 配置管理:采用xds、helm 与gitops流水线实现配置动态化。
- 健康检查与熔断:envoy与scg各自侧重层面,保障系统高可用。
- 安全:建议使用mtls或spiffe证书管理框架统一下发。
- 性能优化:对核心路径可直接绕过scg,降低网络跳数。
通过上述方案,既保留了spring cloud gateway的灵活可编程特性,又利用envoy的高性能代理能力,实现了高可用、可扩展的微服务请求路由架构。若有更多实践问题,欢迎在评论区交流!
到此这篇关于python基于动态实例的命令处理设计的文章就介绍到这了,更多相关python基于动态实例的命令处理设计内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论