本系列其他文章见:《响应式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+5ms的延迟做出响应,因此用来作为被调用的服务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(
HttpC
WebClient vs RestTemplate

最低0.47元/天 解锁文章
896

被折叠的 条评论
为什么被折叠?



