spring-gateway 【一、配置 】

Spring Cloud Gateway 默认基于 Reactor Netty(异步非阻塞)做 HTTP 服务端与客户端,线程模型为 Boss(Accept)+ Worker(I/O),连接池默认 elastic(弹性)

配置流程


一、Netty 默认配置(Spring Cloud Gateway 内置)

1. 线程模型(Reactor Netty)

  • Boss 线程(Acceptor):默认 1 个,负责监听端口、接受新连接。
  • Worker 线程(I/O):默认 CPU 核数(如 4 核=4),负责读写、编解码、回调。
  • EventLoop:每个线程绑定一个 EventLoop,一个 Channel 始终由同一个 EventLoop 处理,保证线程安全。

2. HTTP 客户端(网关→后端)默认值(HttpClientProperties)

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 45000          # 连接超时(ms)
        response-timeout: 30s           # 响应超时
        compression: false               # 是否压缩
        pool:
          type: elastic                  # 连接池类型:elastic/fixed
          max-connections: 500          # 最大连接数
          pending-acquire-timeout: 45000 # 等待连接超时(ms)
          max-idle-time: 30s            # 空闲连接超时
          max-life-time: 60s             # 连接最大生命周期

3. 系统属性(Reactor 控制)

  • reactor.netty.ioWorkerCount:默认 CPU 核数
  • reactor.netty.ioSelectCount:默认 1(Boss 线程数)。

二、可自定义的核心参数(分三类)

1. 线程池参数(重点调优)

# 1) 系统属性(优先级最高,启动前设置)
reactor.netty.ioSelectCount=1          # Boss 线程数(建议1-2)
reactor.netty.ioWorkerCount=16         # Worker 线程数(建议CPU*2~3)

# 2) Gateway 配置(HTTP 客户端连接池)
spring.cloud.gateway.httpclient.pool.type=fixed  # fixed/elastic
spring.cloud.gateway.httpclient.pool.max-connections=2000
spring.cloud.gateway.httpclient.pool.max-requests-per-connection=1000
spring.cloud.gateway.httpclient.pool.max-idle-time=300000

2. 超时与连接控制

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 2000          # 连接超时(ms)
        response-timeout: 5s            # 响应超时
        pool:
          pending-acquire-timeout: 10000 # 等待连接超时

3. 服务器端 Netty 配置(可选)

@Bean
public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
    NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
    factory.addServerCustomizers(httpServer -> httpServer
        .tcpConfiguration(tcpServer -> tcpServer
            .bootstrap(bootstrap -> bootstrap
                .group(new NioEventLoopGroup(1), // Boss
                       new NioEventLoopGroup(16)) // Worker
                .channel(NioServerSocketChannel.class)
            )
        )
    );
    return factory;
}

三、自定义配置流程(4 种方式,优先级从高到低)

方式 1:JVM 系统属性(启动前,优先级最高)

java -Dreactor.netty.ioWorkerCount=16 -Dreactor.netty.ioSelectCount=1 -jar gateway.jar
  • 生效时机:Netty 初始化前(必须早于 WebServer/HttpClient 创建)。

方式 2:application.yml/properties(推荐,HTTP 客户端)

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 2000
        pool:
          type: fixed
          max-connections: 2000
  • 生效时机:HttpClientProperties 绑定后,Netty 客户端创建时

方式 3:Java 配置类(自定义 Netty 服务器/客户端)

@Configuration
public class NettyConfig {
    // 自定义 ReactorResourceFactory(全局线程池)
    @Bean
    public ReactorResourceFactory reactorResourceFactory() {
        ReactorResourceFactory factory = new ReactorResourceFactory();
        System.setProperty("reactor.netty.ioWorkerCount", "16");
        return factory;
    }

    // 自定义 HTTP 客户端选项
    @Bean
    public Consumer<HttpClientOptions.Builder> nettyClientOptions() {
        return options -> options
            .connectTimeout(Duration.ofMillis(2000))
            .poolConfig(pool -> pool
                .maxConnections(2000)
            );
    }
}

方式 4:路由级配置(特定路由单独超时)

spring:
  cloud:
    gateway:
      routes:
        - id: slow-service
          uri: http://localhost:8081
          predicates:
            - Path=/slow/**
          metadata:
            connect-timeout: 1000
            response-timeout: 30000

四、配置生效原理与注意事项

1. 初始化流程

  1. Spring 启动 → 加载 ReactorResourceFactory → 读取 reactor.netty.* 系统属性 → 创建 全局 EventLoopGroup(Boss+Worker)。
  2. 绑定 HttpClientProperties → 创建 HttpClient → 复用全局 EventLoopGroup,应用连接池/超时配置。
  3. 网关接收请求 → NettyRoutingFilterHttpClient 转发请求。

2. 关键注意点

  • 系统属性必须早于 Netty 初始化@BeanSystem.setProperty 要在 ReactorResourceFactory 创建前执行。
  • Worker 线程数建议:CPU 核数 × 2~3(过高会上下文切换频繁)。
  • 连接池选择
    • elastic:默认,动态扩容,适合流量波动大。
    • fixed:固定大小,适合稳定高并发,避免突 burst 打满连接。
  • 线程隔离:网关(WebServer)与客户端(HttpClient)共享同一个 EventLoopGroup,无需分开配置。

五、默认 vs 推荐配置(参考)

参数 默认值 推荐值(8C16G)
reactor.netty.ioSelectCount 1 1
reactor.netty.ioWorkerCount 8 16~24
max-connections 500 2000~5000
connect-timeout 45s 2s
response-timeout 30s 5~10s

配置模板

Spring Gateway Netty 可直接套用配置模板

一、完整application.yml配置

spring:
  cloud:
    gateway:
      # Netty HTTP客户端全局配置
      httpclient:
        # 连接超时 单位ms
        connect-timeout: 2000
        # 响应超时
        response-timeout: 8s
        # 开启响应压缩
        compression: true
        # 连接池配置
        pool:
          # elastic弹性池/fixed固定池,高并发推荐fixed
          type: fixed
          # 最大连接数
          max-connections: 3000
          # 单连接最大请求数
          max-requests-per-connection: 1000
          # 空闲连接销毁时长
          max-idle-time: 30s
          # 连接最大生命周期
          max-life-time: 60s
          # 获取连接排队超时
          pending-acquire-timeout: 10000

二、JVM启动参数脚本

Linux/Mac 启动命令

java \
-Dreactor.netty.ioSelectCount=1 \
-Dreactor.netty.ioWorkerCount=16 \
-jar gateway-service.jar

Windows cmd启动命令

java -Dreactor.netty.ioSelectCount=1 -Dreactor.netty.ioWorkerCount=16 -jar gateway-service.jar

三、Java自定义Netty配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.reactive.ReactorResourceFactory;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
import java.time.Duration;
import java.util.function.Consumer;

@Configuration
public class GatewayNettyConfig {

    /**
     * 全局Netty线程资源工厂
     */
    @Bean
    public ReactorResourceFactory reactorResourceFactory() {
        ReactorResourceFactory factory = new ReactorResourceFactory();
        factory.setUseGlobalResources(true);
        return factory;
    }

    /**
     * 自定义HttpClient参数兜底配置
     */
    @Bean
    public Consumer<HttpClient.Builder> httpClientCustomizer() {
        return httpClient -> httpClient
                .option(ConnectionProvider.DEFAULT_POOL_ACQUIRE_TIMEOUT, Duration.ofSeconds(10))
                .responseTimeout(Duration.ofSeconds(8));
    }

    /**
     * 自定义服务端Netty参数
     */
    @Bean
    public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
        NettyReactiveWebServerFactory serverFactory = new NettyReactiveWebServerFactory();
        serverFactory.addServerCustomizers(httpServer -> httpServer
                .tcpConfiguration(tcp -> tcp
                        .backlog(1024)
                        .keepAlive(true)
                ));
        return serverFactory;
    }
}

四、路由级单独超时配置示例

spring:
  cloud:
    gateway:
      routes:
        - id: slow-api-route
          uri: lb://slow-service
          predicates:
            - Path=/slow/**
          metadata:
            connect-timeout: 5000
            response-timeout: 30000

五、常见问题排查清单

  1. 请求超时报错
    • 调大response-timeout、连接池max-connections
  2. 连接耗尽排队阻塞
    • 连接池改为fixed模式,调高最大连接数
  3. CPU占用过高
    • 降低ioWorkerCount,控制为CPU核数2倍以内
  4. 端口连接拒绝
    • 核对connect-timeout,检查后端服务可用性
  5. 配置不生效
    • JVM参数优先级最高,yml次之,Java Bean最后;确保参数在Netty初始化前加载
posted @ 2026-05-25 14:15  蓝迷梦  阅读(58)  评论(0)    收藏  举报