以下是使用 Spring Cloud Gateway 连接前端与后端微服务的详细步骤,涵盖路由配置、过滤器链、负载均衡和动态路由管理:
主要功能前端通过访问一个固定的端口,可以通过Spring Cloud Gateway来访问到微服务里面的不同的端口里面的,可以通过如下的图片理解一下;
1. 环境准备
版本兼容性
Spring Boot | Spring Cloud | Spring Cloud Gateway |
---|---|---|
2.7.x | 2021.0.5 | 3.1.5 |
3.0.x | 2022.0.0 | 4.0.0 |
2. 创建一个新的网关模块
(1) 父级 添加依赖
在父工程 pom.xml
中引入以下依赖:
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Alibaba 依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
(2) 子模块 添加依赖
在网关模块的 pom.xml
中引入以下依赖:
<!-- Spring Cloud 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>
<!-- 负载均衡(Spring Cloud 2020.x+ 默认使用 LoadBalancer) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
3. 配置路由规则
在 application.yml
中定义路由规则:
server:
port: 8080 # 网关端口
spring:
application:
name: api-gateway # 服务名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos 注册中心地址
gateway:
routes:
# 示例1:将前端请求路由到用户服务
- id: user-service-route # id自己来取,最好和对应的服务名称相关
uri: lb://user-service # lb:// 表示负载均衡,user-service 是注册的服务名
predicates:
- Path=/api/user/** # 匹配请求路径,和controller的顶级路径一样,可以写多个
filters:
- StripPrefix=1 # 去掉路径前缀(如 /api/user/xxx → /xxx)
- AddRequestHeader=X-Request-Redirected, Gateway
# 示例2:静态路由(直接转发到指定 URL)
- id: static-route
uri: http://example.com
predicates:
- Path=/static/**
# 全局跨域配置(可选)
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
allowedHeaders: "*"
4. 启用服务发现与负载均衡
在主启动类添加注解:
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
5. 自定义过滤器
(1) 全局鉴权过滤器
@Component
public class AuthFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}
(2) 请求日志过滤器
@Component
public class LoggingFilter implements GlobalFilter {
private static final Logger log = LoggerFactory.getLogger(LoggingFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("Request path: {}", exchange.getRequest().getPath());
return chain.filter(exchange);
}
}
6. 动态路由配置
通过 RouteDefinitionLocator
实现动态路由(如从数据库读取路由规则):
@Bean
public RouteLocator dynamicRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route("dynamic-route", r -> r.path("/dynamic/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://dynamic-service")
.build();
}
7. 验证网关功能
(1) 测试路由转发
- 访问
http://localhost:8080/api/user/1
→ 转发到user-service
的/1
接口。 - 访问
http://localhost:8080/static/resource
→ 转发到http://example.com/resource
。
(2) 查看注册中心
- 登录 Nacos 控制台(
http://localhost:8848/nacos
),确认api-gateway
和user-service
已注册。
(3) 检查过滤器日志
- 观察控制台输出,确认
LoggingFilter
打印了请求路径。
8. 高级配置
(1) 限流与熔断
集成 Sentinel 实现网关层限流:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
配置限流规则:
spring:
cloud:
sentinel:
filter:
enabled: false # 关闭默认的 Servlet 过滤器
transport:
dashboard: localhost:8080
scg:
fallback:
mode: response
response-status: 429
response-body: '{"code": 429, "msg": "请求过多"}'
(2) 灰度发布
通过 Weight
断言实现按权重路由:
spring:
cloud:
gateway:
routes:
- id: gray-route
uri: lb://user-service
predicates:
- Path=/api/user/**
- Weight=group1, 20 # 20%流量路由到新版本
9. 常见问题
问题 1:路由未生效
- 原因:路由配置路径不匹配或服务名错误。
- 解决:检查
predicates
的Path
规则和uri
中的服务名。
问题 2:服务发现失败
- 原因:Nacos 未启动或网关未正确连接。
- 解决:检查 Nacos 控制台,确认
spring.cloud.nacos.discovery.server-addr
配置正确。
问题 3:跨域问题
- 解决:确保
globalcors
配置正确,或在前端配置代理。
总结
通过 Spring Cloud Gateway,你可以实现以下功能:
- 路由转发:将前端请求分发到不同微服务。
- 负载均衡:集成 Ribbon 或 LoadBalancer 自动选择服务实例。
- 过滤器链:实现鉴权、日志、限流等统一逻辑。
- 动态路由:支持实时更新路由规则。
结合 Nacos 服务发现和 Sentinel 限流,可构建高可用、安全的 API 网关层。