大家好,Spring Cloud 系列第三篇重磅来袭! 上一期《Nacos 从入门到生产级配置》已经打通了服务注册 + 动态配置,今天我们直接上微服务架构的"门面"------Spring Cloud Gateway 4.3.x!为什么 Gateway 是必学?
- 它是 Spring Cloud 官方唯一推荐的网关(Zuul 早已废弃)
- Reactive 模型,高并发下性能碾压 Nginx + Zuul
- 原生支持函数式路由、Bucket4j 限流、JWT 鉴权、日志追踪
- 阿里、字节、腾讯、美团等大厂统一网关 90%+ 用 Gateway
一、Gateway 2026 年现状 & 为什么选它?
1.1 当前版本
- 最新稳定版:Spring Cloud Gateway 4.3.x(基于 Spring Boot 3.3.x / 4.0.x,2025 年底发布,2026 年主流)
- 核心亮点:
- 函数式路由(RouteLocator + Predicate/ Filter DSL)
- Bucket4j 原生限流(取代旧 RequestRateLimiter)
- WebFlux + Reactor 响应式编程
- 与 Spring Cloud LoadBalancer / Nacos 无缝集成
- 支持 GraalVM 原生镜像(启动 < 100ms)
1.2 对比其他网关
| 网关 | 性能(QPS) | 响应式 | 限流支持 | 鉴权集成 | 动态路由 | 社区活跃 | 大厂落地 | 推荐指数 |
|---|---|---|---|---|---|---|---|---|
| Spring Cloud Gateway 4.x | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★★ | 阿里/字节/腾讯 | 首选 |
| Zuul 2 | ★★★ | ✗ | ★★ | ★★★ | ★★★ | ★★ | 旧项目 | 废弃 |
| Kong | ★★★★ | ★★★★ | ★★★★★ | ★★★★★ | ★★★★ | ★★★★ | 国际化 | 备选 |
| Nginx + Lua | ★★★★★ | ✗ | ★★★★ | ★★★★ | ★★ | ★★★★ | 高并发 | 非 Java 团队 |
| Spring Cloud Netflix Zuul 1 | ★★ | ✗ | ★ | ★★ | ★★ | ★ | 老项目 | 淘汰 |
结论:2026 年 Java 微服务项目100% 推荐 Gateway,生态最完整、扩展最强。
二、快速上手:基础网关搭建
2.1 引入依赖(Spring Cloud 2025.1.x + Gateway 4.3.x)xml
<!-- Spring Cloud 依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2025.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Gateway -->
<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>
2.2 配置文件(application.yml)yaml
server:
port: 9000
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true # 开启服务发现路由
lower-case-service-id: true
routes:
- id: order_route
uri: lb://order-service # lb:// + 服务名(Nacos 发现)
predicates:
- Path=/order/**
filters:
- StripPrefix=1 # 去掉 /order 前缀
2.3 启动类
java
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
启动后访问:http://localhost:9000/order/discount → 自动转发到 order-service
三、动态路由配置
动态路由:网关从 Nacos/配置中心实时拉取路由规则,服务新增/下线时自动更新路由,无需修改 yml 或重启网关。
3.1 方式一:最推荐 - 结合 Nacos + discovery.locator(自动发现)yaml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true # 开启服务发现自动路由
lower-case-service-id: true # 服务名小写(推荐)
url-expression: "'lb://'+serviceId" # lb:// + 服务名
routes: [] # 留空,所有路由靠 discovery 自动生成
效果:
- 所有在 Nacos 注册的服务(如 order-service、user-service)自动生成路由:/order/** → lb://order-service
- 服务上下线,路由实时自动更新(延迟 < 10s)
3.2 方式二:Nacos 配置中心 + 动态路由(自定义路由规则)
-
在 Nacos 控制台新建配置(Data ID:gateway-routes.json,Group:DEFAULT_GROUP,格式:JSON)
[
{
"id": "order_route",
"uri": "lb://order-service",
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/api/order/"
}
}
],
"filters": [
{
"name": "StripPrefix",
"args": {
"_genkey_0": "2"
}
}
],
"order": 1
},
{
"id": "user_route",
"uri": "lb://user-service",
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/api/user/"
}
}
],
"order": 2
}
] -
网关 bootstrap.yml 配置拉取
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: json
shared-configs:
- data-id: gateway-routes.json
group: DEFAULT_GROUP
refresh: true
3.自定义 RouteDefinitionLocator 监听配置变更
java
@Component
@RefreshScope
public class NacosDynamicRouteDefinitionLocator implements RouteDefinitionLocator {
private final NacosConfigManager nacosConfigManager;
private final String dataId = "gateway-routes.json";
private final String group = "DEFAULT_GROUP";
public NacosDynamicRouteDefinitionLocator(NacosConfigManager nacosConfigManager) {
this.nacosConfigManager = nacosConfigManager;
}
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
try {
String content = nacosConfigManager.getConfigService()
.getConfig(dataId, group, 5000);
// 解析 JSON 为 List<RouteDefinition>
List<RouteDefinition> routes = new ObjectMapper().readValue(content, new TypeReference<>() {});
return Flux.fromIterable(routes);
} catch (Exception e) {
log.error("加载动态路由失败", e);
return Flux.empty();
}
}
// 监听配置变更,自动刷新
@EventListener
public void onRefresh(RefreshEvent event) {
// 触发路由刷新
RouteDefinitionRepository repository = ...; // 注入
// 清空旧路由,加载新路由
}
}
3.3 方式三:事件驱动动态路由
java
@Component
public class DynamicRouteService implements ApplicationEventPublisherAware {
private ApplicationEventPublisher publisher;
@Autowired
private RouteDefinitionRepository routeDefinitionRepository;
// 从 Nacos 监听配置变更事件
@NacosConfigListener(dataId = "gateway-routes.json", groupId = "DEFAULT_GROUP")
public void onRouteConfigChange(String newContent) throws JsonProcessingException {
List<RouteDefinition> newRoutes = new ObjectMapper().readValue(newContent, new TypeReference<>() {});
// 清空旧路由
routeDefinitionRepository.delete(Mono.just("all")).subscribe();
// 添加新路由
newRoutes.forEach(route ->
routeDefinitionRepository.save(Mono.just(route)).subscribe()
);
// 发布刷新事件
publisher.publishEvent(new RefreshRoutesEvent(this));
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
}
动态路由流程图

四、全局/路由级限流(Bucket4j + Redis)
4.1 引入依赖xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-core</artifactId>
<version>8.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
4.2 配置 Redis + Bucket4jyaml
spring:
redis:
host: localhost
port: 6379
bucket4j:
gateway:
enabled: true
filters:
- cache-name: gateway-rate-limiter
# 全局限流:每分钟 100 次
global:
capacity: 100
refill:
tokens: 100
period: 1m
# 路由级限流:/api/order/** 每秒 10 次
routes:
order_route:
capacity: 10
refill:
tokens: 10
period: 1s
4.3 自定义限流响应java
java
@Component
public class RateLimiterErrorHandler implements ServerWebExchangeDecorator {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
// ... 限流超出返回 429
return chain.filter(exchange);
}
}
五、统一鉴权(JWT + OAuth2)
5.1 引入依赖xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
5.2 配置 JWT 鉴权 Filteryaml
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8080/auth # 你的授权服务器
jwk-set-uri: http://localhost:8080/auth/.well-known/jwks.json
5.3 自定义 GlobalFilter 鉴权java
java
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class JwtAuthenticationFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String token = request.getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 校验 JWT...
return chain.filter(exchange);
}
}
六、全链路日志 + 请求追踪
6.1 开启日志yaml
logging:
level:
org.springframework.cloud.gateway: TRACE
6.2 自定义请求日志 Filterjava
java
@Component
public class LoggingFilter implements GlobalFilter, Ordered {
private static final Logger log = LoggerFactory.getLogger(LoggingFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
log.info("Request: {} {} from {}", request.getMethod(), request.getURI(), request.getRemoteAddress());
return chain.filter(exchange).doOnSuccess(v -> {
ServerHttpResponse response = exchange.getResponse();
log.info("Response: {} for {}", response.getStatusCode(), request.getURI());
});
}
@Override
public int getOrder() {
return -1; // 最早执行
}
}
6.3 集成 Micrometer + SkyWalkingxml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId> <!-- 实际用 Micrometer Tracing -->
</dependency>
七、生产避坑 & 性能优化
- 坑1:动态路由不生效 → 确保 @RefreshScope + refresh: true + 监听器正确
- 坑2:路由冲突 → 优先级:自定义路由 > discovery.locator
- 坑3:Nacos 配置变更不刷新 → 用 @NacosConfigListener 或事件驱动
- 优化:路由缓存 + GraalVM + Reactor Netty 线程池调优
- 监控:Actuator /actuator/gateway/routes 查看当前路由列表
八、总结 & 行动计划
Spring Cloud Gateway 是微服务架构的"门神",掌握它,你就掌握了流量入口的绝对控制权!立即行动:
- 跑通基础路由 + Nacos 动态发现
- 实现 Bucket4j 限流 + JWT 鉴权
- 加全链路日志 + 生产优化
下一期:《Feign + LoadBalancer + Sentinel 微服务调用链路最佳实践》