介绍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 生态的无缝集成,成为微服务架构中流量管理的核心组件。它不仅能实现基本的路由转发,还能通过过滤器和第三方组件集成,满足认证授权、限流熔断、监控追踪等复杂需求,是构建高可用、可扩展微服务系统的关键一环。

相关推荐
蝎子莱莱爱打怪21 小时前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking2 天前
Java微服务练习方式
java·后端·微服务
米丘5 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质8 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
慧一居士8 天前
Feign的GET请求如何传递对象参数?
java·spring cloud
我登哥MVP8 天前
SpringCloud Alibaba 核心组件解析:服务链路追踪
java·spring boot·后端·spring·spring cloud·java-ee·maven
慧一居士8 天前
SpringCloud 微服务Feigin 用的完整调用端和被调用的示例
java·spring cloud
霸道流氓气质8 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯8 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y8 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频