简介
SpringCloud gateWay 是为微服务架构提供一种简单有效的统一的API路由管理方式。
SpringCloud GateWay 作为 SpringCloud 生态系统中的网关,是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty.
SpringCloud GateWay 的目标提供统一的路由方式且基于 Filter 链的方式提供了网关基于的功能。例如:安全,监控/指标,限流。
官方地址**SpringCloud gateway官网地址
https://spring.io/projects/spring-cloud-gateway#overview**
特性
- 基于 Spring Framework 和 Spring Boot 进行构建。
- 兼容 Spring WebFlux 和 Spring Web MVC。
- 动态路由:能够匹配任何请求属性。
- 可以对路由指定 断言 和 过滤器。
- 集成 Hystrix 的断路器功能。
- 集成 Spring Cloud 服务发现功能。
- 易于编写的 断言 和 过滤器。
- 请求限流功能
- 支持路径重写。
在项目中可以使用gateWay做反向代理、鉴权、流量控制、熔断、日志监控等。
核心概念
1、 三大核心
Route(路由):路由是构建网关的基本模块,它由ID,目标URL,一系列的断言和过滤器组成,如果断言为 TRUE 则匹配该路由。
Predicate(断言):匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
Filter(过滤):使用过滤器,可以在请求被路由前或者之后对请求进行修改。
2、工作流程
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。 此处理程序通过特定于请求的筛选器链运行请求。 过滤器用虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。 执行所有的预过滤器逻辑,然后发出代理请求。发出代理请求后,将运行post过滤器逻辑。

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。
Handler 再通过指定的过滤器链来将请求发送到实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前("pre")或之后("post")执行业务逻辑。
Filter在"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,
在"post"类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
Predicate(断言)
After,Before, Between
java
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuit/** # 断言,路径相匹配的进行路由
- After=2026-01-19T11:00:00.685+08:00[Asia/Shanghai]
- Before=2026-01-19T19:00:00.685+08:00[Asia/Shanghai]
- Between=2026-01-19T11:00:00.685+08:00[Asia/Shanghai],2026-01-19T19:00:00.685+08:00[Asia/Shanghai]
After: 表示在配置的时间之前进行访问会出现错误
Before:表示在配置的时间之前可以进行访问页面
Between: 表示在配置的时间区间能够正常的进行访问
Cookie
指定Cookie里面携带某个值时可以访问服务
例如:Cookie里面必须要带用户名
java
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuit/** # 断言,路径相匹配的进行路由
- Cookie=username, lisi
1)Cookie携带多个值(或关系)
bash
--第一种
spring:
cloud:
gateway:
routes:
- id: cookie-multi-value-route
uri: http://localhost:8081
predicates:
- Cookie=userType, admin
- Cookie=userType, test
- Cookie=userType, guest
--第二种
spring:
cloud:
gateway:
routes:
- id: cookie-multi-value-route
uri: http://localhost:8081
predicates:
# 匹配Cookie键为userType,值为admin、test、guest中的任意一个
- Cookie=userType, ^(admin|test|guest)$
2)Cookie携带多个值(与关系)
bash
spring:
cloud:
gateway:
routes:
- id: multi-cookie-route
uri: http://localhost:8081
predicates:
# 必须同时满足:Cookie包含token=abc123 且 userId=1001
- Cookie=token, abc123
- Cookie=userId, 1001
Head
请求头携带某个值时可以访问服务
XML
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuit/** # 断言,路径相匹配的进行路由
- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
Host
限制某些地址才能访问,多个用逗号分隔,支持Ant风格
bash
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuit/** # 断言,路径相匹配的进行路由
- Host=**.hk.com,**.test.com
Method
限制某些请求方式才能访问
bash
--只允许get请求访问
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuit/** # 断言,路径相匹配的进行路由
- Method=GET
Path
路径匹配规则,也是使用最多的一种匹配方式
bash
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT #匹配后提供服务的路由地址
predicates:
- Path=/payment/circuit/** # 断言,路径相匹配的进行路由
过滤器
常见的过滤器
全局过滤器
自定义过滤器
自定义过滤器主要实现GlobalFilter, Ordered接口
java
@Component
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("进入自定义过滤器...");
String name = exchange.getRequest().getQueryParams().getFirst("name");
if (StringUtils.isEmpty(name)){
System.out.println("名称不能为空...");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
