如何在 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中设置登录页面?

如何使用 Spring Boot 对 WebFlux 进行异常处理?

如何使用 spring webflux 读取请求正文

Spring 5 webflux如何在Webclient上设置超时