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/** 的请求通过:

predicates:
  - Path=/dept/**
  - Method=GET

过滤器(Filter)

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

常用内置过滤器:

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

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

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

Gateway 快速集成

1. 引入依赖

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

<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:

@SpringBootApplication
@EnableEurekaClient  // 注册到Eureka
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

3. 核心配置

(1)静态路由配置

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

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

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

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 过滤器修改请求路径,例如隐藏服务内部路径:

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 熔断

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

routes:
  - id: order-service-route
    uri: lb://order-service
    predicates:
      - Path=/order/**
    filters:
      - name: Hystrix
        args:
          name: orderFallback  # 熔断命令名
          fallbackUri: forward:/fallback/order  # 降级路径

降级接口实现

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

3. 请求限流

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

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