API 网关的核心功能
一个成熟的 API 网关通常提供以下核心功能:
-
动态路由:将请求路由到不同的后端服务,是网关最基本的功能。
-
认证授权:集中处理身份验证(如 JWT 校验)和权限控制,避免在每个微服务中重复实现。
-
限流熔断:限制来自某个用户或服务的请求数量,防止系统被冲垮;当后端服务故障时,快速失败(熔断),避免雪崩效应。
-
负载均衡:在多个服务实例间分发请求。
-
安全防护:防范 SQL 注入、XSS 等常见攻击,管理 SSL 终端。
-
日志与监控:集中收集请求日志和指标,便于问题排查和系统观测。
-
响应聚合:将调用多个微服务的结果聚合起来,返回给客户端,减少网络开销。
-
协议转换:在内部微服务协议和外部客户端协议之间进行转换。
Spring Cloud Gateway 详解
Spring Cloud Gateway 是 Spring Cloud 生态系统官方推出的第二代 API 网关,基于 Spring WebFlux(响应式编程模型)实现,性能比第一代的 Zuul 1.x 更高。
核心概念
Spring Cloud Gateway 的核心工作原理基于三个概念:路由 、断言 和 过滤器。
-
路由 :网关的基本构建块。它由一个 ID、一个目标 URI、一组断言 和一组过滤器组成。如果断言为真,则匹配该路由。
-
断言 :这是 Java 8 中的
Predicate。它用于匹配 HTTP 请求中的任何内容(例如 headers、参数、方法、路径等)。如果请求与所有断言匹配,则该路由被选中。 -
过滤器 :这是
GatewayFilter的实例。你可以在请求被路由之前 或之后,使用过滤器修改请求和响应。
工作流
bash
客户端请求 -> Gateway Handler Mapping -> 找到与断言匹配的路由 -> 发送到 Gateway Web Handler -> 经过"pre"过滤器链 -> 代理请求到后端服务 -> 经过"post"过滤器链 -> 返回响应给客户端
通过yml配置使用
bash
spring:
cloud:
gateway:
routes:
# 路由1:基于路径的路由
- id: user_service_route
uri: http://localhost:8081 # 目标服务URI
predicates:
- Path=/user/** # 断言:匹配以 /user 开头的路径
filters:
- StripPrefix=1 # 过滤器:去掉路径的第一部分(/user),再转发给后端
# 路由2:基于服务发现的路由
- id: order_service_route
uri: lb://ORDER-SERVICE # lb:// 表示从注册中心(如Eureka)获取服务实例并负载均衡
predicates:
- Path=/order/**
- Method=GET,POST # 断言:同时匹配请求方法
filters:
- name: RequestRateLimiter # 过滤器:限流
args:
redis-rate-limiter.replenishRate: 10 # 每秒允许的请求数
redis-rate-limiter.burstCapacity: 20 # 令牌桶容量
key-resolver: "#{@userKeyResolver}" # 限流策略(按用户限流)
# 路由3:集成Hystrix熔断
- id: product_service_route
uri: lb://PRODUCT-SERVICE
predicates:
- Path=/product/**
filters:
- name: Hystrix # 断路器
args:
name: productFallback
fallbackUri: forward:/fallback/product
- AddRequestHeader=X-Request-Color, Blue # 添加请求头
# 熔断降级的Controller
@RestController
public class FallbackController {
@GetMapping("/fallback/product")
public Mono<Map<String, String>> productFallback() {
return Mono.just(Map.of("message", "Product service is temporarily unavailable. Please try again later.", "status", "503"));
}
}
常用断言工厂
Spring Cloud Gateway 内置了许多断言工厂,用于匹配不同的请求条件:
-
Path:请求路径匹配,支持 Ant 风格和正则表达式。 -
Method:请求方法匹配(GET, POST等)。 -
Header:检查请求头是否包含某个名称或符合某个正则。 -
Host:匹配请求的 Host 头。 -
Query:匹配请求参数。 -
Cookie:匹配 Cookie。 -
After,Before,Between:基于时间段的匹配。
常用过滤器工厂
过滤器用于修改请求和响应。分为 Pre 过滤器和 Post 过滤器。
-
请求操作:
-
AddRequestHeader:添加请求头。 -
AddRequestParameter:添加请求参数。 -
RewritePath:重写请求路径。 -
StripPrefix:跳过路径前缀。
-
-
响应操作:
-
AddResponseHeader:添加响应头。 -
DedupeResponseHeader:消除重复的响应头。
-
-
高级功能:
-
RequestRateLimiter:限流。 -
Hystrix/CircuitBreaker:熔断器。 -
Retry:重试机制。 -
SaveSession:在转发前保存 WebSession(常用于 Spring Session)。 -
SecureHeaders:添加安全相关的头部。
-
自定义过滤器:
你可以实现 GatewayFilterFactory 接口来创建自定义过滤器,以满足特定业务逻辑。
