跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Spring Cloud Gateway 统一服务入口实战

微服务架构下直接暴露接口存在安全与维护成本问题,API 网关作为门面模式实现统一入口。Spring Cloud Gateway 基于 Reactor 模型替代 Zuul,性能更优。涵盖网关核心功能、路由断言、过滤器机制及自定义扩展,通过配置示例与代码演示,帮助开发者快速掌握网关集成与实战技巧。

SecGuard发布于 2026/3/30更新于 2026/4/253 浏览
Spring Cloud Gateway 统一服务入口实战

网关介绍

1.1 为什么需要网关

在微服务架构中,我们通常通过注册中心(如 Nacos、Eureka)解决服务发现问题,利用负载均衡器处理流量分发。然而,如果所有微服务的接口都直接对外暴露,会带来显著的安全隐患和维护成本。

原本单体应用中的权限校验逻辑被拆分到各个微服务中,导致重复开发。一旦安全策略调整,就需要修改多个服务,这大大增加了运维负担。为了解决这个问题,引入 API 网关是业界的标准做法。

类比理解

就像公司设立前台:外部人员办事需先在前台核实身份,通过后由各部门办理。若没有前台,每个部门都要单独核验身份,效率低且流程繁琐。网关就是这个'前台',统一处理鉴权与调度。

1.2 什么是 API 网关

API 网关是后端服务的唯一入口,其设计模式类似于门面模式(Facade)。它负责所有外部客户端请求的调度、过滤和转发。

网关架构图

核心功能包括:

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

1.3 常见网关方案

业界成熟的网关方案较多,如 Nginx、Kong、Zuul 等。这里重点对比两种主流方案:

Zuul Netflix 开源的组件,曾是 Spring Cloud 推荐的网关。但在 2018 年后,Netflix 宣布部分组件进入维护状态,不再更新新特性,Zuul 1.X 也随之停止演进。

Spring Cloud Gateway 基于 Spring Boot 和 WebFlux 技术栈全新构建,旨在替代 Zuul。官方测试显示,其 RPS(每秒请求数)性能约为 Zuul 的 1.6 倍。它提供了更简洁的路由配置和强大的横切关注点处理能力(如安全性、监控、弹性)。

Spring Cloud Gateway 实战

2.1 快速上手

2.1.1 创建项目

新建一个标准的 Spring Boot 项目,命名为 gateway。

2.1.2 引入依赖

我们需要网关核心依赖、服务发现依赖以及负载均衡依赖。

<!-- 网关核心 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos 服务发现 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 负载均衡 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.1.3 编写启动类

保持标准 Spring Boot 启动结构即可。

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

在 application.yml 中定义路由规则。注意 YAML 的缩进格式。

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 会被转发到 order-service。

2.2 Route Predicate Factories

2.2.1 Predicate 基础

Predicate 是 Java 8 提供的函数式接口,接收参数返回布尔值,用于条件判断。在网关中,它决定了请求是否匹配某条路由。

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

实际使用中,我们可以用 Lambda 表达式简化写法:

Predicate<String> predicate = s -> s.isEmpty();
2.2.2 路由断言工厂

Route Predicate Factory 将配置文件中的字符串规则转换为实际的判断逻辑。例如 Path=/product/** 是由 PathRoutePredicateFactory 实现的。

Spring Cloud Gateway 内置了丰富的断言工厂,支持 HTTP 请求的不同属性匹配,且可以通过 and 组合多个条件。

2.2.3 代码演示

在配置中添加时间断言,限制特定时间段内的访问:

spring:
  cloud:
    gateway:
      routes:
        - id: product-service
          uri: lb://product-service
          predicates:
            - Path=/product/**
            - After=2026-01-01T00:00:00.000+08:00[Asia/Shanghai]

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

2.3 Gateway Filter Factories

Predicate 决定请求去哪,Filter 则决定请求在到达目的地前后做什么处理。Filter 分为 Pre(前置)和 Post(后置)类型。

  • Pre 过滤器:在转发到后端服务前执行,常用于鉴权、限流。
  • Post 过滤器:在响应返回给客户端前执行,常用于日志记录、响应头修改。

过滤器执行流程

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

  • GatewayFilter:作用于单个或一组路由。
  • GlobalFilter:作用于所有路由,优先级更高。
2.3.1 GatewayFilter 使用

在路由配置中直接添加 filters 节点即可。

routes:
  - id: product-service
    uri: lb://product-service
    predicates:
      - Path=/product/**
    filters:
      - AddRequestParameter=userName, bite

此配置会在转发请求时自动添加 userName=bite 参数。后端服务接收时可直接获取该参数。

默认过滤器 若希望对所有路由生效,可使用 default-filters 配置全局默认过滤器列表。

2.3.2 GlobalFilter 使用

GlobalFilter 实现简单,只需实现 GlobalFilter 接口。Spring Cloud Gateway 内置了一些全局过滤器,如指标监控、负载均衡客户端等。

开启 Actuator 监控可验证内置过滤器效果:

management:
  endpoints:
    web:
      exposure:
        include: "*"

访问 /actuator 即可查看网关运行时的各项指标。

2.4 过滤器执行顺序

当项目中同时存在 GatewayFilter 和 GlobalFilter 时,它们会被合并到一个过滤器链中排序执行。

  • Order 值:数值越小,优先级越高。可通过实现 Ordered 接口或添加 @Order 注解指定。
  • 默认顺序:当 Order 值相同时,执行顺序通常为 DefaultFilter > GatewayFilter > GlobalFilter。

过滤器链

2.5 自定义过滤器

2.5.1 自定义 GatewayFilter

继承 AbstractGatewayFilterFactory 即可轻松扩展。需要定义配置类来接收 YML 中的参数。

@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 class CustomConfig {
    private String name;
}

YAML 配置示例:

filters:
  - name: Custom
    args:
      name: custom filter
2.5.2 自定义 GlobalFilter

实现 GlobalFilter 接口,无需额外配置,Spring 会自动扫描注册。

@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. 网关介绍
  2. 1.1 为什么需要网关
  3. 1.2 什么是 API 网关
  4. 1.3 常见网关方案
  5. Spring Cloud Gateway 实战
  6. 2.1 快速上手
  7. 2.1.1 创建项目
  8. 2.1.2 引入依赖
  9. 2.1.3 编写启动类
  10. 2.1.4 配置路由
  11. 2.2 Route Predicate Factories
  12. 2.2.1 Predicate 基础
  13. 2.2.2 路由断言工厂
  14. 2.2.3 代码演示
  15. 2.3 Gateway Filter Factories
  16. 2.3.1 GatewayFilter 使用
  17. 2.3.2 GlobalFilter 使用
  18. 2.4 过滤器执行顺序
  19. 2.5 自定义过滤器
  20. 2.5.1 自定义 GatewayFilter
  21. 2.5.2 自定义 GlobalFilter
  22. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • 华为 OD 机试双机位 C 卷 - 评委评分算法题
  • 基于视觉的增强现实特效技术解析与实战
  • JavaScript 能否同时胜任前端和后端开发?
  • 配置 OpenClaw 机器人通过钉钉调用 OpenMetadata
  • AI 调参技巧:网格搜索优化
  • Python 项目标准目录结构详解
  • ibbot(智体机灵):国产开源AI智能体平台的全面解析
  • React + Ant Design 登录界面 UI 美化实战
  • ClawdBot 个人 AI 助理完整安装与配置教程
  • Claude Code 跨平台安装与配置指南(Windows/Linux/macOS)
  • MCP Server 商店:AI 即插即用与工具自动化实战
  • AI 时代产品经理全流程落地管控方法:从需求到上线
  • 前端国际化实战:i18n 选型、架构设计与 RTL 布局避坑
  • OpenClaw Docker 部署指南:集成飞书钉钉 QQ 机器人
  • Linux 基础指令与权限管理
  • Whisper-large-v3 语音识别效果评估:100 条样本准确率与召回率分析
  • AutoGPT+Python:构建自主 AI 智能体自动化任务指南
  • 自然语言处理高级应用与前沿发展
  • 如何在 Cursor、Trae 等工具中使用 Skills
  • C++ 递归算法实战:汉诺塔问题

相关免费在线工具

  • 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