当前位置: 首页 > news >正文

Spring Cloud Gateway:微服务架构下的 API 网关详解

前言

在微服务架构中,API 网关(API Gateway) 是一个关键的组件,它充当了微服务架构的“门面”,负责路由、认证、限流、熔断、日志记录等通用功能。随着微服务数量的增加,传统的网关方案(如 Zuul、Nginx 等)逐渐暴露出性能、可扩展性、灵活性等方面的不足。

Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代 API 网关解决方案,基于 Project ReactorNetty 构建,具有非阻塞、响应式、高性能的特点,是目前构建微服务架构中最主流的网关实现之一。


一、Spring Cloud Gateway 简介

Spring Cloud Gateway 是 Spring Cloud Alibaba 的一部分,但它本身是 Spring Cloud 的原生组件。它使用了 WebFlux + Reactor 技术栈,基于 Netty 提供异步非阻塞的网络通信能力。

1.1 核心概念

Spring Cloud Gateway 有三个核心概念:

  • Route(路由):路由是网关的基本单元,由 ID、目标 URI、断言集合和过滤器集合组成。
  • Predicate(断言):用于匹配请求是否符合某个条件(如路径、方法、头信息等)。
  • Filter(过滤器):用于修改请求和响应,如添加头、修改请求体、限流、鉴权等。

二、Spring Cloud Gateway 的优势

与 Zuul 相比,Spring Cloud Gateway 有以下优势:

特性Spring Cloud GatewayZuul
性能非阻塞,基于 WebFlux 和 Netty,性能更高阻塞式 I/O,性能较低
支持协议HTTP/HTTPS仅支持 HTTP
可扩展性更容易扩展自定义断言和过滤器扩展性较差
集成与 Spring Cloud 生态无缝集成(如 Nacos、Sentinel)集成较为复杂
社区活跃度活跃,持续更新停止更新,转向 Gateway

三、快速入门

3.1 添加依赖

<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Eureka Client(可选) --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
</dependencies>

3.2 配置文件(application.yml)

server:port: 8080spring:application:name: gateway-servicecloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/api/user/**filters:- StripPrefix=1

上面的配置表示:

  • 所有访问 /api/user/** 的请求都会被转发到 user-service 微服务。
  • lb://user-service 表示使用负载均衡访问服务。
  • StripPrefix=1 表示去掉第一层路径 /api/user,只保留后面的部分。

四、核心组件详解

4.1 Route(路由)

路由是网关的核心配置单元,由以下几个部分组成:

  • id:路由的唯一标识
  • uri:目标服务的地址,支持 http://, lb://(负载均衡)等
  • predicates:一组断言,用于匹配请求
  • filters:一组过滤器,用于修改请求或响应

示例:

routes:- id: order-serviceuri: http://localhost:8082predicates:- Method=POST- Path=/api/order/**filters:- AddRequestHeader=X-Request-Id, 123456

4.2 Predicate(断言)

断言用于判断请求是否符合某个条件。Spring Cloud Gateway 提供了多种内置的断言,常见的包括:

断言说明
Path=/api/user/**匹配指定路径
Method=GET匹配指定 HTTP 方法
Header=X-Request-ID, \d+匹配 Header 值是否符合正则
Query=username, abc.*匹配查询参数是否符合正则
After=2025-01-01T00:00:00+08:00[Asia/Shanghai]匹配请求是否在指定时间之后
Between=2025-01-01T00:00:00+08:00[Asia/Shanghai], 2025-12-31T23:59:59+08:00[Asia/Shanghai]匹配请求是否在某个时间段内

4.3 Filter(过滤器)

过滤器用于在请求前后对请求或响应进行处理。Spring Cloud Gateway 分为两种类型的过滤器:

  • GatewayFilter(局部过滤器):作用于特定路由
  • GlobalFilter(全局过滤器):作用于所有路由
常见过滤器示例
过滤器说明
StripPrefix=1去除路径前缀
AddRequestHeader=X-Request-ID, 123456添加请求头
RewritePath=/api/(?<segment>.*), /$\{segment}重写路径
Hystrix=commandName=fallback, fallbackUri=forward:/fallback熔断处理
RateLimiter=redis-rate-limiter.replenishRate=10, redis-rate-limiter.burstCapacity=20限流

五、自定义断言和过滤器

5.1 自定义断言工厂

@Component
public class MyHeaderRoutePredicateFactory extends AbstractRoutePredicateFactory<MyHeaderRoutePredicateFactory.Config> {public MyHeaderRoutePredicateFactory() {super(Config.class);}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return exchange -> {String header = exchange.getRequest().getHeaders().getFirst("X-Custom-Header");return config.value.equals(header);};}public static class Config {private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}}
}

使用方式:

predicates:- MyHeader=X-Custom-Value

5.2 自定义过滤器工厂

@Component
public class MyRequestTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<MyRequestTimeGatewayFilterFactory.Config> {public MyRequestTimeGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {long start = System.currentTimeMillis();return chain.filter(exchange).then(Mono.fromRunnable(() -> {long end = System.currentTimeMillis();System.out.println("请求耗时:" + (end - start) + " ms");}));};}public static class Config {// 可以添加配置项}
}

使用方式:

filters:- MyRequestTime

六、集成服务注册与发现(如 Nacos、Eureka)

Spring Cloud Gateway 可以自动从服务注册中心获取服务实例,并进行负载均衡调用。

示例(Eureka)

spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/user/**

其中 lb://user-service 表示使用负载均衡访问服务。


七、集成熔断机制(Hystrix)

Spring Cloud Gateway 支持集成 Hystrix 进行熔断处理。

spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/user/**filters:- name: Hystrixargs:name: fallbackfallbackUri: forward:/fallback

创建一个 fallback 接口:

@RestController
public class FallbackController {@GetMapping("/fallback")public String fallback() {return "服务不可用,请稍后再试!";}
}

八、限流(RateLimiter)

Spring Cloud Gateway 支持基于 Redis 的限流策略。

spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/user/**filters:- name: RequestRateLimiterargs:rate-limiter: redis-rate-limiterkey-resolver: #{@userKeyResolver}

自定义 Key 解析器:

@Bean
public KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

九、日志与监控

Spring Cloud Gateway 支持与 Sleuth、Zipkin 集成,进行链路追踪;也可以使用 Prometheus + Grafana 进行性能监控。


十、总结

Spring Cloud Gateway 是当前构建微服务架构中最推荐的 API 网关实现,它基于响应式编程模型,具备高性能、低延迟、可扩展性强等优点。通过 Route、Predicate、Filter 三大核心组件,可以灵活实现路由、鉴权、限流、熔断等常见功能。


十一、参考资料

  • Spring Cloud Gateway 官方文档
  • Spring Cloud Alibaba 官方文档
  • Spring WebFlux 官方文档
http://www.lryc.cn/news/600327.html

相关文章:

  • 【星野AI】minimax非活动时间充值优惠漏洞
  • 在Word和WPS文字中要同时查看和编辑一个文档的两个地方?拆分窗口
  • 机器语言基本概念
  • GIS地理信息系统建设:高精度3D建模
  • PHP框架之Laravel框架教程:1. laravel搭建
  • HTML5 Canvas 绘制圆弧效果
  • 通过不同坐标系下的同一向量,求解旋转矩阵
  • 企业级 AI 工具选型报告:9 个技术平台的 ROI 对比与部署策略
  • 【教程】无需迁移IDE!Augment原生插件实现Cursor无缝平替 Claude-4无限用
  • C++学习之深入学习模板(进阶)
  • 详解力扣高频SQL50题之1084. 销售分析 III【简单】
  • C#编程基础:运算符与结构详解
  • iOS 26,双版本更新来了
  • TCP/IP 网络编程面试题及解答
  • Flutter开发 BUG 记录 (持续更新)
  • VTK交互——ClientData
  • 【CTF-Web】dirsearch寻找download.php进行?path=flag.txt任意文件下载
  • C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
  • Caffeine 缓存库的常用功能使用介绍
  • 【GaussDB】构建一个GaussDB的Docker镜像
  • 【CTF-WEB-SQL】SQL注入基本流程-错误注入(sql-labs的Less5)(updatexml)
  • 【GaussDB】如何从GaussDB发布包中提取出内核二进制文件
  • 【每天一个知识点】GAN(生成对抗网络,Generative Adversarial Network)
  • C++核心编程学习--对象特性--友元
  • ICMPv4报文类型详解表
  • GRE及MGRE应用综合实验
  • Spring AI 项目实战(二十):基于Spring Boot + AI + DeepSeek的智能环境监测与分析平台(附完整源码)
  • SpringMVC——请求
  • 常见代码八股
  • 0基础法考随手笔记 03(刑诉05 刑事证据与证明+06 强制措施)