我对性能测试的设置如下:

示例应用程序公开了一个端点(/ passthrough / message),该端点又调用下游服务。 到端点的请求消息如下所示:

{"id": "1","payload": "sample payload","delay": 3000
}

下游服务将基于消息中的“延迟”属性(以毫秒为单位)进行延迟。

Spring Boot 1应用程序

我已经将Spring Boot 1.5.8.RELEASE用于该应用程序的Boot 1版本。 端点是一个简单的Spring MVC控制器,它依次使用Spring的RestTemplate进行下游调用。 一切都是同步且阻塞的,我已使用默认的嵌入式Tomcat容器作为运行时。 这是下游调用的原始代码:

public MessageAck handlePassthrough(Message message) {ResponseEntity<MessageAck> responseEntity = this.restTemplate.postForEntity(targetHost + "/messages", message, MessageAck.class);return responseEntity.getBody();
}

Spring Boot 2应用程序

该应用程序的Spring Boot 2版本公开了一个基于Spring Webflux的终结点,并使用WebClient ,这是RestTemplate的新的非阻塞,反应性替代方法,可以进行下游调用–我也使用Kotlin进行了实现,这与性能无关。 运行时服务器为Netty :

import org.springframework.http.HttpHeaders
import org.springframework.http.MediaType
import org.springframework.web.reactive.function.BodyInserters.fromObject
import org.springframework.web.reactive.function.client.ClientResponse
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.reactive.function.client.bodyToMono
import org.springframework.web.reactive.function.server.ServerRequest
import org.springframework.web.reactive.function.server.ServerResponse
import org.springframework.web.reactive.function.server.bodyToMono
import reactor.core.publisher.Monoclass PassThroughHandler(private val webClient: WebClient) {fun handle(serverRequest: ServerRequest): Mono<ServerResponse> {val messageMono = serverRequest.bodyToMono<Message>()return messageMono.flatMap { message ->passThrough(message).flatMap { messageAck ->ServerResponse.ok().body(fromObject(messageAck))}}}fun passThrough(message: Message): Mono<MessageAck> {return webClient.post().uri("/messages").header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).body(fromObject<Message>(message)).exchange().flatMap { response: ClientResponse ->response.bodyToMono<MessageAck>()}}
}

性能测试的详细信息

测试很简单,对于不同组的并发用户(300、1000、1500、3000、5000),我发送了一个延迟属性设置为300 ms的消息,每个用户重复该场景30次,延迟为1-2请求之间的秒数。 我正在使用出色的加特林工具来生成此负载。

结果

这些是加特林捕获的结果:

300个并发用户:

开机1 开机2

1000个并发用户:

开机1 开机2

1500个并发用户:

开机1 开机2

3000个并发用户:

开机1 开机2

5000个并发用户:

开机1 开机2

可以预期的是,当并发用户数保持较低水平(例如,少于1000个)时,Spring Boot 1和Spring Boot 2都能很好地处理负载,并且95%的响应时间仍比预期的300 ms延迟高出几毫秒。

在更高的并发级别上,Spring Boot 2中的异步非阻塞IO和响应式支持开始显示其颜色-即使负载非常大的5000个用户,第95个百分位时间仍保持在312ms左右! 在这些并发级别上,Spring Boot 1记录了很多故障和高响应时间。

我在github回购中提供了所有示例和加载脚本– https://github.com/bijukunjummen/boot2-load-demo。

翻译自: https://www.javacodegeeks.com/2017/10/raw-performance-numbers-spring-boot-2-webflux-vs-spring-boot-1.html

原始性能数字– Spring Boot 2 Webflux与Spring Boot 1相关推荐

  1. Spring Boot WebFlux-02——WebFlux Web CRUD 实践

    Spring Boot WebFlux-02--WebFlux Web CRUD 实践 第02课:WebFlux Web CRUD 实践 上一篇基于功能性端点去创建一个简单服务,实现了 Hello.这 ...

  2. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

  3. Spring Boot 2 Webflux的全局异常处理

    Spring Boot 2 Webflux的全局异常处理 参考文章: (1)Spring Boot 2 Webflux的全局异常处理 (2)https://www.cnblogs.com/xiang- ...

  4. Spring Boot 2.0 with Spring 5 Kotlin support and Spring WebFlux functional

    Spring Boot 2.0 with Spring 5 Kotlin support and Spring WebFlux functional

  5. Spring Boot 集成 WebFlux 开发 Reactive Web 应用

    Spring Boot 集成 WebFlux 开发 Reactive Web 应用 <Spring Boot 实战开发>-- 基于 Gradle + Kotlin的企业级应用开发最佳实践 ...

  6. Spring Boot 实践折腾记(11):使用 Spring 5的WebFlux快速构建效响应式REST API

    关于Spring 5中的反应式编程支持Reactor类库,上一篇文章< Spring Boot 实践折腾记(10):2.0+版本中的反应式编程支持--Reactor>已经简要介绍过,Spr ...

  7. 新一代Spring Web框架WebFlux!

    Spring WebFlux 教程:如何构建反应式 Web 应用程序 反应式系统提供了我们在高数据流世界中所需的无与伦比的响应能力和可扩展性.然而,反应式系统需要经过专门培训的工具和开发人员来实现这些 ...

  8. Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例

    <p>这篇文章介绍如何使用 Jpa 和 Thymeleaf 做一个增删改查的示例.</p> 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭 ...

  9. Spring Data JPA例子[基于Spring Boot、Mysql]

    关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如 ...

最新文章

  1. initrd映像文档的作用和制作
  2. python 只取数值_快收藏!Python常用操作运算符,都在这了!(下)
  3. Python——制作深度学习数据集批量重命名图片文件名解决方案
  4. Linux + RIL.pdf
  5. html5-6 Frame框架窗口类型
  6. R语言任务视图:机器学习与统计学…
  7. debug=true开启自动配置报告
  8. 平院实训门禁系统导入
  9. 剑指offer面试题32 - III. 从上到下打印二叉树 III(二叉树)(BFS)
  10. [转载] python数字类型(一)
  11. 音视频处理入门基础知识(一)
  12. 又一名程序员猝死,送给996的程序员一份身体健康指南电子书!
  13. 正易判讀 6-4 韓長庚 著
  14. ERP现状及未来发展趋势分析?
  15. 持续集成之企业微信通知:5:在Jenkins中向企业微信推送消息
  16. XTU 1256 湘潭大学
  17. ADF单位根检验方法
  18. c++之gbk和utf8编码转换
  19. java国王毒酒答案,囚犯与毒酒问题
  20. 利用多时间无人机数据和时空深度学习模型的作物产量预测

热门文章

  1. 13、字符集和字符编码
  2. JavaFX键盘事件
  3. JavaFX鼠标拖拽事件
  4. 认识JVM--第一篇-对象分配&回收算法
  5. Vue.js 定义组件模板的七种方式
  6. java爬虫之基于httpclient的简单Demo(二)
  7. 阿里巴巴对Java编程【命名风格】的规约
  8. 【Servlet】获取并输出服务器获得的数据
  9. 整合MyBatis---SpringBoot
  10. python初学函数_Python初学者速收藏!面向Python初学者的知识-函数