0%

GateWay简介

Spring Cloud Gateway:新一代微服务网关详解

Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代网关组件,旨在替代 Zuul,基于 Spring 5、Spring Boot 2 和 Project Reactor 构建,采用非阻塞响应式编程模型,具备高性能、动态路由、熔断限流等核心能力,是微服务架构中连接客户端与后端服务的理想入口。

Gateway 的核心优势

相比第一代网关 Zuul,Gateway 具有以下显著优势:

  • 响应式编程:基于 Netty 和 WebFlux,采用非阻塞 IO 模型,性能远超 Zuul 的同步阻塞模型,适合高并发场景;
  • 功能丰富:内置动态路由、断言(Predicate)、过滤器(Filter)、负载均衡、熔断、限流等功能;
  • 无缝集成:与 Spring Cloud 生态(如 Eureka、Consul、Hystrix、Sentinel)深度融合;
  • 可扩展性:支持自定义断言和过滤器,灵活满足业务需求。

Gateway 的核心概念

Gateway 的核心功能围绕路由(Route)断言(Predicate)过滤器(Filter) 三个组件展开,三者共同构成了网关的基本工作单元。

路由(Route)

路由是网关的基本转发规则,由以下部分组成:

  • ID:路由唯一标识(如 user-service-route);
  • URI:目标服务地址(如 lb://user-servicelb 表示启用负载均衡);
  • Predicate 集合:断言规则,匹配请求后才会触发路由;
  • Filter 集合:路由前后执行的过滤逻辑。

示例:当请求路径为 /user/** 时,转发到名为 user-service 的微服务。

断言(Predicate)

断言是路由的 “匹配条件”,基于 HTTP 请求的属性(如路径、方法、头信息、时间等)进行判断,返回 true 则匹配路由。

Gateway 内置多种断言工厂,常用的包括:

断言工厂 示例配置 功能说明
PathPredicateFactory - Path=/dept/** 匹配请求路径(支持通配符 ***
MethodPredicateFactory - Method=GET,POST 匹配 HTTP 方法(如 GET、POST)
HeaderPredicateFactory - Header=X-Request-Id, \d+ 匹配请求头(支持正则表达式)
QueryPredicateFactory - Query=id, \d+ 匹配请求参数(如 id 为数字)
AfterPredicateFactory - After=2024-01-01T00:00:00+08:00 匹配指定时间之后的请求

示例:仅允许 GET 方法且路径为 /dept/** 的请求通过:

1
2
3
predicates:
- Path=/dept/**
- Method=GET

过滤器(Filter)

过滤器用于在请求路由前后执行自定义逻辑(如修改请求 / 响应、日志记录、权限校验),分为全局过滤器(对所有路由生效)和路由过滤器(仅对特定路由生效)。

常用内置过滤器:

  • AddRequestHeaderFilter:添加请求头;
  • RewritePathFilter:重写请求路径;
  • HystrixGatewayFilter:集成 Hystrix 实现熔断;
  • RequestRateLimiterGatewayFilter:请求限流。

示例:路由前添加 X-Request-Source 头信息:

1
2
filters:
- AddRequestHeader=X-Request-Source, gateway

Gateway 快速集成

1. 引入依赖

在 Spring Boot 项目中添加 Gateway 依赖(需排除 Spring MVC 依赖,避免冲突):

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 服务发现依赖(与Eureka集成) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2. 启动类配置

通过 @EnableEurekaClient 注册到服务中心,无需额外注解启用 Gateway:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaClient // 注册到Eureka
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}

3. 核心配置

(1)静态路由配置

直接指定目标服务的固定地址(适用于非微服务场景):

1
2
3
4
5
6
7
8
9
10
spring:
cloud:
gateway:
routes:
- id: dept-service-static # 路由ID
uri: http://localhost:8001 # 目标服务地址
predicates:
- Path=/dept/** # 匹配路径
filters:
- RewritePath=/dept/(?<segment>.*), /$\{segment} # 路径重写(可选)
(2)动态路由配置(推荐)

结合服务发现(如 Eureka),通过服务名动态获取地址并启用负载均衡:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
application:
name: gateway-service # 网关服务名
cloud:
gateway:
routes:
- id: dept-service-dynamic # 路由ID
uri: lb://springcloud2-provider # lb://服务名(启用负载均衡)
predicates:
- Path=/dept/** # 匹配路径
discovery:
locator:
enabled: true # 开启服务名自动路由(可选,默认通过服务名访问)
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka # Eureka注册中心地址
instance:
prefer-ip-address: true # 显示IP地址

访问示例
请求 http://localhost:9527/dept/get/1 会被转发到 springcloud2-provider 服务的 /dept/get/1 接口,自动实现负载均衡。

高级功能配置

1. 路径重写

通过 RewritePath 过滤器修改请求路径,例如隐藏服务内部路径:

1
2
3
4
5
6
7
routes:
- id: user-service-route
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- RewritePath=/api/user/(?<segment>.*), /user/$\{segment} # 将/api/user/1 → /user/1

2. 集成 Hystrix 熔断

当后端服务故障时,返回降级响应:

1
2
3
4
5
6
7
8
9
10
routes:
- id: order-service-route
uri: lb://order-service
predicates:
- Path=/order/**
filters:
- name: Hystrix
args:
name: orderFallback # 熔断命令名
fallbackUri: forward:/fallback/order # 降级路径

降级接口实现

1
2
3
4
5
6
7
@RestController
public class FallbackController {
@GetMapping("/fallback/order")
public String orderFallback() {
return "订单服务暂时不可用,请稍后重试";
}
}

3. 请求限流

基于 RequestRateLimiter 过滤器限制请求频率(使用 Redis 实现分布式限流):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
cloud:
gateway:
routes:
- id: product-service-route
uri: lb://product-service
predicates:
- Path=/product/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 令牌桶填充速率(每秒10个)
redis-rate-limiter.burstCapacity: 20 # 令牌桶容量(最大突发20个)
redis:
host: localhost # Redis地址(用于存储限流计数器)

与 Zuul 的对比

特性 Spring Cloud Gateway Zuul 1.x
底层架构 基于 Netty + WebFlux(非阻塞响应式) 基于 Servlet(同步阻塞)
性能 高(支持每秒数万请求) 中(同步模型限制并发)
功能完整性 内置动态路由、熔断、限流等 需依赖第三方组件扩展
扩展性 支持自定义断言和过滤器 过滤器扩展复杂
生态集成 与 Spring Cloud 无缝集成 需适配 Spring Cloud 生态
长连接支持 支持 WebSocket 不支持(基于 Servlet 2.5)

结论:Gateway 是微服务架构的首选网关,尤其适合高并发场景;Zuul 1.x 已停止更新,仅推荐用于维护旧系统。

总结

Spring Cloud Gateway 作为新一代网关,凭借响应式架构、丰富功能和良好的生态集成,成为微服务架构的核心组件。其核心通过路由、断言和过滤器实现请求的转发与处理,支持动态路由、负载均衡、熔断限流等关键能力,能有效简化微服务的入口管理

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10