Skip to content

Spring Cloud Gateway 网关

TIP

Spring Cloud Gateway 是一个基于 Spring WebFlux 的 API 网关,提供路由、过滤、鉴权、限流等功能。

核心概念

概念说明
Route(路由)网关的基本构建块,包含 ID、目标 URI、断言和过滤器
Predicate(断言)匹配 HTTP 请求的条件
Filter(过滤器)对请求和响应进行修改的拦截器

引入依赖

xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 注意:不要引入 spring-boot-starter-web,会冲突 -->

路由配置

yaml
spring:
  cloud:
    gateway:
      routes:
        # 用户服务路由
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=0
            - name: RequestRateLimiter
              args:
                key-resolver: "#{@userKeyResolver}"
                redis-rate-limiter.replenishRate: 100
                redis-rate-limiter.burstCapacity: 200

        # 订单服务路由
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
          filters:
            - StripPrefix=0

全局过滤器

java
@Component
@Order(-1)  // 优先级
public class AuthGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();

        // 白名单路径跳过鉴权
        if (path.contains("/auth/login") || path.contains("/auth/register")) {
            return chain.filter(exchange);
        }

        // 获取 Token
        String token = request.getHeaders().getFirst("Authorization");
        if (token == null || !token.startsWith("Bearer ")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        // 鉴通过,继续路由
        return chain.filter(exchange);
    }
}

自定义过滤器

java
@Component
public class LoggingGatewayFilterFactory
        extends AbstractGatewayFilterFactory<LoggingGatewayFilterFactory.Config> {

    public LoggingGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            long start = System.currentTimeMillis();
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                long duration = System.currentTimeMillis() - start;
                System.out.println("Request: " + exchange.getRequest().getURI()
                    + " took " + duration + "ms");
            }));
        };
    }

    @Data
    public static class Config {
        private boolean enableLog = true;
    }
}

限流

java
@Bean
public KeyResolver userKeyResolver() {
    return exchange -> Mono.just(
        exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()
    );
}

TIP

Gateway 基于 WebFlux 响应式编程,天然支持高并发。注意不要在过滤器中使用阻塞操作。