(7)Spring WebClient与RestTemplate性能对比——响应式Spring的道法术器

本系列其他文章见:《响应式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-callerwebClient-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<
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值