如何在 Spring Webflux / WebClient 中设置事件循环池大小?
Posted
技术标签:
【中文标题】如何在 Spring Webflux / WebClient 中设置事件循环池大小?【英文标题】:How to set event-loop pool size in Spring Webflux / WebClient? 【发布时间】:2018-07-14 09:31:29 【问题描述】:在Vert.X等multi-reactor框架中我们可以设置事件循环线程的数量,例如:
final VertxOptions vertxOptions = new VertxOptions();
vertxOptions.setEventLoopPoolSize(16);
final Vertx myVertx = Vertx.vertx(vertxOptions);
如何在 Spring Boot 2 WebFlux / WebClient 中进行等效操作?
【问题讨论】:
【参考方案1】:你有两个选择:
使用应用事件循环资源配置的定制器覆盖 ReactiveWebServerFactory
bean:
@Bean
public ReactiveWebServerFactory reactiveWebServerFactory()
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory();
factory.addServerCustomizers(builder -> builder.loopResources(LoopResources.create("my-http", 16, true)));
return factory;
或者使用-Dreactor.ipc.netty.workerCount=16
环境变量。默认情况下,它的值设置为Math.max(availableProcessors(), 4)
。
示例:java -jar your-app.jar -Dreactor.ipc.netty.workerCount=16
【讨论】:
reactor.ipc.netty.workerCount 在 application.properties 文件中不起作用。 @SaeedZarinfam 它不应该是环境变量,而不是属性。更新了更准确的答案。 我得到 builder.loopResources 没有定义。 如何验证设置是否正确应用?有没有简单的方法打印出workerCount的数量? 您好,只是想知道方法“resourceFactory()”的名称是否重要?我可以使用不同的名称来实现相同的目标吗?【参考方案2】:事件循环由 Spring 项目反应器实现,所有请求都由事件循环处理,内部使用响应式 Netty 处理 Web 请求。在 Boot 2.XX 使用 Reactor Netty 0.8 或更高版本时,等效的系统属性命名为 reactor.netty.ioWorkerCount。这被记录为“默认工作线程数”
你可以通过添加这个来定义事件循环池的大小
VM 参数-Dreactor.netty.ioWorkerCount=2
示例:java -jar your-app.jar -Dreactor.netty.ioWorkerCount=2
【讨论】:
以上是关于如何在 Spring Webflux / WebClient 中设置事件循环池大小?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?
如何在 Spring Boot WebFlux 中使用 GET 请求注销
如何使用WebFlux在Spring Boot 2中设置登录页面?