【发布时间】:2021-12-11 19:41:12
【问题描述】:
假设我有一个带有 Spring Boot 的微服务,其 PersonsRestController 输入如下:
@GetMapping(value = "/world/{countryId}/persons", produces = APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<PersonSaverItem> getPublishPersonsByCountry(@PathVariable("countryId") Integer countryId,
@RequestParam(value = "state", required = false) PublishItemState state,
@RequestParam(value = "limit", defaultValue = "50", required = false) int limit,
@RequestParam(value = "offset", defaultValue = "0", required = false) int offset) {
PersonSaverList personSaverList = this.personSaverService.getPublishItemListBy(countryId, state, limit, offset);
return personSaverList.getpersonSaverList();
}
personSaverService.getPublishItemListBy(...) 的实现如下所示:
@Override
public PersonSaverList getPublishItemListBy(Integer countryId, PublishItemState state, int limit, int offset) {
try {
return this.personSaverRepository.getPublishItemsBycountryId(countryId, state, limit, offset);
} catch (Exception e) {
...
}
}
最后,存储库通过 Spring Jdbc 对数据库进行查询,在本例中为 Oracle db。
如何将此逻辑迁移到 Spring WebFlux?
我已尝试仅将返回的列表更改为控制器中的 Flux:
@GetMapping(value = "/world/{countryId}/persons", produces = APPLICATION_JSON_UTF8_VALUE)
public Flux<PersonSaverItem> getPublishPersonsByCountry(@PathVariable("countryId") Integer
countryId,
@RequestParam(value = "state", required = false) PublishItemState state,
@RequestParam(value = "limit", defaultValue = "50", required = false) int limit,
@RequestParam(value = "offset", defaultValue = "0", required = false) int offset) {
PersonSaverList personSaverList = this.personSaverService.getPublishItemListBy(countryId, state, limit, offset);
return Flux.fromIterable(personSaverList.getpersonSaverList());
}
但尝试 JMeter 模拟多个并发用户(线程)并没有看到任何改进。 我想还有更多工作要做。
提前致谢。
【问题讨论】:
-
您正在使用阻塞技术 JDBC,并将其包装在响应式中。那不会为您带来所有好处。此外,当将它与 Spring MVC 一起使用时(就像你一样),你只会得到异步部分而不是其他好处。最后可能没有任何性能优势(除非现在并行发生),而是使用更少的资源,从而允许在单个节点上进行更多的扩展。
标签: java spring-boot rest microservices spring-webflux