文章目录
前言
好的,下面我给你提供一个具体的 Spring Cloud Gateway 实现案例。这个案例会涵盖以下内容:
- 基本配置:如何在 Spring Boot 项目中集成 Spring Cloud Gateway。
- 路由配置:定义 API 路由规则。
- 过滤器:如何使用过滤器来处理请求和响应(包括前置过滤器、后置过滤器)。
- 负载均衡:与服务发现(Eureka)集成,使用负载均衡的 API 网关。
- 安全性:如何在网关层进行身份验证和授权(例如 OAuth2)。
✅ 1. 创建 Spring Boot 项目
确保你的 pom.xml
或 build.gradle
中包含以下依赖。
Maven 依赖:
<dependencies>
<!-- Spring Boot Starter WebFlux (需要使用异步/非阻塞的 WebFlux 作为 Gateway 基础) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Spring Cloud Config (可选,用于集中配置管理) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- Eureka Client (可选,服务发现) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Spring Boot Actuator (可选,用于监控和健康检查) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
Gradle 依赖:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
✅ 2. 配置 application.yml
路由和过滤器
在 src/main/resources/application.yml
配置文件中,你可以定义基本的路由规则,类似于下面的例子:
spring:
cloud:
gateway:
routes:
- id: route_to_service_1
uri: http://localhost:8081 # 目标服务的 URI
predicates:
- Path=/service1/** # 请求路径为 /service1/** 的请求将被路由到此服务
filters:
- AddRequestHeader=X-Request-Foo, Bar # 添加请求头
- RewritePath=/service1/(?<segment>.*), /${segment} # 重写路径
- id: route_to_service_2
uri: lb://SERVICE2 # 使用负载均衡路由到 Eureka 注册的 SERVICE2 服务
predicates:
- Path=/service2/**
# 自定义的全局过滤器
default-filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
解释:
uri
:指定目标服务的 URI,可以是本地服务的地址(如http://localhost:8081
),也可以是通过服务发现(如 Eureka)的服务名(如lb://SERVICE2
)。predicates
:定义请求路由的条件。此例中,所有以/service1/**
为路径的请求都会被路由到http://localhost:8081
。filters
:对请求或响应进行修改(如添加请求头、重写路径等)。RequestRateLimiter
:用于限制请求的频率,可以防止滥用接口。
✅ 3. 创建自定义过滤器
Spring Cloud Gateway 允许你编写自定义的过滤器来对请求进行处理。
3.1 前置过滤器(Pre Filter)
前置过滤器用于在请求转发到目标服务之前处理请求,例如记录日志、添加请求头、身份验证等。
@Component
public class CustomPreFilter implements GatewayFilter, Ordered {
private static final Logger logger = LoggerFactory.getLogger(CustomPreFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 获取请求路径
String path = exchange.getRequest().getURI().getPath();
logger.info("Incoming request: " + path);
// 可以在此处添加请求头、检查授权等操作
exchange.getRequest().mutate().header("X-Custom-Header", "customValue").build();
return chain.filter(exchange); // 继续过滤链
}
@Override
public int getOrder() {
return 0; // 设置优先级,数字越小越先执行
}
}
3.2 后置过滤器(Post Filter)
后置过滤器用于请求经过目标服务处理后,但在返回给客户端之前进行处理。
@Component
public class CustomPostFilter implements GatewayFilter, Ordered {
private static final Logger logger = LoggerFactory.getLogger(CustomPostFilter.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 这里可以对响应进行处理
logger.info("Response sent with status: " + exchange.getResponse().getStatusCode());
}));
}
@Override
public int getOrder() {
return 1; // 设置优先级
}
}
3.3 全局过滤器
全局过滤器适用于所有路由,它们可以在路由规则之外做一些全局处理。
@Component
public class GlobalFilterExample implements GlobalFilter, Ordered {
private static final Logger logger = LoggerFactory.getLogger(GlobalFilterExample.class);
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
logger.info("Global filter triggered, path: " + exchange.getRequest().getURI().getPath());
return chain.filter(exchange); // 继续过滤链
}
@Override
public int getOrder() {
return 0; // 设置优先级
}
}
✅ 4. 负载均衡与服务发现
如果你使用 Eureka,Spring Cloud Gateway 能与 Eureka 无缝集成,自动支持服务发现和负载均衡。
application.yml
配置:
spring:
cloud:
gateway:
routes:
- id: route_to_service
uri: lb://SERVICE_NAME # lb://SERVICE_NAME 会通过 Eureka 自动查找
predicates:
- Path=/service/** # 匹配请求路径
- lb://:代表负载均衡的服务名称,Spring Cloud Gateway 会自动与 Eureka 进行集成,从而获取注册的服务。
- 使用 Ribbon 进行负载均衡。
✅ 5. 安全性:OAuth2 与 JWT
Spring Cloud Gateway 也能与 OAuth2 和 JWT 集成,进行请求的认证和授权。
配置示例:
spring:
cloud:
gateway:
routes:
- id: secure_route
uri: http://localhost:8081
predicates:
- Path=/secure/**
filters:
- name: RequestHeaderToRequestUri
args:
name: Authorization
你可以通过 Spring Security 与 OAuth2 集成,对请求进行授权认证。
✅ 6. 测试和监控
Spring Cloud Gateway 还内建了监控与健康检查功能,集成了 Spring Boot Actuator。
配置 Actuator:
management:
endpoints:
web:
exposure:
include: health,metrics,gateway
通过 /actuator/gateway/routes
可以查看当前网关的路由状态和信息。
✅ 总结:
Spring Cloud Gateway 是一个高性能的 API 网关,它的优点包括:
- 与 Spring 生态无缝集成:非常适合 Spring Boot 和 Spring Cloud 项目。
- 强大的路由和过滤功能:支持动态路由、限流、日志记录等功能。
- 支持负载均衡和服务发现:与 Eureka、Consul 集成,支持服务发现。
- 灵活的过滤器支持:自定义前置、后置过滤器以及全局过滤器。
如果你的项目使用 Spring Cloud 架构,Spring Cloud Gateway 是首选的 API 网关解决方案。