探索微服务入口:Spring Cloud Gateway 实战指南

在微服务架构中,**网关(Gateway)**扮演着"请求入口"的角色。它不仅帮助我们统一入口、路由转发,还可以承担限流、安全认证、权限校验、熔断等功能。

本文将系统介绍 Spring Cloud Gateway 的基础概念、快速上手指南,以及在实战中常见的 JWT 登录校验与自定义过滤器开发。


📑 目录

  1. 认识网关 Gateway

  2. 快速入门:构建你的第一个 Gateway 项目

  3. 网关中的登录校验与鉴权逻辑

  4. JWT 登录校验实战

  5. 深入理解过滤器:GatewayFilter 与 GlobalFilter

  6. 更多实用特性(建议掌握)

  7. 总结与建议

  8. Spring Cloud Gateway 与其他网关组件对比


一、认识网关 Gateway

什么是网关?

网关是系统的统一入口,是客户端与后端微服务之间的中间层。主要功能包括:

  • 统一路由转发:将请求路由到具体微服务

  • 服务聚合:对多个微服务的响应进行整合

  • 权限校验:统一登录鉴权,保护后端服务

  • 请求过滤:如限流、日志记录、请求头统一处理等

为什么选择 Spring Cloud Gateway?

Spring Cloud Gateway 是 Spring 团队官方推出的网关组件,基于 WebFlux + Reactor 的响应式编程模型,具有以下优点:

  • 高性能、轻量级

  • 支持路由、过滤器、断言

  • 支持动态路由配置、服务注册发现(Eureka)

  • 支持自定义过滤器和全局过滤器


二、快速入门:构建你的第一个 Gateway 项目

1. 添加依赖

复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2. 配置 application.yml

复制代码
server:
  port: 8888

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/user/**
          filters:
            - AddRequestHeader=From, gateway

三、网关中的登录校验与鉴权逻辑

在实际业务中,网关会做以下判断流程:

复制代码
Client -> Gateway -> [是否为开放接口?]
                            ↓
                     [是否带token?]
                            ↓
                 [token是否合法/未过期?]
                            ↓
                      请求目标服务

四、JWT 登录校验实战

1. JWT 工具类

复制代码
public class JwtUtil {
    private static final String SECRET = "my-secret-key";
    private static final long EXPIRE_TIME = 3600000;

    public static String createToken(String userId) {
        return Jwts.builder()
                .setSubject(userId)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
    }

    public static Claims parseToken(String token) {
        return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody();
    }
}

2. 登录校验过滤器(GlobalFilter)

复制代码
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    private static final List<String> WHITE_LIST = List.of("/login", "/register");

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

        if (WHITE_LIST.stream().anyMatch(path::startsWith)) {
            return chain.filter(exchange);
        }

        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (StringUtils.isEmpty(token)) {
            return unauthorized(exchange, "Token 缺失");
        }

        try {
            Claims claims = JwtUtil.parseToken(token);
            exchange.getRequest().mutate().header("userId", claims.getSubject()).build();
        } catch (Exception e) {
            return unauthorized(exchange, "Token 非法或过期");
        }

        return chain.filter(exchange);
    }

    private Mono<Void> unauthorized(ServerWebExchange exchange, String msg) {
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(msg.getBytes(StandardCharsets.UTF_8));
        return exchange.getResponse().writeWith(Mono.just(buffer));
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

五、深入理解过滤器:GatewayFilter 与 GlobalFilter

类型 描述 适用范围
GatewayFilter 局部过滤器 某个具体路由
GlobalFilter 全局过滤器 所有路由

自定义 GatewayFilter 示例

复制代码
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config> {
    public CustomGatewayFilterFactory() {
        super(Config.class);
    }

    public static class Config {
        private String value;
        // getter/setter
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            exchange.getRequest().mutate().header("X-Custom-Header", config.getValue()).build();
            return chain.filter(exchange);
        };
    }
}

六、更多实用特性(建议掌握)

  • ✅ 动态路由加载(Nacos、数据库)

  • ✅ 熔断与降级(Resilience4j)

  • ✅ 限流功能(RedisRateLimiter)

  • ✅ CORS 跨域配置

  • ✅ 统一异常处理

  • ✅ 日志追踪(链路追踪 Zipkin)


七、总结与建议

Spring Cloud Gateway 是现代微服务架构中非常关键的一环,不仅用于请求路由,更是安全、稳定、高可用架构的第一道防线。

建议:

  • 提前规划路由结构

  • 使用 JWT 做轻量级认证

  • 用过滤器做灵活的扩展(如添加请求头、参数校验、限流等)

  • 对白名单、黑名单接口单独设计

  • 接入链路追踪和监控组件


八、Spring Cloud Gateway 与其他网关组件对比

|----------------------|----------------|-------|------|--------|--------------|
| 网关组件 | 技术架构 | 性能 | 动态路由 | 插件扩展性 | 适合场景 |
| Spring Cloud Gateway | Java + WebFlux | ⭐⭐⭐⭐ | ✅ | 高 | Spring 微服务体系 |
| Zuul 1.x | Java + Servlet | ⭐⭐ | ✅ | 中 | 老项目兼容 |
| Zuul 2.x | Netty | ⭐⭐⭐⭐ | ✅ | 中 | Netflix 内部使用 |
| Nginx | C语言 | ⭐⭐⭐⭐⭐ | ⛔ | 低(Lua) | 静态资源、边缘代理 |
| Kong | Nginx + Lua | ⭐⭐⭐⭐ | ✅ | 高 | API 网关平台 |
| Traefik | Go | ⭐⭐⭐⭐ | ✅ | 中 | 云原生、K8s 场景 |

✅ Spring Cloud Gateway 优势

  • Spring Cloud 深度集成

  • WebFlux 高性能

  • 支持自定义过滤器与动态路由

❌ 不足

  • JVM 性能劣于 Nginx

  • 插件生态弱于 Kong

  • 学习曲线相对偏高

场景选型建议

|------------|------------------------|
| 场景 | 推荐网关 |
| Java 微服务系统 | ✅ Spring Cloud Gateway |
| 高性能边缘代理 | ✅ Nginx |
| 企业级 API 管理 | ✅ Kong |
| 云原生微服务治理 | ✅ Traefik |
| 老项目兼容迁移 | ✅ Zuul(不推荐新项目) |


希望本文能帮助你全面理解 Spring Cloud Gateway 的能力和应用场景,如果你需要更多高级实践如自定义限流、动态路由注册、网关聚合文档等,欢迎留言获取进阶篇!

相关推荐
無限進步D1 小时前
Java 运行原理
java·开发语言·入门
難釋懷1 小时前
安装Canal
java
是苏浙1 小时前
JDK17新增特性
java·开发语言
不光头强2 小时前
spring cloud知识总结
后端·spring·spring cloud
GetcharZp5 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多5 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood5 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员5 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai