Spring Cloud Gateway 简介

🌐 Spring Cloud Gateway 简介

一、概述

Spring Cloud Gateway 是 Spring 官方推出的第二代 API 网关组件(第一代是 Zuul),用于替代 Netflix Zuul。它基于 Project ReactorWebFlux 构建,采用非阻塞 IO 模型,性能更高,适用于现代微服务架构中的统一入口管理。

✅ Spring Boot 2.0+ + Spring WebFlux + Project Reactor = 非阻塞式响应式编程模型


二、核心功能

功能描述
路由(Routing)根据请求路径、方法等条件将请求转发到对应的服务实例
断言(Predicates)判断请求是否符合路由规则(如 Path、Method、Header、Query 等)
过滤器(Filters)对请求和响应进行处理(如鉴权、限流、日志记录等)
服务发现集成支持与 Eureka、Consul、Nacos 等注册中心结合,实现动态路由
熔断降级可集成 Hystrix 或 Resilience4j 实现熔断机制
限流控制可通过 Redis + RequestRateLimiter 实现分布式限流

三、核心概念

1. Route(路由)

  • 包含:
    • ID
    • 目标 URI
    • 一组断言(Predicates)
    • 一组过滤器(Filters)
routes:
  - id: user-service
    uri: lb://user-service
    predicates:
      - Path=/api/user/**
    filters:
      - StripPrefix=1

2. Predicate(断言)

  • 决定请求是否匹配某个 Route。
  • 常见类型:
类型示例说明
PathPath=/api/user/**匹配路径
MethodMethod=GET匹配 HTTP 方法
HeaderHeader=X-Request-Id, \d+匹配 Header 值
QueryQuery=name, abc匹配查询参数
HostHost=**.example.org匹配域名
CookieCookie=username, abc匹配 Cookie 值

3. Filter(过滤器)

  • 分为 GatewayFilter(作用于单个路由)和 GlobalFilter(全局生效)
常用内置 Filter:
名称功能
StripPrefix去除前缀,例如 /api/user/xxx/xxx
AddRequestHeader添加请求头
RewritePath重写路径
SetStatus设置返回状态码
RateLimiter限流控制(需配合 Redis)
CircuitBreaker熔断机制(支持 Hystrix / Resilience4j)

四、流程图

Client → [Spring Cloud Gateway] → [Load Balancer (Ribbon)] → [Microservice]
           ↑
           ↓
     [Service Discovery (Eureka/Nacos)]
     [Config Server (可选)]
     [Redis for Rate Limiting]
     [Monitoring & Tracing (Sleuth/Zipkin)]

五、配置方式

1. YAML 配置(推荐)

spring:
  cloud:
    gateway:
      routes:
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
          filters:
            - StripPrefix=1
            - AddRequestHeader=X-Token, abc123

2. Java Config 方式(代码中定义路由)

@Bean
public RouteLocator customRoutes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("product-service", r -> r.path("/api/product/**")
            .filters(f -> f.stripPrefix(1))
            .uri("lb://product-service"))
        .build();
}

六、集成其他组件

1. 服务发现(Eureka / Nacos)

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  # 自动创建路由
          lower-case-service-id: true

自动路由规则:/service-id/**lb://service-id/**

2. 限流(Redis + RequestRateLimiter)

spring:
  cloud:
    gateway:
      routes:
        - id: rate-limit-route
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                key-resolver: "#{@userKeyResolver}"

需要自定义 KeyResolver 来决定按谁限流(如 IP、用户ID)

3. 熔断(Hystrix / Resilience4j)

filters:
  - name: CircuitBreaker
    args:
      name: myCircuitBreaker
      fallbackUri: forward:/fallback

配合 @EnableCircuitBreaker 使用。


七、Spring Cloud Gateway vs Zuul

特性Spring Cloud GatewayNetflix Zuul
基于框架WebFlux + ReactorServlet 2.5(阻塞式)
性能更高(非阻塞)较低
开发模式函数式路由注解式拦截器
易用性配置简洁,功能强大复杂且不维护
社区支持Spring 官方持续更新已停止更新
扩展性支持自定义 Predicate / Filter可扩展但复杂

八、常见使用场景

场景描述
统一入口所有外部请求都经过网关,屏蔽内部服务细节
路由分发根据 URL 路径或 Header 将请求分发到不同服务
认证鉴权在网关层做 Token 验证、权限校验
日志记录统一记录请求日志、耗时等信息
限流降级控制请求频率,防止系统雪崩
A/B 测试通过路由规则实现灰度发布
跨域处理统一设置 CORS 策略

九、优缺点

✅ 优点

  • 基于非阻塞 I/O,性能优越
  • 提供丰富的内置断言和过滤器
  • 支持服务发现、限流、熔断等高级功能
  • 配置简单,易于与 Spring 生态集成
  • 社区活跃,文档丰富

❌ 缺点

  • 学习成本较高,尤其对响应式编程不熟悉的开发者
  • 对于复杂的业务逻辑,Filter 和 Predicate 的编写可能较复杂
  • 不适合传统同步阻塞的业务场景
  • 限流等功能依赖 Redis 等中间件,部署复杂度上升

十、建议

  1. 合理设计路由规则
    • 路由不宜过多,避免复杂度过高
  2. 网关只负责基础治理
    • 业务逻辑尽量下沉到各微服务,保持网关轻量
  3. 启用健康检查和监控
    • 结合 Actuator、Prometheus、Zipkin 等工具
  4. 灰度发布策略
    • 利用权重、Header 匹配实现灰度路由
  5. 安全防护
    • 防止 SQL 注入、XSS、CSRF 等攻击
  6. 限流策略合理
    • 针对客户端 IP、用户 ID 等维度设置合理的 QPS 上限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值