跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Cloud Gateway 微服务统一入口实战

Spring Cloud Gateway 作为微服务架构的统一入口,负责路由转发、权限校验及限流等核心功能。本文通过对比 Zuul 与 Spring Cloud Gateway 的差异,演示了基于 Nacos 的服务发现配置、Route Predicate 断言规则以及 GatewayFilter 过滤器的自定义实现。重点解析了过滤器执行顺序与全局拦截机制,为构建高可用网关提供实战参考。

不羁发布于 2026/3/24更新于 2026/10/2289 浏览
Spring Cloud Gateway 微服务统一入口实战

Spring Cloud Gateway 微服务统一入口实战

为什么需要网关?

在之前的架构演进中,我们利用 Eureka 或 Nacos 解决了服务注册与发现的问题,通过 Spring Cloud LoadBalancer 实现了负载均衡,并借助 OpenFeign 处理远程调用。但随之而来的问题是:所有微服务的接口直接对外暴露,外部客户端可以直接访问任意服务。

为了保证安全性,服务端通常需要在每个微服务内部实现权限校验逻辑。然而,微服务拆分后,原本单体应用中的多个模块变成了独立的应用,导致我们需要在多个应用中重复编写相同的鉴权代码。一旦校验规则变更,就需要修改多个服务,维护成本极高。

针对这一痛点,API 网关成为了标准解决方案。

类比理解: 就像公司设立前台接待处。早期只有一个人时,核实身份后直接办理业务(单体架构)。随着部门增多,每个部门都要先核实身份再办事(微服务架构),效率低下且流程冗余。改进方案是设立统一的前台,由前台完成身份校验,后续部门只需信任前台即可直接办理。

网关架构示意图

API 网关的核心职责

API 网关作为后端服务的唯一入口,其设计模式类似于外观模式(Facade)。所有外部请求都需经过它进行调度和过滤。

核心功能包括:

  • 权限控制:作为统一入口,对用户进行身份验证,拦截非法请求。
  • 动态路由:不处理具体业务,根据规则将请求转发到对应的微服务。
  • 负载均衡:当目标服务有多个实例时,自动分配流量。
  • 限流熔断:控制进入微服务的流量,防止服务因压力过大而崩溃。

主流网关方案对比

业界成熟的网关方案不少,如 Nginx、Kong、Zuul 和 Spring Cloud Gateway。

Zuul

Zuul 是 Netflix 开源的组件,曾是 Spring Cloud Netflix 的核心。但在 2018 年,Netflix 宣布部分组件进入维护状态,不再开发新功能,Zuul 也在其中。

Spring Cloud Gateway

这是 Spring Cloud 全新推出的网关项目,基于 Spring Boot 和 WebFlux 构建,旨在替代 Zuul。它提供了更简单有效的请求转发途径,并支持安全性、监控等横切关注点。

性能方面,官方测试显示 Spring Cloud Gateway 的 RPS(每秒请求数)是 Zuul 的 1.6 倍。

快速搭建网关服务

创建项目与依赖

新建一个 Spring Boot 项目,引入以下核心依赖:

<!-- 网关核心依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery



    org.springframework.cloud
    spring-cloud-starter-loadbalancer

<!-- 基于 Nacos 的服务发现 -->
<dependency>
<groupId>
</groupId>
<artifactId>
</artifactId>
</dependency>
<!-- 负载均衡 -->
<dependency>
<groupId>
</groupId>
<artifactId>
</artifactId>
</dependency>

启动类非常简单,无需额外配置:

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

路由配置

在 application.yml 中配置路由规则。这里以对接 Nacos 为例:

server:
  port: 10030

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 110.41.51.65:10020
    gateway:
      routes:
        - id: product-service
          uri: lb://product-service
          predicates:
            - Path=/product/**
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**

配置说明:

  • id:路由唯一标识。
  • uri:目标服务地址。使用 lb:// 前缀表示从注册中心获取服务列表并进行负载均衡。
  • predicates:路由断言,匹配符合规则的请求才会被转发。

访问网关地址 http://127.0.0.1:10030/order/1 即可触发路由转发。

Route Predicate Factories(路由断言工厂)

Predicate 是 Java 8 提供的函数式接口,用于条件过滤。在 Spring Cloud Gateway 中,Route Predicate Factory 负责解析配置文件中的字符串规则,将其转换为具体的判断逻辑。

例如配置 Path=/product/**,实际是由 PathRoutePredicateFactory 实现 URL 前缀匹配。Gateway 默认提供了丰富的断言工厂,支持 HTTP 请求的不同属性匹配,且可以通过 and 逻辑组合。

更多内置断言可参考 Spring Cloud Gateway 文档。

断言示例

在配置中添加时间限制:

predicates:
  - Path=/product/**
  - After=2026-01-01T00:00:00.000+08:00[Asia/Shanghai]

这样配置后,只有在指定时间之后的请求才能通过该路由。

Gateway Filter Factories(过滤器工厂)

Predicate 决定请求由哪个路由处理,而 Filter 则负责在请求处理前后执行特定逻辑。Filter 分为 Pre(前置)和 Post(后置)类型。

  • Pre 类型:路由转发之前执行,常用于鉴权、限流。
  • Post 类型:响应返回给客户端之前执行,常用于日志记录、响应修改。

过滤器执行流程

根据作用范围,Filter 分为两类:

  1. GatewayFilter:仅对单个或分组路由生效。
  2. GlobalFilter:对所有路由生效,适用于全局性需求(如安全、监控)。

GatewayFilter 使用

GatewayFilter 通常在配置文件中针对特定路由声明。例如为 product-service 添加请求参数:

filters:
  - AddRequestParameter=userName,bite

这会在转发给 product-service 的请求头中增加 userName=bite 参数。接收端控制器即可获取该值:

@RequestMapping("/{productId}")
public ProductInfo getProductById(@PathVariable Integer productId, String userName) {
    System.out.println("收到请求,Id:" + productId);
    System.out.println("userName:" + userName);
    return productService.selectProductById(productId);
}

若希望对所有路由生效,可使用 default-filters 配置:

default-filters:
  - AddResponseHeader=X-Response-Default-Red,Default-Blue
  - PrefixPath=/httpbin

GlobalFilter 使用

GlobalFilter 作用于所有请求。Spring Cloud Gateway 内置了多个全局过滤器,如 LoadBalancerClientFilter(负载均衡)、GatewayMetricsFilter(指标监控)等。

启用监控通常需要添加 Actuator 依赖并配置暴露端点:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
  endpoints:
    web:
      exposure:
        include: "*"

访问 http://127.0.0.1:10030/actuator 即可查看网关运行指标。

过滤器执行顺序

当项目中同时存在 GatewayFilter 和 GlobalFilter 时,它们会被合并到一个过滤器链中排序执行。每个过滤器必须指定 order 值(整数),值越小优先级越高。

  • 自定义过滤器可通过实现 Ordered 接口或添加 @Order 注解指定顺序。
  • 当 order 值相同时,执行顺序通常为:defaultFilter > GatewayFilter > GlobalFilter。

过滤器链排序

自定义过滤器

Spring Cloud Gateway 允许开发者扩展过滤器功能,支持自定义 GatewayFilter 和 GlobalFilter。

自定义 GatewayFilter

实现 AbstractGatewayFilterFactory 抽象类较为便捷。注意类名后缀应为 GatewayFilterFactory,以便系统识别。

@Slf4j
@Service
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {

    public CustomGatewayFilterFactory() {
        super(CustomConfig.class);
    }

    @Override
    public GatewayFilter apply(CustomConfig config) {
        return ((exchange, chain) -> {
            log.info("[Pre] Filter Request, name: {}", config.getName());
            // 执行后续过滤器链
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("[Post] Response Filter");
            }));
        });
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }

    @Data
    public static class CustomConfig {
        private String name;
    }
}

在配置文件中引用:

filters:
  - name: Custom
    args:
      name: custom_filter

自定义 GlobalFilter

GlobalFilter 实现相对简单,只需实现 GlobalFilter 接口,无需额外配置,会自动应用到所有路由。

@Slf4j
@Service
public class CustomGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("[Pre] CustomGlobalFilter enter...");
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            log.info("[Post] CustomGlobalFilter return...");
        }));
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

总结

Spring Cloud Gateway 凭借其高性能和非阻塞特性,已成为微服务架构中统一入口的首选方案。通过合理配置路由断言与过滤器,我们可以灵活地实现鉴权、限流、日志追踪等横切逻辑,有效降低微服务间的耦合度。在实际开发中,建议优先使用内置过滤器满足通用需求,仅在特殊场景下自定义过滤器,并注意控制过滤器的执行顺序以避免逻辑冲突。

目录

  1. Spring Cloud Gateway 微服务统一入口实战
  2. 为什么需要网关?
  3. API 网关的核心职责
  4. 主流网关方案对比
  5. Zuul
  6. Spring Cloud Gateway
  7. 快速搭建网关服务
  8. 创建项目与依赖
  9. 路由配置
  10. Route Predicate Factories(路由断言工厂)
  11. 断言示例
  12. Gateway Filter Factories(过滤器工厂)
  13. GatewayFilter 使用
  14. GlobalFilter 使用
  15. 过滤器执行顺序
  16. 自定义过滤器
  17. 自定义 GatewayFilter
  18. 自定义 GlobalFilter
  19. 总结

更多推荐文章

查看全部
  • 微信小程序接入 AI 服务实战:基于 Bmob SDK 实现智能对话
  • 哈希算法基础:原理、函数与哈希表实现
  • AI 写作工具深度测评:主流模型与垂直软件对比
  • 本地部署 Llama3 大模型与 Open WebUI 界面教程
  • Neo4j 5.26 安装、配置与启动指南
  • Selenium 动态数据抓取与 JS 逆向解密实战
  • 数据分析全流程实战:Python与MySQL数据处理及可视化对比
  • C++ 继承机制:同名成员隐藏规则与派生类默认函数
  • 基于 Trae 与 Vizro 的低代码数据可视化仪表板构建方案
  • Linux 下 libwebkit2gtk-4.1-0 安装与依赖解析
  • 基于 AI 辅助的在线图书借阅平台设计与实现
  • 大模型常用架构及优缺点分析
  • LLaMA-2 与 Mixtral 提示词调优实战指南
  • Linux 进程控制:创建、退出、等待与替换
  • 纯 Verilog FPGA 双线性插值视频缩放设计与实现
  • Presentation AI:开源 AI 演示文稿生成工具
  • 2025 腾讯广告算法大赛 Baseline 项目源码解析
  • 老板电器发布全球首个 AI 烹饪大模型「食神」
  • Python 与前端集成:构建全栈应用
  • DCU BW1000 环境下 llama.cpp 推理 Qwen3-Coder 模型问题排查

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online