跳转到内容

Spring Cloud网关

来自代码酷

Spring Cloud网关(Spring Cloud Gateway)是Spring Cloud生态系统中的一个核心组件,用于构建基于Spring Boot的API网关服务。它提供了一种高效、灵活的方式来路由请求、执行过滤操作(如认证、限流、日志记录等),并支持与微服务架构的无缝集成。

概述[编辑 | 编辑源代码]

Spring Cloud网关作为反向代理服务器,其主要功能包括:

  • 动态路由:根据规则将请求转发到不同的微服务实例。
  • 请求过滤:通过预定义的过滤器链对请求和响应进行处理。
  • 负载均衡:集成Spring Cloud LoadBalancer实现服务实例的负载均衡。
  • 断路器支持:与Resilience4jHystrix集成实现熔断机制。

网关的核心优势在于其非阻塞式Reactor编程模型(基于Project ReactorSpring WebFlux),适合高并发场景。

核心概念[编辑 | 编辑源代码]

路由(Route)[编辑 | 编辑源代码]

路由是网关的基本构建块,包含以下属性:

  • ID:唯一标识符。
  • 目标URI:请求转发的目标地址。
  • 断言(Predicate):匹配请求的条件(如路径、Header、方法等)。
  • 过滤器(Filter):处理请求和响应的逻辑。

示例路由配置(YAML格式):

  
spring:  
  cloud:  
    gateway:  
      routes:  
        - id: user-service  
          uri: lb://user-service  # 负载均衡目标服务  
          predicates:  
            - Path=/api/users/**  
          filters:  
            - StripPrefix=1       # 移除路径前缀/api

断言(Predicate)[编辑 | 编辑源代码]

断言用于定义请求的匹配规则。常用内置断言包括:

  • `Path`:匹配URL路径(支持Ant风格和正则表达式)。
  • `Method`:匹配HTTP方法(如GET、POST)。
  • `Header`:检查请求头是否符合条件。

过滤器(Filter)[编辑 | 编辑源代码]

过滤器分为两类:

  • 全局过滤器(Global Filter):作用于所有路由。
  • 路由过滤器(Route Filter):仅作用于特定路由。

示例:添加请求头的自定义过滤器(Java代码):

  
@Bean  
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {  
    return builder.routes()  
        .route("test_route", r -> r.path("/test/**")  
            .filters(f -> f.addRequestHeader("X-Custom-Header", "gateway"))  
            .uri("http://localhost:8081"))  
        .build();  
}

实际案例[编辑 | 编辑源代码]

场景:统一认证与授权[编辑 | 编辑源代码]

通过网关集中处理JWT验证,避免在每个微服务中重复实现: 1. 客户端发送请求至网关,携带`Authorization`头。 2. 网关使用全局过滤器验证JWT有效性。 3. 验证通过后,转发请求至目标服务。

代码示例(JWT验证过滤器):

  
public class JwtAuthenticationFilter implements GlobalFilter {  
    @Override  
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {  
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");  
        if (token != null && validateToken(token)) {  
            return chain.filter(exchange);  
        }  
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);  
        return exchange.getResponse().setComplete();  
    }  
}

场景:请求限流[编辑 | 编辑源代码]

使用RedisRateLimiter实现接口限流:

  
spring:  
  cloud:  
    gateway:  
      routes:  
        - id: rate-limited-route  
          uri: http://backend-service  
          predicates:  
            - Path=/api/public/**  
          filters:  
            - name: RequestRateLimiter  
              args:  
                redis-rate-limiter.replenishRate: 10  # 每秒10个请求  
                redis-rate-limiter.burstCapacity: 20   # 峰值容量20

架构图[编辑 | 编辑源代码]

graph LR Client -->|HTTP Request| Gateway Gateway -->|Route Matching| Predicate Gateway -->|Apply Filters| Filter Gateway -->|Load Balanced| Service1[User Service] Gateway --> Service2[Order Service]

数学公式(限流算法)[编辑 | 编辑源代码]

令牌桶算法的速率计算公式: 允许的请求数=min(桶容量,当前令牌数+补充速率×时间间隔)

总结[编辑 | 编辑源代码]

Spring Cloud网关是微服务架构中的关键组件,通过动态路由、过滤器和集成Spring Cloud生态功能,简化了API管理和安全控制。初学者可从基础路由配置入手,逐步掌握高级功能如自定义过滤器和限流策略。