Netty 配置
infra-web-netty-server 模块提供了基于 Netty 的嵌入式 Web 服务器实现。
它可以通过 infra-starter-netty-server 启动器自动配置,也可以通过直接使用 NettyWebServerFactory 进行编程式配置。
依赖引入
要使用 Netty 作为嵌入式容器,您需要添加 infra-starter-netty-server 依赖:
dependencies {
implementation 'cn.taketoday:infra-starter-netty-server'
}
配置属性
您可以通过 server.netty 前缀的配置属性来定制 Netty 服务器的行为。
以下是一些常用的配置项:
| 属性名 | 描述 | 默认值 |
|---|---|---|
|
用于处理 I/O 操作的工作线程数 (Child EventLoopGroup)。 |
核心数 * 2 |
|
用于接收连接的线程数 (Parent EventLoopGroup)。 |
1 |
|
允许的最大连接数 (SOMAXCONN)。 |
系统默认值 (Windows: 200, 其他: 128) |
|
请求体的最大长度。超过此限制将返回错误。 |
100MB |
|
最大分块大小。 |
8KB |
|
HTTP 请求解码的初始缓冲区大小。 |
128B |
|
HTTP 头的最大大小。 |
8KB |
|
HTTP 请求行(第一行)的最大长度。 |
4096 |
|
是否启用头验证,以防止请求/响应拆分攻击。 |
true |
|
连接超时时间。 |
无 |
|
资源泄漏检测级别 (DISABLED, SIMPLE, ADVANCED, PARANOID)。 |
DISABLED |
|
是否在每次写入操作后自动刷新 PrintWriter。 |
false |
|
用于存储接收数据块的队列容量。 |
256 |
|
是否自动从通道读取数据。 |
true |
|
是否自动确认 PING 帧。 |
true |
|
是否自动确认 SETTINGS 帧。 |
true |
|
HTTP/2 连接的优雅关闭超时时间。 |
30s |
|
是否支持 |
true |
|
是否允许分块被拆分为多个消息。 |
true |
|
是否允许超过一个 |
false |
此外,还有一些通用的服务器配置属性,位于 server 前缀下:
| 属性名 | 描述 | 默认值 |
|---|---|---|
|
服务器 HTTP 端口。 |
8080 |
|
服务器绑定的网络地址。 |
0.0.0.0 (所有接口) |
|
是否使用虚拟线程作为服务执行器 (Java 21+)。 |
false |
|
处理 X-Forwarded-* 头的策略 (NATIVE, FRAMEWORK, NONE)。 |
无 (暂未实现) |
|
服务器支持的关闭类型 (IMMEDIATE, GRACEFUL)。 |
GRACEFUL |
线程池配置
您可以自定义工作线程和接收线程的名称:
server:
netty:
worker-pool-name: "infra-netty-worker"
acceptor-pool-name: "infra-netty-acceptor"
优雅停机
Netty 服务器支持优雅停机,可以通过 server.netty.shutdown 配置相关参数。
优雅停机可确保在关闭服务器之前,不会提交新任务,但会允许正在进行的任务在“静默期”内完成。
| 属性名 | 描述 | 默认值 |
|---|---|---|
|
静默期(秒),在此期间如果没有新任务提交,则关闭。如果在此期间有任务提交,则静默期重新开始。 |
1s |
|
最大等待时间(秒),无论是否有任务提交,超过此时间强制关闭。 |
10s |
|
|
SECONDS |
server:
netty:
shutdown:
quiet-period: 2 # 静默期(秒)
timeout: 15 # 最大等待时间(秒)
unit: SECONDS # 时间单位
SSL 配置
可以通过 server.ssl 前缀配置 SSL:
server:
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: changeit
key-store-type: PKCS12
key-alias: tomcat
编程式配置
如果您需要更细粒度的控制,可以注册一个 WebServerFactoryCustomizer bean 来定制 NettyWebServerFactory:
@Bean
public WebServerFactoryCustomizer<NettyWebServerFactory> nettyCustomizer() {
return factory -> {
factory.setPort(8088);
factory.setWorkerThreadCount(10);
};
}
@Bean
public ServerBootstrapCustomizer serverBootstrapCustomizer(){
return bootstrap -> {
bootstrap.option(ChannelOption.AUTO_READ, false);
};
}