覆盖Spring Webflux项目的默认Threadpool执行程序的效果如何?

时间:2019-05-16 21:38:06

标签: spring-webflux

我是Spring-Webflux的新手。

我正在2核处理器中运行以下示例项目。我的RESTful API将调用一个外部api,并且外部api响应小于500ms。

当我使用jMeter进行负载测试时,不能达到15 TPS以上。

我在以下设计中是否缺少任何东西?

在Webflux项目中覆盖默认的Threadpool执行程序有多有效?

谢谢。

Controller.java
----------------

LookupController
{

@Autowired
私有LookupService lookupService;
@PostMapping(value =“ / findOrder”)
    公共Mono> findOrder(@RequestBody InputBean inputBean){

返回lookupService.findOrder(inputBean)
                    .map(resp-> ResponseEntity.ok(resp))
                    .defaultIfEmpty(ResponseEntity.notFound()。build());
    }
}

服务
---------

@服务
公共类LookupService
{
私人RestWorker restWorker;
公共Mono findOrder(InputBean inputBean)
{
..//基本验证
ApiBean apiBean = restWorker.buildApiBean(inputBean);
单声道responseStr = restWorker.callApi(apiBean);
返回responseStr.flatMap(resp-> {
//业务逻辑
//处理api响应并创建相应的Controller响应
返回Mono.just(controllerResponse);
});
}

}

助手
---------

@Component
公共RestWorker {

private Webclient webClient = null;

@PostConstruct
    私有无效initWorker(){
           webClient = WebClient.builder()
                .baseUrl(httpUrl)
                .defaultHeader(HttpHeaders.CONTENT_TYPE,“ application / json”)
                .defaultHeader(HttpHeaders.ACCEPT,“ application / json”)
                .defaultHeader(HttpHeaders.ACCEPT_CHARSET,“ UTF-8”)
                .build();
    }

公共ApiBean buildApiBean(InputBean inputBean){
  //根据输入的Bean和配置值创建ApiBean
  ....
  返回apiBean;
}

公共Mono callApi(ApiBean apiBean){
单声道响应MonoStr = null;
尝试{
        responseMonoStr = webClient.post()
         .uri(url_tibco)

         .body(BodyInserters.fromObject(reqDoc))

         .exchange()

         .timeout(Duration.ofMillis(socketReadTimeout))
         .flatMap(clientResponse-> {

             System.out.println(Thread.currentThread()。getName()+“状态              代码:“ + clientResponse.statusCode());
             返回clientResponse.bodyToMono(String.class);

           });
} catch(异常异常){
返回Mono.just(“”);
}

}

}

2 个答案:

答案 0 :(得分:0)

不是,因为Spring WebFlux没有使用Threadpool执行程序来调度Web请求。而是使用其他服务器资源,例如事件循环(用于Netty)。有关更多信息,您可以检查the Spring Boot reference documentation on reactive server resources,更重要的是了解the concurrency model in Spring WebFlux

答案 1 :(得分:0)

Brian Clozel,

非常感谢。非阻塞api基于事件循环且线程数少。但是,在发送一些并行请求时,它会打开2个不同的线程,例如react-http-nio-2,reactor-http-nio-3。

为什么要在每个并行请求上打开不同的线程?