我只是通过示例 PoC 项目在简单的常见场景中测试了一些阻塞/非阻塞解决方案。
设想:
- 有休息阻塞端点非常慢 - 每个请求需要 200 毫秒。
- 还有其他客户端应用程序,它调用这个慢端点。
我已经使用 WebFlux - WebClient、Ratpack 和 Lagom 测试了当前(阻塞)Spring Boot 客户端(tomcat)、Spring Boot 2.0(netty)。在每种情况下,我都通过加特林测试简单场景(100-1000 个用户/秒)来强调客户端应用程序。
我已经测试了 ratpack 和 lagom 作为参考非阻塞 io 服务器,以将结果与 spring boot(阻塞和非阻塞)进行比较。
在所有情况下,我都有预期的结果,除了 spring boot 2.0 测试。它仅适用于小负载水平,但即使如此,延迟也很高。如果负载水平上升 - 所有请求都超时。
WebClient 用法:
@RestController
public class NonBlockingClientController {
private WebClient client = WebClient.create("http://localhost:9000");
@GetMapping("/client")
public Mono<String> getData() {
return client.get()
.uri("/routing")
.accept(TEXT_PLAIN)
.exchange()
.then(response -> response.bodyToMono(String.class));
}
}
我不知道出了什么问题或当前的快照版本只是在起作用。
所有来源发布在https://github.com/rutkowskij/blocking-non-blocking-poc
- 阻塞服务 - 慢阻塞端点
- non-blocking-client - 基于 Spring Boot 2.0 和 WebClient 的客户端
我刚刚使用带有版本 2.0.0.BUILD-SNAPSHOT 的 spring-boot-starter-webflux 创建了一个简单的 Spring Boot 应用程序,它带来了 spring-webflux 版本 5.0.0.BUILD-SNAPSHOT 和 Spring Core、Beans、Context 等。