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 发出请求。如果 Gateway Handler Mapping 确定请求与路由匹配,则将其发送到 Gateway Web Handler。此处理程序通过特定于请求的过滤器链运行请求。过滤器被虚线分开的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“预”过滤器逻辑。然后进行代理请求。发出代理请求后,运行“post”过滤器逻辑。
在没有端口的路由中定义的 URI 分别为 HTTP 和 HTTPS URI 获取默认端口值 80 和 443。
¶配置路由谓词工厂和网关过滤器工厂
有两种配置谓词和过滤器的方法:快捷方式和完全扩展的参数。下面的大多数示例都使用快捷方式。
名称和参数名称在每个部分的第一句或第二句中列为 code
。这些参数通常按快捷方式配置所需的顺序列出。
¶快捷方式配置
快捷方式配置由过滤器名称识别,后跟等号 ( =
),然后是用逗号分隔的参数值 ( ,
)。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
键是键值对的映射,用于配置谓词或过滤器。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 Filter | WebSocket路由过滤器,用于将WebSocket请求路由到下游服务 |