Skip to content

如何在项目中引入 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

性能调优要点

  1. 连接池配置:合理配置 Netty 连接池大小
  2. 内存管理:调整 JVM 堆内存和直接内存
  3. 响应式编程:避免在过滤器中使用阻塞操作
  4. 监控指标:使用 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 的相关概念,这将有助于更好地理解和使用网关的高级功能。