一、 为什么需要 API 网关?
在微服务架构中,客户端通常需要调用多个后端服务。如果没有网关,客户端需要直接维护所有服务的地址,这不仅增加了客户端的复杂度,也使得服务治理变得困难。

网关作为统一入口,承担了以下核心功能:
-
统一入口:所有请求都通过网关转发,隐藏了后端服务的复杂性。
-
请求路由:根据规则将请求分发到不同的微服务。
-
负载均衡:自动将流量分摊到多个服务实例上。
-
安全防护:统一进行身份认证、权限校验和流量控制。
二、 Spring Cloud Gateway 核心架构
Spring Cloud Gateway 的核心组件主要包括 Route(路由) 、Predicate(断言) 和 Filter(过滤器)。
-
Route(路由):路由是网关的基本构建块,它由一个 ID、一个目标 URI、一组断言和一组过滤器定义。
-
Predicate(断言):断言是 Java 8 的 Predicate,输入类型是 Spring 框架的 ServerWebExchange。它允许开发者匹配 HTTP 请求中的任何内容(例如请求头、请求路径、请求参数等)。
-
Filter(过滤器):过滤器是 GatewayFilter 的实例,允许修改请求和响应。过滤器分为"GatewayFilter"(作用于单个路由)和"GlobalFilter"(作用于所有路由)。
工作流程:
-
客户端发送请求到 Gateway。
-
Gateway HandlerMapping 根据配置的路由规则进行匹配。
-
如果匹配成功,请求会被转发到 Gateway WebHandler。
-
WebHandler 会根据配置的过滤器链(Filter Chain)对请求进行处理(如修改请求头、记录日志等)。
-
最终请求被转发到目标服务(Destination)。
三、 实战配置:基于 Nacos 的路由转发
我们来配置一个简单的网关,实现 /api/order/**转发到 service-order,/api/product/**转发到 service-product。

1. 引入依赖
首先,我们需要引入 Spring Cloud Gateway 和 Nacos Discovery 的依赖:
XML
<dependencies>
<!-- Spring Cloud Gateway 核心依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos 服务发现依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
2. 配置文件 (application.yml)
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 127.0.0.1:8848 # Nacos 地址
gateway:
discovery:
locator:
enabled: true # 开启服务发现功能
routes:
# 路由 1:订单服务
- id: order-route
uri: lb://service-order # lb:// 表示使用负载均衡,后面跟服务名
predicates:
- Path=/api/order/** # 断言:匹配 /api/order 开头的路径
filters:
- StripPrefix=1 # 过滤器:去掉第一层前缀(可选,用于路径重写)
# 路由 2:商品服务
- id: product-route
uri: lb://service-product
predicates:
- Path=/api/product/**
filters:
- StripPrefix=1
server:
port: 80 # 网关端口
配置解析:
-
lb://service-order:这里的lb代表 Load Balancer(负载均衡)。网关会自动从 Nacos 中获取service-order的所有实例,并通过负载均衡策略(默认轮询)将请求分发出去。 -
Path=/api/order/**:这是一个断言配置。它表示只有当请求路径以/api/order/开头时,才会匹配到这条路由。 -
StripPrefix=1:这是一个过滤器配置。它表示在转发请求之前,去掉路径中的第一层前缀。例如,请求/api/order/list会被转发为/list到后端服务。
四、 深入理解:断言与过滤器的执行顺序
在 Spring Cloud Gateway 中,断言和过滤器的执行顺序非常重要:
-
断言匹配顺序:网关会按照配置文件中路由的顺序依次匹配断言。一旦匹配成功,就会停止匹配后续路由(除非配置了权重等特殊规则)。
-
过滤器执行顺序:
-
Pre Filters(前置过滤器) :在请求被转发到后端服务之前执行。例如,
AddRequestHeader用于添加请求头。 -
Post Filters(后置过滤器) :在请求被转发到后端服务之后执行。例如,
AddResponseHeader用于添加响应头。
-
示例:
假设我们配置了两个过滤器:
filters:
- AddRequestHeader=X-Request-Id, 12345
- AddResponseHeader=X-Response-Time, 100ms
请求流程如下:
-
客户端请求到达网关。
-
Pre Filter 执行 :网关添加
X-Request-Id请求头。 -
请求转发到后端服务。
-
后端服务处理请求并返回响应。
-
Post Filter 执行 :网关添加
X-Response-Time响应头。 -
响应返回给客户端。
五、 总结
Spring Cloud Gateway 是一个功能强大的 API 网关,它基于 Spring 5、Project Reactor 和 Spring Boot 2.0 构建。通过本文的配置示例,你应该已经掌握了如何利用 Nacos 实现服务发现和负载均衡,以及如何通过断言和过滤器来控制请求的流转。
