Spring Cloud Gateway
大约 4 分钟
Spring Cloud Gateway
网关
- 网关
- 网关的基础就是路由功能,通俗解释就是地址转发。
介绍
- Spring Cloud Gateway
- 一个构建API网关的库,在 Spring WebFlux 或 Spring WebMVC 之上。
- 提供了一种简单而有效的方式来路由到API
- 并为它们提供横切关注点,例如:安全性、监控/指标和弹性。
- 主要特性
- 基于Spring框架和Spring Boot;
- 动态路由,能够匹配任何请求属性的路由;
- 可以对路由指定 断言(Predicate)和 过滤器(Filter)
- 熔断(Circuit Breaker integration)
- 服务发现(Spring Cloud DiscoveryClient integration)
- 易于编写的Predicate和Filter(Easy to write Predicates and Filters)
- 请求限流(Request Rate Limiting)
- 路径重写(Path Rewriting)
- 三大核心概念
- 路由 Route
- 由ID和uri组成,一个路由可以包含多个 断言条件 和 多个 过滤器
- 断言 Predicate
- Java 8 Function Predicate, 输入类型 Spring Framework ServerWebExchange
- 匹配请求
- 匹配请求的任意属性,如 路径、请求头、请求参数等
- 过滤器 Filter
- 修改请求和响应
- 路由 Route
工作流程
- 接收请求
- Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler
- Handler再通过指定的过滤器链来对请求进行过滤处理
- 分发请求到业务服务端
- 业务服务端处理完成后,如若需要过滤器进行响应过滤处理,返回响应;
内置断言工厂
匹配HTTP请求的不同属性
可以组合在一起
内置的断言工厂类都实现了 AbstractRoutePredicateFactory 抽象类
org.springframework.cloud.gateway.handler.predicate
Version : 2.2.9.RELEASE
gateway-request-predicates-factories
After Route Predicate Factory
- 设置时间参数,表示路由配置会在指定时间点之后生效
- After=2025-05-20T08:00:00.000+08:00[Asia/Shanghai]
Before Route Predicate Factory
- 设置时间参数,表示路由配置会在指定时间点之前生效
- Before=2035-05-20T08:00:00.000+08:00[Asia/Shanghai]
Between Route Predicate Factory
- 设置时间区间,表示路由配置会在指定的时间区间内生效
- Between=2025-05-20T08:00:00.000+08:00[Asia/Shanghai],2035-05-20T08:00:00.000+08:00[Asia/Shanghai]
Cookie Route Predicate Factory
- 设置Cookie匹配
- 有两个参数
- Cookie 名称
- regexp(一个Java正则表达式) ,Cookie 值 正则表达式
- 有两个参数
- Header=X-Request-Id, \d+
Header Route Predicate Factory
- 设置请求头匹配
- 有两个参数
- Header 名称
- regexp(一个Java正则表达式) ,Header 值 正则表达式
- 有两个参数
Host Route Predicate Factory
- 匹配 主机名模式 列表,多个使用逗号隔开
- Ant风格主机名匹配规则,使用
.
分隔- org.springframework.util.AntPathMatcher
?
匹配任何单字符*
匹配0或者任意数量的字符**
匹配0或者更多的目录
- Host=**.somehost.org,**.anotherhost.org
Method Route Predicate Factory
- 匹配的HTTP请求方式
- Method=GET
Path Route Predicate Factory
- 匹配请求路径
- 多个使用逗号
,
分隔 - 是一个Spring PathMatcher 模式列表
- URI模板变量(如 segment)
- 多个使用逗号
- Path=/red/{segment},/blue/{segment}
# 匹配 /red/1 or /red/blue or /blue/green
Query Route Predicate Factory
- 匹配请求参数
- 参数1: 参数名称
- 参数2(可选): 参数值表达式 (java 正则表达式)
# 匹配参数名
- Query=green
# 匹配参数及值
- Query=red, gree.
RemoteAddr Route Predicate Factory
- 匹配 远程Addr route获取源的列表(最小大小1)
- 源是CIDR表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)
- RemoteAddr=192.168.1.1/24
Weight Route Predicate Factory
- 匹配权重
- 参数1 : group
- 参数2 : weight (an int)
- 权重按组计算。
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2
# group1
# 这条路由将把80%的流量转发给weighthigh.org, 20%的流量转发给weighlow.org
内置过滤器
- 位于包:
org.springframework.cloud.gateway.filter.factory
AddRequestHeader GatewayFilter
AddRequestHeaderGatewayFilterFactory
- 添加请求头
- 可结合使用URI变量(uri变量作用于请求头参数中)
routes:
- id: add_request_header_route
uri: https://example.org
filters:
- AddRequestHeader=X-Request-red, blue
# 例2 segment
routes:
- id: add_request_header_route
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
- AddRequestHeader=X-Request-Red, Blue-{segment}
···
自定义Predicate
- 继承
org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory
@Component
public class DemoPredicate extends AbstractRoutePredicateFactory<DemoPredicate.Config> {
public DemoPredicate(Class<Config> configClass) {
super(configClass);
}
public static class Config{
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return null;
}
}
自定义Filter
- 实现
GatewayFilter
和Ordered
接口org.springframework.cloud.gateway.filter.GatewayFilter
org.springframework.core.Ordered
@Component
public class DemoFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return null;
}
@Override
public int getOrder() {
return 0;
}
}