介绍Spring Cloud Gateway

文章目录

Spring Cloud Gateway 是 Spring Cloud 生态中的 新一代 API 网关 ,基于 Spring 5、Spring Boot 2.x 和 Project Reactor 开发,采用 非阻塞响应式编程模型 ,旨在为微服务架构提供统一的入口,实现路由转发、负载均衡、熔断降级、限流、认证授权等核心功能。它替代了已停止维护的 Spring Cloud Netflix Zuul,成为当前 Spring Cloud 网关的首选方案。

一、核心定位与价值

在微服务架构中,服务数量众多且分散,API 网关作为系统的"入口层",承担以下核心职责:

  1. 统一入口:所有外部请求(如前端、移动端)通过网关进入系统,避免直接访问内部服务;
  2. 路由转发:根据请求路径、参数等规则,将请求转发到对应的微服务;
  3. 横切关注点:集中处理非业务逻辑(如认证、限流、监控、日志),减少服务重复开发;
  4. 服务治理:结合负载均衡、熔断降级等机制,保障系统稳定性。

二、核心特性

  1. 非阻塞响应式:基于 Netty 和 Reactor 实现,支持高并发、低延迟,性能远超传统阻塞式网关(如 Zuul 1.x);
  2. 动态路由:路由规则可通过配置文件、数据库或配置中心(Nacos/Apollo)动态更新,无需重启网关;
  3. 强大的路由匹配:支持基于路径(Path)、请求头(Header)、参数(Query)、方法(Method)等多种条件的路由匹配;
  4. 集成 Spring 生态:无缝对接 Spring Cloud 服务发现(Eureka/Nacos)、负载均衡(Spring Cloud LoadBalancer)、熔断降级(Sentinel/Resilience4j)等组件;
  5. 内置过滤器链:提供丰富的内置过滤器(如路径重写、请求头修改、跨域处理),支持自定义过滤器扩展;
  6. 限流支持:可基于 IP、路径、用户等维度实现限流,防止流量过载;
  7. 监控与追踪:集成 Spring Boot Actuator 提供监控指标,支持 Sleuth/Zipkin 分布式追踪。

三、核心概念

理解 Gateway 的核心概念是掌握其工作原理的关键:

概念 含义说明
Route(路由) 网关的基本单元,由 ID (唯一标识)、目标 URI (转发地址)、Predicate(断言)Filter(过滤器) 组成。当请求满足断言条件时,会被转发到目标 URI。
Predicate(断言) 路由的匹配规则,基于 Spring Framework 的 Predicate 函数实现,用于判断请求是否符合路由条件(如路径匹配 /api/user/**、请求方法为 GET 等)。
Filter(过滤器) 对请求/响应进行拦截和处理的组件,分为 GatewayFilter(路由过滤器,仅对当前路由生效)GlobalFilter(全局过滤器,对所有路由生效)。可实现日志记录、权限校验、路径重写等功能。

四、工作原理

Gateway 的工作流程可概括为"请求拦截→断言匹配→过滤器处理→路由转发":

  1. 请求拦截:客户端请求进入 Gateway 后,首先被 Netty 服务器接收,交由 Gateway 的核心处理器处理;
  2. 断言匹配 :处理器根据配置的路由规则,依次通过 Predicate 对请求进行匹配(如路径是否为 /api/order/**、请求头是否包含 Token 等),找到第一个匹配的路由;
  3. 过滤器链执行:匹配到路由后,请求进入该路由的过滤器链(包括全局过滤器和路由过滤器),执行前置处理(如认证、日志记录);
  4. 路由转发:过滤器链前置处理完成后,Gateway 通过负载均衡器(如 Spring Cloud LoadBalancer)将请求转发到目标服务实例;
  5. 响应处理:目标服务返回响应后,请求再次经过过滤器链执行后置处理(如响应头修改、结果转换),最终返回给客户端。

五、简单使用示例

1. 引入依赖(Maven)
xml 复制代码
<!-- Spring Cloud Gateway 核心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- 服务发现(如 Nacos,用于动态获取服务实例) -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:Gateway 基于响应式编程,需排除 Spring MVC 依赖(避免冲突)。

2. 配置路由规则(application.yml)

通过配置文件定义路由,支持两种风格:快捷配置完整配置

示例 1:基本路由(转发到固定地址)
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service-route  # 路由唯一ID
          uri: http://localhost:8081  # 目标服务地址(固定地址)
          predicates:
            - Path=/api/user/**  # 断言:路径匹配 /api/user/** 时触发路由
          filters:
            - RewritePath=/api/user/(?<segment>.*), /user/$\{segment}  # 路径重写:/api/user/1 → /user/1
示例 2:结合服务发现(动态转发到服务名)
yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: order-service-route
          uri: lb://order-service  # 目标服务名(lb:// 表示启用负载均衡)
          predicates:
            - Path=/api/order/**  # 匹配路径
            - Method=GET  # 仅匹配 GET 请求
          filters:
            - StripPrefix=1  # 去除路径前缀:/api/order/1 → /order/1
  • lb://order-service 表示通过服务发现(如 Nacos)获取 order-service 的实例列表,并通过负载均衡选择实例转发。
3. 自定义过滤器(示例:简单认证)

实现 GlobalFilter 接口定义全局过滤器,对所有请求进行认证校验:

java 复制代码
@Component
public class AuthFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取请求头中的 Token
        String token = exchange.getRequest().getHeaders().getFirst("Token");
        
        // 简单校验:Token 不存在则返回 401
        if (token == null || token.isEmpty()) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        
        // 校验通过,继续执行过滤器链
        return chain.filter(exchange);
    }

    // 过滤器优先级:数值越小,优先级越高
    @Override
    public int getOrder() {
        return -100;
    }
}

六、高级功能示例

1. 限流(基于 IP)

使用内置的 RequestRateLimiter 过滤器,基于 Redis 实现令牌桶限流:

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: limit-route
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10  # 令牌桶填充速率(每秒10个)
                redis-rate-limiter.burstCapacity: 20  # 令牌桶最大容量(最多20个)
                key-resolver: "#{@ipKeyResolver}"  # 基于 IP 限流的解析器
  redis:
    host: localhost  # Redis 地址(限流依赖 Redis)

# 定义 IP 解析器
@Configuration
public class RateLimitConfig {
    @Bean
    public KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}
2. 集成 Sentinel 熔断降级

结合 Sentinel 实现路由级别的熔断降级,当目标服务异常时返回降级响应:

yaml 复制代码
# 引入 Sentinel 依赖后,配置熔断规则
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel 控制台
    gateway:
      routes:
        - id: sentinel-route
          uri: lb://pay-service
          predicates:
            - Path=/api/pay/**
          filters:
            - name: Sentinel  # 启用 Sentinel 过滤器
              args:
                blockHandler: com.example.gateway.handler.FallbackHandler  # 降级处理类

七、适用场景

  • 微服务统一入口:替代传统的 Nginx 作为业务网关,处理服务路由和横切逻辑;
  • API 版本管理 :通过路径匹配(如 /v1/user/**/v2/user/**)转发到不同版本的服务;
  • 前后端分离架构:处理跨域(CORS)、请求转发,避免前端直接访问后端服务;
  • 流量控制中心:集中实现限流、熔断、监控,保障系统在高并发下的稳定性。

总结

Spring Cloud Gateway 作为新一代 API 网关,凭借响应式编程的高性能、丰富的路由能力和 Spring 生态的无缝集成,成为微服务架构中流量管理的核心组件。它不仅能实现基本的路由转发,还能通过过滤器和第三方组件集成,满足认证授权、限流熔断、监控追踪等复杂需求,是构建高可用、可扩展微服务系统的关键一环。

相关推荐
戮戮3 小时前
一次深入排查:Spring Cloud Gateway TCP 连接复用导致 K8s 负载均衡失效
tcp/ip·spring cloud·kubernetes·gateway·负载均衡·netty
hunzhizi3 小时前
2024-2025年技术发展趋势深度分析:AI、前端与后端开发的革新之路
微服务·前端开发·后端开发·ai开发·技术趋势·多模态ai
阿里云云原生3 小时前
SOFA AI 网关基于 Higress 的落地实践
微服务
2301_797604245 小时前
d44:Sentinel 微服务流量控制与 Seata 分布式事务
分布式·微服务·sentinel
ysdysyn6 小时前
Java奇幻漂流:从Spring秘境到微服务星辰的冒险指南
java·spring·微服务
代码哈士奇8 小时前
简单使用Nest+Nacos+Kafka实现微服务
后端·微服务·nacos·kafka·nestjs
后端小张9 小时前
【JAVA 进阶】Mybatis-Plus 实战使用与最佳实践
java·spring boot·spring·spring cloud·tomcat·mybatis·mybatis plus
王嘉俊92519 小时前
HarmonyOS 微服务与 OpenHarmony 开发:构建模块化与开源生态应用
微服务·开源·harmonyos·arkts·开发·鸿蒙
青鱼入云20 小时前
介绍Spring Cloud Stream
spring cloud·微服务