Spring Cloud Gateway

Spring Cloud Gateway 简介

Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 网关,旨在提供简单、高效的方式路由到 API 并为其提供跨领域的关注点,如安全性、监控/指标和弹性。它使用非阻塞 API,支持 WebSocket,适合构建微服务架构中的边缘服务。


核心概念

路由(Route)
路由是网关的基本构建块,由 ID、目标 URI、断言集合和过滤器集合组成。如果断言为真,则匹配该路由。

断言(Predicate)
Java 8 的 Predicate,用于匹配 HTTP 请求中的任何内容(如请求头或参数)。

过滤器(Filter)
GatewayFilter 的实例,可以在请求或响应被处理前/后修改请求或响应。


主要特性

  • 动态路由:支持运行时动态路由配置。
  • 请求限流:集成 Resilience4j 或 Sentinel 实现限流。
  • 路径重写:支持路径重写规则。
  • 集成 Hystrix:提供熔断功能(Spring Cloud 2020.0 后默认移除,需手动配置)。
  • 支持 WebSocket:完整支持 WebSocket 通信。
  • 服务发现集成:与 Eureka、Consul、Nacos 等注册中心无缝集成。

基本配置示例

依赖配置

pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
路由配置

通过 YAML 或 Java 代码配置路由。以下是 YAML 示例:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1  # 移除路径前缀(如 /api)
动态路由

通过 RouteDefinitionLocatorRouteLocator 动态更新路由:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("test_route", r -> r.path("/test/**")
            .uri("http://example.com"))
        .build();
}

断言类型

  • Path 断言:匹配请求路径(如 /api/**)。
  • Method 断言:匹配 HTTP 方法(如 GETPOST)。
  • Header 断言:检查请求头(如 X-Request-Id)。
  • Query 断言:匹配查询参数(如 ?name=value)。
  • Cookie 断言:检查 Cookie 值。
  • Weight 断言:按权重分配流量。

示例配置:

predicates:
  - Path=/api/**
  - Method=GET
  - Header=X-Request-Id, \d+
  - Query=name, value

过滤器类型

全局过滤器(GlobalFilter)

作用于所有路由,如 LoadBalancerClientFilter(集成负载均衡)、NettyWriteResponseFilter(修改响应)。

局部过滤器(GatewayFilter)

仅作用于特定路由,例如:

  • AddRequestHeader:添加请求头。
  • AddRequestParameter:添加请求参数。
  • RewritePath:重写路径。
  • Retry:配置重试逻辑。

示例配置:

filters:
  - AddRequestHeader=X-Request-Color, Blue
  - RewritePath=/api/(?<segment>.*), /$\{segment}

高级功能

限流配置

集成 Redis 实现令牌桶限流:

spring:
  cloud:
    gateway:
      routes:
        - id: limit_route
          uri: http://example.com
          predicates:
            - Path=/limited/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10  # 每秒允许的请求数
                redis-rate-limiter.burstCapacity: 20   # 突发容量
熔断配置

结合 Resilience4j 实现熔断:

filters:
  - name: CircuitBreaker
    args:
      name: myCircuitBreaker
      fallbackUri: forward:/fallback
自定义过滤器

实现 GlobalFilter 接口:

@Component
public class LoggingFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("Request path: " + exchange.getRequest().getPath());
        return chain.filter(exchange);
    }
}

性能优化建议

  • 启用响应式 Netty 服务器:默认使用 Netty,无需额外配置。
  • 缓存路由定义:避免频繁解析路由规则。
  • 合理配置线程池:调整 reactor-netty 的线程数(如 spring.netty.workerThreads)。
  • 监控指标:通过 Actuator 暴露 /actuator/gateway 端点监控路由状态。

常见问题

与 Zuul 的区别
Spring Cloud Gateway 基于非阻塞模型,性能优于 Zuul 1.x;Zuul 2.x 也支持非阻塞,但生态不如 Gateway。

如何集成服务发现
通过 lb://service-id 格式的 URI 自动从注册中心(如 Eureka)获取服务实例。

跨域支持
配置 spring.cloud.gateway.globalcors 启用全局 CORS:

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedMethods: "*"

通过以上内容,可以快速掌握 Spring Cloud Gateway 的核心功能与配置方法。实际应用中需结合具体场景调整路由、过滤器和断言策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值