Spring Cloud Gateway:微服务架构下的 API 网关详解

前言

在微服务架构中,API 网关(API Gateway) 是一个关键的组件,它充当了微服务架构的"门面",负责路由、认证、限流、熔断、日志记录等通用功能。随着微服务数量的增加,传统的网关方案(如 Zuul、Nginx 等)逐渐暴露出性能、可扩展性、灵活性等方面的不足。

Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代 API 网关解决方案,基于 Project ReactorNetty 构建,具有非阻塞、响应式、高性能的特点,是目前构建微服务架构中最主流的网关实现之一。


一、Spring Cloud Gateway 简介

Spring Cloud Gateway 是 Spring Cloud Alibaba 的一部分,但它本身是 Spring Cloud 的原生组件。它使用了 WebFlux + Reactor 技术栈,基于 Netty 提供异步非阻塞的网络通信能力。

1.1 核心概念

Spring Cloud Gateway 有三个核心概念:

  • Route(路由):路由是网关的基本单元,由 ID、目标 URI、断言集合和过滤器集合组成。
  • Predicate(断言):用于匹配请求是否符合某个条件(如路径、方法、头信息等)。
  • Filter(过滤器):用于修改请求和响应,如添加头、修改请求体、限流、鉴权等。

二、Spring Cloud Gateway 的优势

与 Zuul 相比,Spring Cloud Gateway 有以下优势:

特性 Spring Cloud Gateway Zuul
性能 非阻塞,基于 WebFlux 和 Netty,性能更高 阻塞式 I/O,性能较低
支持协议 HTTP/HTTPS 仅支持 HTTP
可扩展性 更容易扩展自定义断言和过滤器 扩展性较差
集成 与 Spring Cloud 生态无缝集成(如 Nacos、Sentinel) 集成较为复杂
社区活跃度 活跃,持续更新 停止更新,转向 Gateway

三、快速入门

3.1 添加依赖

xml 复制代码
<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <!-- Eureka Client(可选) -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

3.2 配置文件(application.yml)

yaml 复制代码
server:
  port: 8080

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=1

上面的配置表示:

  • 所有访问 /api/user/** 的请求都会被转发到 user-service 微服务。
  • lb://user-service 表示使用负载均衡访问服务。
  • StripPrefix=1 表示去掉第一层路径 /api/user,只保留后面的部分。

四、核心组件详解

4.1 Route(路由)

路由是网关的核心配置单元,由以下几个部分组成:

  • id:路由的唯一标识
  • uri :目标服务的地址,支持 http://, lb://(负载均衡)等
  • predicates:一组断言,用于匹配请求
  • filters:一组过滤器,用于修改请求或响应

示例:

yaml 复制代码
routes:
  - id: order-service
    uri: http://localhost:8082
    predicates:
      - Method=POST
      - Path=/api/order/**
    filters:
      - AddRequestHeader=X-Request-Id, 123456

4.2 Predicate(断言)

断言用于判断请求是否符合某个条件。Spring Cloud Gateway 提供了多种内置的断言,常见的包括:

断言 说明
Path=/api/user/** 匹配指定路径
Method=GET 匹配指定 HTTP 方法
Header=X-Request-ID, \d+ 匹配 Header 值是否符合正则
Query=username, abc.* 匹配查询参数是否符合正则
After=2025-01-01T00:00:00+08:00[Asia/Shanghai] 匹配请求是否在指定时间之后
Between=2025-01-01T00:00:00+08:00[Asia/Shanghai], 2025-12-31T23:59:59+08:00[Asia/Shanghai] 匹配请求是否在某个时间段内

4.3 Filter(过滤器)

过滤器用于在请求前后对请求或响应进行处理。Spring Cloud Gateway 分为两种类型的过滤器:

  • GatewayFilter(局部过滤器):作用于特定路由
  • GlobalFilter(全局过滤器):作用于所有路由
常见过滤器示例
过滤器 说明
StripPrefix=1 去除路径前缀
AddRequestHeader=X-Request-ID, 123456 添加请求头
RewritePath=/api/(?<segment>.*), /$\{segment} 重写路径
Hystrix=commandName=fallback, fallbackUri=forward:/fallback 熔断处理
RateLimiter=redis-rate-limiter.replenishRate=10, redis-rate-limiter.burstCapacity=20 限流

五、自定义断言和过滤器

5.1 自定义断言工厂

java 复制代码
@Component
public class MyHeaderRoutePredicateFactory extends AbstractRoutePredicateFactory<MyHeaderRoutePredicateFactory.Config> {

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

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            String header = exchange.getRequest().getHeaders().getFirst("X-Custom-Header");
            return config.value.equals(header);
        };
    }

    public static class Config {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

使用方式:

yaml 复制代码
predicates:
  - MyHeader=X-Custom-Value

5.2 自定义过滤器工厂

java 复制代码
@Component
public class MyRequestTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<MyRequestTimeGatewayFilterFactory.Config> {

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

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            long start = System.currentTimeMillis();
            return chain.filter(exchange).then(
                Mono.fromRunnable(() -> {
                    long end = System.currentTimeMillis();
                    System.out.println("请求耗时:" + (end - start) + " ms");
                })
            );
        };
    }

    public static class Config {
        // 可以添加配置项
    }
}

使用方式:

yaml 复制代码
filters:
  - MyRequestTime

六、集成服务注册与发现(如 Nacos、Eureka)

Spring Cloud Gateway 可以自动从服务注册中心获取服务实例,并进行负载均衡调用。

示例(Eureka)

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**

其中 lb://user-service 表示使用负载均衡访问服务。


七、集成熔断机制(Hystrix)

Spring Cloud Gateway 支持集成 Hystrix 进行熔断处理。

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - name: Hystrix
              args:
                name: fallback
                fallbackUri: forward:/fallback

创建一个 fallback 接口:

java 复制代码
@RestController
public class FallbackController {
    @GetMapping("/fallback")
    public String fallback() {
        return "服务不可用,请稍后再试!";
    }
}

八、限流(RateLimiter)

Spring Cloud Gateway 支持基于 Redis 的限流策略。

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - name: RequestRateLimiter
              args:
                rate-limiter: redis-rate-limiter
                key-resolver: #{@userKeyResolver}

自定义 Key 解析器:

java 复制代码
@Bean
public KeyResolver userKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

九、日志与监控

Spring Cloud Gateway 支持与 Sleuth、Zipkin 集成,进行链路追踪;也可以使用 Prometheus + Grafana 进行性能监控。


十、总结

Spring Cloud Gateway 是当前构建微服务架构中最推荐的 API 网关实现,它基于响应式编程模型,具备高性能、低延迟、可扩展性强等优点。通过 Route、Predicate、Filter 三大核心组件,可以灵活实现路由、鉴权、限流、熔断等常见功能。


十一、参考资料

相关推荐
victory043131 分钟前
krea 智能体自动部署k8s 情况 和k8s入门路径 minikube
云原生·容器·kubernetes
j2001032234 分钟前
K8S 概念与安装
云原生·容器·kubernetes
退役小学生呀35 分钟前
二十三、K8s企业级架构设计及落地
linux·云原生·容器·kubernetes·k8s
CloudWeGo1 小时前
Eino ADK:一文搞定 AI Agent 核心设计模式,从 0 到 1 搭建智能体系统
架构
listhi5201 小时前
Docker中授权普通用户使用docker命令以及解决无权限访问/var/run/docker.sock错误
spring cloud·云原生·eureka
leagsoft_10032 小时前
上新!联软科技发布新一代LeagView平台,用微服务重塑终端安全
科技·安全·微服务
不会吃萝卜的兔子2 小时前
spring微服务宏观概念
java·spring·微服务
寒士obj2 小时前
分布式组件【ZooKeeper】
微服务·zookeeper
笨蛋少年派2 小时前
zookeeper简介
分布式·zookeeper·云原生