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. 初始化流程
- Spring 启动 → 加载
ReactorResourceFactory→ 读取reactor.netty.*系统属性 → 创建 全局 EventLoopGroup(Boss+Worker)。 - 绑定
HttpClientProperties→ 创建HttpClient→ 复用全局 EventLoopGroup,应用连接池/超时配置。 - 网关接收请求 →
NettyRoutingFilter用HttpClient转发请求。
2. 关键注意点
- 系统属性必须早于 Netty 初始化:
@Bean中System.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
五、常见问题排查清单
- 请求超时报错
- 调大
response-timeout、连接池max-connections
- 调大
- 连接耗尽排队阻塞
- 连接池改为fixed模式,调高最大连接数
- CPU占用过高
- 降低ioWorkerCount,控制为CPU核数2倍以内
- 端口连接拒绝
- 核对connect-timeout,检查后端服务可用性
- 配置不生效
- JVM参数优先级最高,yml次之,Java Bean最后;确保参数在Netty初始化前加载
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/20154586

浙公网安备 33010602011771号