性能文章> 【译】SpringBoot如何构建一个可扩展高性能的响应式微服务?>

 【译】SpringBoot如何构建一个可扩展高性能的响应式微服务?转载

3周前
235176

 SpringBoot 2.0 WebFulx和Redis的碰撞

搭建这个响应式微服务的目的是为了解决现代软件系统的一大挑战——高用户量和高吞吐量带来的挑战。

所以预期就是高度响应性、弹性、弹性和消息驱动。

在本文中,我们将:

  • 使用 SpringBoot 2.0 WebFlux 和 Reactive Redis 构建完全非阻塞的 REST API系统。
  • 对上述响应式 API 矩阵进行性能测试,并和传统的非响应式 API 做对比!

本示例中使用的代码可以从  GitHub下载

第一步:创建一个 WebFlux SpringBoot 项目

使用 - https://start.spring.io 创建一个 SpringBoot maven 项目

添加以下依赖项:

  •  spring-boot-starter-web 
  •  spring-boot-starter-data-redis 
  •  spring-webflux 
  •  spring-boot-starter-data-redis-reactive 

参考pom.xml中的依赖

您可能还喜欢: 关于 Spring Boot [教程和文章] 的全部内容。

第二步:创建域对象

演示项目使用域对象 Customer 和 Account。一个客户可以有多个帐户。

创建两个域对象

创建两个域对象

第三步:使用 WebFlux 创建非阻塞响应式 REST API

创建一个 REST 控制器CustomerControllerRx以提供以下响应式无阻塞 API。

  • 添加/更新客户
  • findById 一个客户

代码片段使用 Mono,它是 Reactive 流 Publisher 接口的实现,以及 ReactiveRedisTemplate 和 ReactiveValueOperations 以非阻塞方式与 Redis 交互。

反应式 Redis 模板

反应式 Redis 模板

RedisConfigRx中配置  ReactiveRedisTemplate

第四步:创建同步(阻塞)REST API

创建一个 REST 控制器CustomerController以提供非响应式阻塞 API。我们正在使用CustomerRepository,它扩展了一个 CurdRepository 来与 Redis 数据库交互。

创建 REST 控制器

创建 REST 控制器

第五步:使用 Docker 连接到 Redis

  • Redis 不正式支持 Windows。但是,在 UNIX 或 Windows 上启动和运行 Redis 的最简单方法是使用 Docker。
  • 使用以下步骤从 docker hub 拉取 redis 映像并以分离模式在端口 6379 上启动。
$ docker pull redis $ docker run -d -p 6379:6379 --name redis1 redis $ docker ps -a // make sure redis is up and r

有关 Redis 连接属性,请参阅application.yml 

第六步:设置 JMeter 进行测试

以上插件为zip文件,可以解压到JMeter安装文件夹的lib文件夹中。安装插件后,可以从 bin 文件夹启动 JMeter。

下一步是为需要进行基准测试的 API 创建测试计划。我有以下API测试计划

GetCustomers.jmx

  • 对非响应式CustomerController进行性能测试:findById() method。
  • 获取映射

SaveCustomers.jmx

  • 对非响应式CustomerController进行性能测试:add() method。
  • 后映射

GetCustomersRx.jmx

  • 对响应式CustomerControllerRx 的性能测试:findById() method。
  • 获取映射

SaveCustomersRx.jmx

  • 对响应式CustomerControllerRx 的性能测试:add () method。
  • 后映射

上述测试计划可以在 JMeter 中打开并针对不同数量的并发用户进行配置——例如 5、50、100、400、500 等。现在,JMeter 测试用例可以在非 UI 模式下执行,如下所示。

jmeter -n -t <TestPLan.jmx> -l <TestPlan.jtl> -e -o <output folder>

其中:

              -n   在非 GUI 模式下运行

              -t   提供测试文件的名称

              -l   输出报告文件的名称

              -e  jMeter 遵循 jmx 文件中指定的后处理。

              -o  仪表板文件夹。

第七步:对响应式 REST API 与阻塞 REST API 进行基准测试

开始SpringRedisReactiveApplication 

  • 通过连接到 Docker 上的 Redis DB,确保应用程序启动时没有错误。
  • 为测试计划设置用户(线程)和循环(迭代)的数量。

使用 JMeter UI 打开 TestPlan 并更改用户(线程)数并设置循环数。保存测试计划。退出 JMeter 用户界面。

  • 执行测试计划

转到 JMeter\bin 文件夹并执行:

jmeter -n -t <path>\SaveCustomers.jmx -l <path>\SaveCustomers.jtl -e -o <path>\SaveCustomersOutput-5Users

上面的命令将运行SaveCustomers.jmx TestCases 创建一个名为 SaveCustomersOutput-5Users 的报告文件夹

  • 对其他测试计划重复步骤 6 (b) 和 6 (c),每次更改输出文件夹名称。
    • SaveCustomersRx.jmx
    • 获取客户.jmx
    • SaveCustomersRx
  • 对 10、50、100、200 和 400 个用户重复步骤 6 (b)、(c) 和 (d)。

性能指标

图片标题

图片标题

图片标题

图片标题

结果

并发用户数少

  • Blocking API 的性能非常好。
  • 当用户数增加时,性能会受到影响。

大量并发用户

  • 非阻塞异步 Spring WebFlux API 的性能要好得多。
  • 反应性组件的响应时间增加 30% 到 40%。
  • 当用户数量约为 300 时,达到阈值。

原文地址:https://dzone.com/articles/springboot-performance-war

原文作者:Santhosh Krishnan

点赞收藏
willberthos

keep foolish!

请先登录,查看7条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

从20s优化到500ms,我用了这三招

从20s优化到500ms,我用了这三招

【全网首发】一些可以显著提高 Java 启动速度方法

【全网首发】一些可以显著提高 Java 启动速度方法

【全网首发】Java 技术栈中间件优雅停机方案设计与实现全景图

【全网首发】Java 技术栈中间件优雅停机方案设计与实现全景图

这样优化Spring Boot,启动速度快到飞起!

这样优化Spring Boot,启动速度快到飞起!

Java 异步调用原理与实战

Java 异步调用原理与实战

【译】为什么我的数据库很慢,10 个查询反而比 1 个查询更快?

【译】为什么我的数据库很慢,10 个查询反而比 1 个查询更快?

6
7