JiaHe's Blog

读万卷书,行万里路

Spring Cloud Gateway

4.0.5

该项目提供了一个构建在 Spring 生态系统之上的 API 网关,包括:Spring 6、Spring Boot 3 和 Project Reactor。 Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。

如何包含Spring Cloud Gateway

要在您的项目中包含 Spring Cloud Gateway,请使用组 ID 为 org.springframework.cloud 和工件 ID 为 spring-cloud-starter-gateway 的启动器。有关使用当前 Spring Cloud Release Train 设置构建系统的详细信息,请参阅 Spring Cloud 项目页面。

如果包含启动器,但不希望启用网关,请设置 spring.cloud.gateway.enabled=false

Spring Cloud Gateway 建立在 Spring Boot、Spring WebFlux 和 Project Reactor 之上。因此,当您使用 Spring Cloud Gateway 时,您所知道的许多熟悉的同步库(例如 Spring Data 和 Spring Security)和模式可能并不适用。如果您不熟悉这些项目,我们建议您在使用 Spring Cloud Gateway 之前首先阅读它们的文档以熟悉一些新概念。

Spring Cloud Gateway 需要 Spring Boot 和 Spring Webflux 提供的 Netty 运行时。它在传统的 Servlet 容器中或构建为 WAR 时不起作用。

词汇表

  • Route:网关的基本构建块。它由 ID、目标 URI、谓词集合和过滤器集合定义。如果聚合谓词为真,则路由匹配。
  • Predicate:这是一个 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange 。这使您可以匹配 HTTP 请求中的任何内容,例如标头或参数。
  • Filter:这些是使用特定工厂构建的 GatewayFilter 的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

它是如何工作的

下图提供了 Spring Cloud Gateway 工作原理的高级概述:

Spring Cloud Gateway Diagram

客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 确定请求与路由匹配,则将其发送到 Gateway Web Handler。此处理程序通过特定于请求的过滤器链运行请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“预”过滤器逻辑。然后进行代理请求。发出代理请求后,运行“post”过滤器逻辑。

在没有端口的路由中定义的 URI 分别为 HTTP 和 HTTPS URI 获取默认端口值 80 和 443。

配置路由谓词工厂和网关过滤器工厂

有两种配置谓词和过滤器的方法:快捷方式和完全扩展的参数。下面的大多数示例都使用快捷方式。

名称和参数名称在每个部分的第一句或第二句中列为 code 。这些参数通常按快捷方式配置所需的顺序列出。

快捷方式配置

快捷方式配置由过滤器名称识别,后跟等号 ( = ),然后是用逗号分隔的参数值 ( , )。

application.yml
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievalue

前面的示例使用两个参数定义了 Cookie Route Predicate Factory,cookie 名称 mycookie 和匹配 mycookievalue 的值。

完全扩展的参数

完全扩展的参数看起来更像是带有名称/值对的标准 yaml 配置。通常,会有一个 name 键和一个 args 键。 args 键是键值对的映射,用于配置谓词或过滤器。

application.yml
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue

这是上面显示的 Cookie 谓词的快捷方式配置的完整配置。

路由谓词工厂

Spring Cloud Gateway 将路由作为 Spring WebFlux HandlerMapping 基础设施的一部分进行匹配。 Spring Cloud Gateway 包含许多内置的路由谓词工厂。所有这些谓词都匹配 HTTP 请求的不同属性。您可以将多个路由谓词工厂与逻辑 and 语句结合起来。

类型说明示例
After某个时间点之后的请求- After=2017-01-20T17:42:47.789-07:00[America/Denver]
Before某个时间点之前的请求- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
Between某两个时间点之间的请求- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含指定的Cookie- Cookie=chocolate, ch.p
Header请求必须包含指定的Header- Header=X-Request-Id, \d+
Host请求必须是来自指定的Host- Host=**.somehost.org,**.anotherhost.org
Method请求方法必须是指定的方法- Method=GET, POST
Path请求路径必须符合指定的规则- Path=/red/{segment},/blue/{segment
Query请求参数b包含指定参数- Query=green
RemoteAddr请求IP必须是指定的范围- RemoteAddr=192.168.1.1/24
Wright权重处理- Weight=group1, 2
XForwarded Remote Addr根据 X-Forwarded-For HTTP 标头过滤请求- XForwardedRemoteAddr=192.168.1.1/24

GatewayFilter Factories

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。 Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。

有关如何使用以下任何过滤器的更多详细示例,请查看单元测试

类型说明
AddRequestHeader添加请求头
AddRequestHeadersIfNotPresent添加请求头(如果不存在)
AddRequestParameter添加请求参数
AddResponseHeader添加响应头
CircuitBreaker断路器
CacheRequestBody缓存请求体
DedupeResponseHeader删除响应头中的重复信息
FallbackHeaders定义回退响应头信息
JsonToGrpc将JSON转换为gRPC
LocalResponseCache缓存响应
MapRequestHeader修改请求头中的特定属性值
ModifyRequestBody修改请求体
ModifyResponseBody请求响应体
PrefixPath修改请求路径前缀
PreserveHostHeader保持原始请求头中的host信息
RedirectTo重定向
RemoveJsonAttributesResponseBody删除响应体中的JSON属性
RemoveRequestHeader删除请求头
RemoveRequestParameter删除请求参数
RemoveResponseHeader删除响应头
RequestHeaderSize对请求头大小进行限制
RequestRateLimiter请求频率限制
RewriteLocationResponseHeader重写响应头中的location信息
RewritePath重写请求路径
RewriteResponseHeader重写响应头信息
SaveSession将session信息保存在响应cookie中
SecureHeaders添加安全性相关的HTTP响应头信息
SetPath设置请求路径
SetRequestHeader设置请求头信息
SetResponseHeader设置响应头信息
SetStatus设置响应状态码
StripPrefix移除请求路径前缀
Retry定义重试策略
RequestSize对请求体大小进行限制
SetRequestHostHeader设置请求头中的host信息
TokenRelay在请求头或请求参数中传递身份验证令牌
Default Filters默认过滤器

全局过滤器

GlobalFilter 接口与 GatewayFilter 具有相同的签名。这些是有条件地应用于所有路由的特殊过滤器。

此接口及其用法可能会在未来的里程碑版本中发生变化。

过滤器名称描述
Gateway Metrics Filter收集和记录网关指标的过滤器,如请求计数、响应时间等
Local ResponseCache Filter缓存响应数据的过滤器,可以加速请求响应速度
Forward Routing Filter将请求转发到下游服务的过滤器
Netty Routing Filter基于Netty的路由过滤器,使用异步非阻塞I/O
Netty Write Response Filter将响应写回客户端的过滤器
Reactive LoadBalancer Client Filter使用Reactive LoadBalancer将请求路由到下游服务的过滤器
RouteToRequestUrl Filter根据请求URL路由到相应的下游服务的过滤器
WebsocketRouting FilterWebSocket路由过滤器,用于将WebSocket请求路由到下游服务