本系列其他文章见:《响应式Spring的道法术器》。
前情提要:Spring WebFlux快速上手 | Spring WebFlux性能测试
本文源码
1.4.2 调用带有延迟的服务负载分析
由于微服务架构的盛行,大型系统内服务间基于HTTP API进行调用的会相当频繁。Netflix的系统有500+的微服务,感受一下~
我们的测试如下图所示,服务A调用服务B的API,从服务A发出请求到接收到响应,期间可能存在延迟,比如网络不稳定、服务B不稳定,或因为所请求的API本身执行时间略长等等。对于作为HTTP客户端的服务A来说,是否能够异步地处理对服务B的请求与响应,也会带来明显的性能差异。我们通过简单的场景模拟一下:
通过上一个测试,我们已经确定WebFlux-with-latency
的API /hello/{latency}
能够在高并发下,仍然以稳定的latency
~latency+5
ms的延迟做出响应,因此用来作为被调用的服务B,模拟带有延迟的服务。这样如果测试结果出现明显的差异,那么可以排除服务B的原因。
本次测试我们创建两个服务A的项目:restTemplate-as-caller
和webClient-as-caller
。它们也都提供URL为/hello/{latency}
的API,在API的实现上都是通过Http请求服务A的/hello/{latency}
,返回的数据作为自己的响应。区别在于:restTemplate-as-caller
使用RestTemplate
作为Http客户端,webClient-as-caller
使用WebClient
作为Http客户端。
1)restTemplate-as-caller
使用Spring Initializr创建一个依赖“Web”的项目(也就是WebMVC项目),POM依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
端口号设置为8093,然后开发/hello/{latency}
:
HelloController.java
:
@RestController
public class HelloController {
private final String TARGET_HOST = "http://localhost:8092";
private RestTemplate restTemplate;
public HelloController() {
// 1
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(1000);
connectionManager.setMaxTotal(1000);
this.restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory<