在微服务架构中,API 网关是系统的核心入口,承担着路由转发、负载均衡、安全控制、限流熔断等关键职责。Spring Cloud Gateway 作为 Spring Cloud 官方推出的第二代网关组件,凭借其高性能(基于 WebFlux 异步非阻塞模型)和强大的扩展能力,已成为微服务网关的首选方案。本文将结合 Nacos 服务发现,带你从零搭建一个生产级网关,并详解核心功能实现。
一、环境搭建:创建 Gateway 服务
1. 添加核心依赖
在 pom.xml 中引入 Gateway 和 Nacos 服务发现依赖:
<dependencies>
<!-- Spring Cloud Alibaba Nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Spring Cloud Gateway 核心依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
2. 创建主启动类
@SpringBootApplication
@EnableDiscoveryClient // 启用 Nacos 服务发现
public class GatewayMainApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayMainApplication.class, args);
}
}
3. 配置 application.yml
spring:
application:
name: gateway # 服务名称
profiles:
include: route # 引入路由配置文件
cloud:
nacos:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
server:
port: 80 # 网关对外端口(生产环境建议用非80端口,此处简化演示)
关键点说明
lb://service-order中的lb表示 LoadBalancer,网关会通过 Nacos 获取服务实例列表并自动负载均衡profiles.include: route实现配置分离,路由规则单独管理更清晰
二、核心功能:路由配置实战
1. 基础路由规则(route.yml)
spring:
cloud:
gateway:
routes:
- id: order-route # 路由唯一ID
uri: lb://service-order # 目标服务(Nacos注册名)
predicates: # 断言(匹配条件)
- Path=/api/order/** # 匹配所有 /api/order/ 开头的路径
order: 0 # 优先级(数字越小优先级越高)
- id: product-route
uri: lb://service-product
predicates:
- Path=/api/product/**
2. 路径重写(RewritePath)
解决前后端路径不一致问题,例如将 /api/order/detail 重写为 /detail:
routes:
- id: order-route
uri: lb://service-order
predicates:
- Path=/api/order/**
filters:
# 正则解析:/api/order/ab/c → 重写为 /ab/c
- RewritePath=/api/order/?(?<segment>.*), /$\{segment}
正则详解
?(?<segment>.*) 捕获 /api/order/ 之后的所有路径,$\{segment} 引用捕获组内容
示例:/api/order/user/123 → 重写后请求 service-order 的 /user/123 接口
3. 路由工作原理
- 客户端请求 进入网关
- 断言(Predicate) 匹配请求路径
- 过滤器(Filter) 执行前置/后置处理(如路径重写)
- 路由转发 至目标微服务
三、高级功能:过滤器与跨域
1. 全局过滤器:记录请求耗时
@Component
@Slf4j
public class ResponseTimeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String uri = exchange.getRequest().getURI().toString();
long start = System.currentTimeMillis();
// 前置逻辑:记录请求开始
log.info("请求【{}】开始,时间:{}", uri, start);
// 核心处理:放行请求并记录结束时间
return chain.filter(exchange).doFinally(result -> {
long end = System.currentTimeMillis();
log.info("请求【{}】结束,时间:{},耗时:{}ms", uri, end, end - start);
});
}
@Override
public int getOrder() {
return 0; // 执行优先级(数字越小越早执行)
}
}
2. 全局跨域配置(解决前端请求问题)
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有路径
allowedOrigins: "*" # 允许所有域名
allowedMethods: "*" # 允许所有方法
allowedHeaders: "*" # 允许所有头信息
allowCredentials: true # 允许携带凭证
生产环境建议
将 allowedOrigins 替换为具体前端域名(如 https://your-domain.com),避免 * 带来的安全风险
四、避坑指南:常见问题排查
问题1:服务无法发现(lb://service 报 503)
- 原因:微服务未正确注册到 Nacos
- 解决:
-
- 检查目标服务的
bootstrap.yml是否配置 Nacos - 访问
http://127.0.0.1:8848/nacos确认服务在线
- 检查目标服务的
问题2:路径重写失效
- 原因:正则表达式错误或过滤器顺序问题
- 解决:
-
- 确保
RewritePath在Path断言之后声明 - 使用在线正则工具测试表达式:
/api/order/?(?<segment>.*)
- 确保
问题3:跨域问题仍然存在
- 原因:网关配置未生效
- 解决:
-
- 检查配置是否在
spring.cloud.gateway节点下 - 确认未与其他跨域配置(如
@CrossOrigin)冲突
- 检查配置是否在
五、总结:网关的核心价值
| 功能 | 价值 | 本文实现方案 |
|---|---|---|
| 统一入口 | 隐藏内部微服务结构 | 所有请求走 80 端口 |
| 动态路由 | 服务上下线自动感知 | Nacos + lb://协议 |
| 路径标准化 | 前后端解耦,兼容多版本 API | RewritePath 过滤器 |
| 请求监控 | 快速定位性能瓶颈 | 全局过滤器记录耗时 |
| 安全屏障 | 集中处理跨域、认证、限流 | CORS 配置 + 自定义 Filter |
生产环境扩展建议
- 添加 JWT 鉴权过滤器(验证 token 合法性)
- 集成 Sentinel 实现网关级限流
- 通过
ModifyRequestBodyFilter修改请求体
网关是微服务架构的"守门人",合理设计能大幅提升系统健壮性与可维护性。 本文基于 Nacos 的实践方案已在多个生产项目落地,重点关注路由配置的灵活性与过滤器的精准控制,避免过度设计。掌握这些核心技能,你已经能搭建一个企业级网关!
扩展阅读:Spring Cloud Gateway 官方文档