跳到主要内容Spring Cloud Gateway 统一服务入口实战指南 | 极客日志Javajava
Spring Cloud Gateway 统一服务入口实战指南
深入解析了 Spring Cloud Gateway 作为微服务统一入口的核心机制。内容涵盖网关解决的问题、API 网关的定义与核心功能、Zuul 与 Gateway 的对比。重点讲解了快速上手步骤,包括依赖引入、路由配置及断言工厂的使用。详细阐述了 GatewayFilter 与 GlobalFilter 的区别、执行顺序及自定义方法,并通过代码示例展示了如何在实际项目中实现鉴权、限流等逻辑。文章旨在帮助开发者掌握 Gateway 的配置技巧与扩展能力,构建高可用的微服务架构。
松间照月2 浏览 Spring Cloud Gateway 统一服务入口实战指南
网关介绍
在微服务架构中,我们通常通过 Eureka、Nacos 解决服务注册与发现问题,用 Spring Cloud LoadBalancer 处理负载均衡,借助 OpenFeign 实现远程调用。但随之而来的问题是:所有微服务的接口直接对外暴露,外部可直接访问。为了保证安全性,服务端接口通常需要权限校验。由于微服务拆分,原本一个应用的多个模块变成了多个独立应用,我们不得不在每个应用中重复实现校验逻辑。一旦需要修改策略,就得逐个修改多个应用,开发负担显著加重。
针对这一痛点,API 网关是业界通用的解决方案。
类比理解
就像企业办事,最初只有一个员工负责核实身份并办理业务(单体架构)。随着部门增多,每个部门都要先核实身份再办理(微服务架构),效率低且流程冗余。改进方案是设立前台,统一由前台进行身份校验,通过后其他部门直接信任办理。
什么是 API 网关
API 网关(简称网关)是后端服务的唯一入口,类似设计模式中的门面模式(Facade)。它作为整个微服务架构的门面,所有外部客户端的访问都需经过它进行调度和过滤。

核心功能:
- 权限控制:作为入口对用户进行鉴权,失败则拦截。
- 动态路由:请求不处理业务,而是根据规则转发到对应微服务。
- 负载均衡:当目标服务有多个实例时,自动分发流量。
- 限流:流量过高时按配置放行,避免后端压力过大。
常见网关实现
业界成熟的网关方案很多,如 Nginx、Kong、Zuul、Spring Cloud Gateway 等。
- Zuul:Netflix 开源组件,曾是 Spring Cloud Netflix 的核心。但在 2018 年 Netflix 宣布部分组件进入维护状态,不再开发新特性,Zuul 1.X 逐渐被边缘化。
- Spring Cloud Gateway:基于 Spring + SpringBoot 开发,旨在替换 Zuul。它为微服务架构提供简单有效的请求转发途径,并提供安全性、监控指标和弹性等横切关注点。官方测试显示,其 RPS(每秒请求数)约为 Zuul 的 1.6 倍。
Spring Cloud Gateway 快速上手
创建项目与依赖
首先创建一个标准的 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
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:子定义路由 ID,必须唯一。
uri:目标服务地址,支持普通 URI 或 lb:// 服务名。使用 lb:// 表示启用负载均衡,从注册中心拉取实例。
predicates:路由断言,决定请求是否匹配该路由。上述配置将 /product/** 的请求代理到 product-service。
访问示例:http://127.0.0.1:10030/order/1
Route Predicate Factories(路由断言工厂)
Predicate 基础
Predicate 是 Java 8 提供的函数式编程接口,接收参数返回布尔值,用于条件过滤。在 Gateway 中,它提供了路由规则的匹配机制。
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Predicate<String> predicate = s -> s.isEmpty();
System.out.println(predicate.test(""));
System.out.println(predicate.test("bite666"));
Predicate 还支持组合操作,如 and()(短路与)、or()(短路或)、negate()(逻辑非)。
常用断言工厂
Route Predicate Factory 将配置文件中的字符串规则转换为判断条件。例如 Path=/product/** 是由 PathRoutePredicateFactory 实现的。
Spring Cloud Gateway 默认提供了丰富的断言工厂,可匹配 HTTP 请求的不同属性,且支持多条件组合。
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]
Gateway Filter Factories(过滤器工厂)
Predicate 决定了请求由哪个路由处理,而 Filter 则负责在请求处理前后添加逻辑。
- Pre 类型:路由处理之前执行(转发到后端前),适合做鉴权、限流。
- Post 类型:请求完成后,返回给客户端前执行,适合记录日志、修改响应头。
Spring Cloud Gateway 从作用范围上把 Filter 分为两类:
- GatewayFilter:应用到单个路由或一组路由。
- GlobalFilter:应用到所有路由,全局生效。
GatewayFilter 使用
GatewayFilter 通常在配置文件中指定,逻辑固定。例如 AddRequestParameterGatewayFilterFactory 可为请求添加参数。
spring:
cloud:
gateway:
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/product/**
filters:
- AddRequestParameter=userName, bite
此 Filter 仅对 product-service 路由生效。后端控制器接收参数即可:
@RequestMapping("/{productId}")
public ProductInfo getProductById(@PathVariable("productId") Integer productId, String userName) {
System.out.println("收到请求,Id:" + productId);
System.out.println("userName:" + userName);
return productService.selectProductById(productId);
}
若需对所有路由生效,可使用 default-filters:
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red,Default-Blue
- PrefixPath=/httpbin
GlobalFilter 使用
GlobalFilter 作用于所有请求,常用于安全、监控、日志等全局功能。内置的全局过滤器包括 Gateway Metrics Filter(监控指标)、LoadBalancer Client Filter(负载均衡)等。
- 添加 Actuator 依赖。
- 配置
application.yml:
spring:
cloud:
gateway:
metrics:
enabled: true
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
shutdown:
enabled: true
访问 http://127.0.0.1:10030/actuator 即可查看监控信息。
过滤器执行顺序
当项目中同时存在 GatewayFilter 和 GlobalFilter 时,网关会将它们合并到一个过滤器链中排序执行。
每个过滤器必须指定 int 类型的 order 值,默认为 0。值越小,优先级越高,执行越靠前。
- 通过实现
Ordered 接口或添加 @Order 注解指定。
- Spring Cloud Gateway 提供的 Filter 由框架指定。
- 当
order 值相同时,执行顺序为:defaultFilter > GatewayFilter > GlobalFilter。
自定义过滤器
开发者可根据业务需求自定义过滤器,同样支持 GatewayFilter 和 GlobalFilter 两种模式。
自定义 GatewayFilter
实现 AbstractGatewayFilterFactory 抽象类即可。
@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;
}
}
spring:
cloud:
gateway:
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/product/**
filters:
- name: Custom
args:
name: custom filter
注意:类名建议以 GatewayFilterFactory 结尾,配置中使用 name 字段匹配类名前缀。
自定义 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 作为微服务架构的统一入口,提供了强大的路由匹配和过滤器扩展能力。通过合理配置 Predicates 和 Filters,我们可以轻松实现鉴权、限流、监控等横切关注点,有效降低业务系统的耦合度。在实际开发中,建议优先使用内置工厂满足通用需求,复杂场景下再考虑自定义扩展。
相关免费在线工具
- 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