我是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(“”);
}
}
}
答案 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。
为什么要在每个并行请求上打开不同的线程?