Appearance
如何在项目中引入 Spring Cloud Gateway
概述
Spring Cloud Gateway 是 Spring 生态系统中的一个重要组件,它为微服务架构提供了强大的 API 网关功能。在现代微服务架构中,API 网关扮演着系统入口的关键角色,负责路由转发、负载均衡、安全认证、限流熔断等功能。
核心依赖引入
Maven 依赖配置
要在你的项目中引入 Spring Cloud Gateway,需要使用以下 starter:
kotlin
dependencies {
// Spring Cloud Gateway WebFlux 版本依赖
implementation("org.springframework.cloud:spring-cloud-starter-gateway-server-webflux")
// Spring Boot 相关依赖
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("org.springframework.boot:spring-boot-starter-actuator")
}
// 依赖管理
dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
}
}xml
<dependencies>
<!-- Spring Cloud Gateway WebFlux 版本依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway-server-webflux</artifactId>
</dependency>
<!-- Spring Boot 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>业务场景说明
在电商微服务架构中,我们通常有以下服务:
- 用户服务 (user-service)
- 商品服务 (product-service)
- 订单服务 (order-service)
- 支付服务 (payment-service)
Spring Cloud Gateway 作为统一入口,解决了以下问题:
基础配置
启用和禁用网关
kotlin
// Application.kt - 主启动类
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
class GatewayApplication
fun main(args: Array<String>) {
runApplication<GatewayApplication>(*args)
}在 application.yml 中配置:
yaml
# application.yml
spring:
cloud:
gateway:
enabled: true # 启用网关功能(默认为true)
discovery:
locator:
enabled: true # 启用服务发现路由
lower-case-service-id: true # 服务名小写
application:
name: api-gateway
server:
port: 8080 # 网关服务端口如果你引入了 starter 但不想启用网关功能,可以设置 `spring.cloud.gateway.enabled=false`
重要技术特性
响应式编程模型
Spring Cloud Gateway 基于以下技术栈构建:
由于 Spring Cloud Gateway 构建在 Spring Boot、Spring WebFlux 和 Project Reactor 之上,许多你熟悉的同步库(如 Spring Data 和 Spring Security)和模式在使用 Spring Cloud Gateway 时可能不适用。
运行时要求
Spring Cloud Gateway 需要 Spring Boot 和 Spring WebFlux 提供的 Netty 运行时支持。它**不能**在传统的 Servlet 容器中工作,也不能构建为 WAR 包。
支持的运行环境:
- ✅ Netty (推荐)
- ✅ 独立 JAR 包
- ❌ Tomcat/Jetty 等 Servlet 容器
- ❌ WAR 包部署
实际应用示例
简单路由配置
kotlin
// RouteConfig.kt - 路由配置类
@Configuration
class RouteConfig {
@Bean
fun customRouteLocator(builder: RouteLocatorBuilder): RouteLocator {
return builder.routes()
// 用户服务路由
.route("user-service") { r ->
r.path("/api/users/**")
.uri("lb://user-service") // 负载均衡到用户服务
}
// 商品服务路由
.route("product-service") { r ->
r.path("/api/products/**")
.uri("lb://product-service") // 负载均衡到商品服务
}
// 订单服务路由
.route("order-service") { r ->
r.path("/api/orders/**")
.filters { f ->
f.addRequestHeader("X-Request-Source", "gateway") // 添加请求头
}
.uri("lb://order-service")
}
.build()
}
}YAML 配置方式
yaml
# application.yml
spring:
cloud:
gateway:
routes:
# 用户服务路由
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: CircuitBreaker # 熔断器
args:
name: user-service-cb
fallbackUri: forward:/fallback/users
# 商品服务路由
- id: product-service
uri: lb://product-service
predicates:
- Path=/api/products/**
filters:
- name: RequestRateLimiter # 限流器
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20全局过滤器示例
kotlin
// GlobalAuthFilter.kt - 全局认证过滤器
@Component
class GlobalAuthFilter : GlobalFilter, Ordered {
override fun filter(exchange: ServerWebExchange, chain: GatewayFilterChain): Mono<Void> {
val request = exchange.request
val path = request.path.value()
// 跳过健康检查和静态资源
if (path.startsWith("/actuator") || path.startsWith("/static")) {
return chain.filter(exchange)
}
// 检查认证Token
val token = request.headers.getFirst("Authorization")
return if (isValidToken(token)) {
// Token有效,继续请求链
val modifiedRequest = request.mutate()
.header("X-User-Id", extractUserId(token)) // 添加用户ID到请求头
.build()
chain.filter(exchange.mutate().request(modifiedRequest).build())
} else {
// Token无效,返回401
val response = exchange.response
response.statusCode = HttpStatus.UNAUTHORIZED
response.setComplete()
}
}
override fun getOrder(): Int = -100 // 设置过滤器优先级
private fun isValidToken(token: String?): Boolean {
// 实际项目中这里会调用认证服务验证Token
return !token.isNullOrBlank() && token.startsWith("Bearer ")
}
private fun extractUserId(token: String): String {
// 从Token中提取用户ID
return "user123" // 简化示例
}
}监控和管理
Actuator 端点配置
yaml
# application.yml
management:
endpoints:
web:
exposure:
include: health,info,gateway # 暴露网关相关端点
endpoint:
gateway:
enabled: true # 启用网关管理端点可用的管理端点:
/actuator/gateway/routes- 查看所有路由/actuator/gateway/filters- 查看所有过滤器/actuator/gateway/refresh- 刷新路由配置
性能优化建议
TIP
性能调优要点
- 连接池配置:合理配置 Netty 连接池大小
- 内存管理:调整 JVM 堆内存和直接内存
- 响应式编程:避免在过滤器中使用阻塞操作
- 监控指标:使用 Micrometer 监控网关性能
kotlin
// NettyConfig.kt - Netty 性能配置
@Configuration
class NettyConfig {
@Bean
fun nettyReactiveWebServerFactory(): NettyReactiveWebServerFactory {
val factory = NettyReactiveWebServerFactory()
factory.addServerCustomizers { server ->
server.option(ChannelOption.SO_KEEPALIVE, true)
.option(ChannelOption.SO_BACKLOG, 1024)
.childOption(ChannelOption.TCP_NODELAY, true)
}
return factory
}
}总结
Spring Cloud Gateway 为微服务架构提供了强大而灵活的 API 网关解决方案。通过合理的配置和使用,可以有效地:
- 🚀 统一入口:为所有微服务提供统一的访问入口
- 🔐 安全控制:实现认证、授权、限流等安全功能
- 📊 监控管理:提供丰富的监控和管理功能
- ⚡ 高性能:基于响应式编程模型,支持高并发
在开始使用 Spring Cloud Gateway 之前,建议先熟悉 Spring WebFlux 和 Project Reactor 的相关概念,这将有助于更好地理解和使用网关的高级功能。