0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Spring Boot 3.2虚拟线程搭建静态文件服务器

OSC开源社区 来源:程序猿DD 2024-01-09 09:34 次阅读

Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能,包括:

虚拟线程:利用 Project Loom 的虚拟线程释放可扩展性,从而减少资源消耗并增强并发性。

Native Image支持:通过Native Image编译制作速度极快的应用程序,减少启动时间并优化资源利用率。

JVM 检查点:利用 CRaC 项目的 JVM 检查点机制实现应用程序的快速重启,无需冗长的重新初始化。

RestClient:采用新的 RestClient 接口的功能方法,简化 HTTP 交互并简化代码。

Spring for Apache Pulsar:利用 Apache Pulsar 的强大功能实现强大的消息传递功能,无缝集成到您的 Spring Boot 应用程序中。

其中,虚拟线程是最近 Java 版本中引入的最具变革性的特性之一。正如官方文件所述:虚拟线程是轻量级线程,可减少编写、维护和调试高吞吐量并发应用程序的工作量。线程是可以调度的最小处理单元。它与其他此类单位同时运行,并且在很大程度上独立于其他此类单元运行。它是 java.lang.Thread 的一个实例。有两种线程:平台线程和虚拟线程。平台线程是作为操作系统 (OS) 线程的瘦包装器实现的。平台线程在其底层操作系统线程上运行 Java 代码,平台线程在平台线程的整个生命周期内捕获其操作系统线程。因此,可用平台线程数限制为操作系统线程数。与平台线程一样,虚拟线程也是 java.lang.Thread 的实例。但是,虚拟线程不绑定到特定的操作系统线程。虚拟线程仍在操作系统线程上运行代码。但是,当在虚拟线程中运行的代码调用阻塞 I/O 操作时,Java 运行时会挂起虚拟线程,直到它可以恢复为止。与挂起的虚拟线程关联的操作系统线程现在可以自由地对其他虚拟线程执行操作。虚拟线程适用于运行大部分时间被阻塞的任务,通常等待 I/O 操作完成。但是,它们不适用于长时间运行的 CPU 密集型操作。

虽然人们普遍认为虚拟线程在 I/O 密集型方案中表现出色,但它们在 CPU 密集型任务中的性能仍然是一个问号。本系列文章深入探讨了虚拟线程在各种用例中的潜在优势,从基本的“hello world”到静态文件服务(I/O 密集型)、QR 码生成(CPU 密集型)和多部分/表单数据处理(混合工作负载)等实际应用。

在本系列的开头文章中,我们已经了解了虚拟线程与物理线程相比在最简单(且不切实际)的 hello world 情况下的性能。物理线程和虚拟线程之间几乎没有任何性能或资源使用差异。在本文中,我们将更加“实用”,并针对静态文件服务器情况进行比较。这绝对是一个常见且“真实世界”的案例。让我们看看这次我们发现了什么。

测试环境

所有测试均在配备 16G RAM、8 个物理内核和 4 个效率内核的 MacBook Pro M2 上执行。测试工具是 Bombardier,它是更快的 HTTP 负载测试器之一(用 Go 编写)。

软件版本为:

Java v21.0.1

Spring Boot 3.2.1

程序配置

除了主 Java 类之外,不需要编写任何 Java 文件,静态文件服务器只能通过配置就能发挥作用。

application.properties文件如下:

server.port=3000
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=file:/Users/mayankc/Work/source/perfComparisons/static/

使用虚拟线程时,我们将通过添加以下行来启用它们:

spring.threads.virtual.enabled=true

pom.xml内容:


org.springframework.boot
spring-boot-starter-parent
3.2.1


com.example
demo
0.0.1-SNAPSHOT
demo
DemoprojectforSpringBoot

21



org.springframework.boot
spring-boot-starter-web



org.springframework.boot
spring-boot-starter-test
test


测试数据

大小完全相同但数据不同的 100K 文件被放置在静态资源目录中。每个文件大小正好是 102400 字节。

文件的命名范围为 1 到 100000。

使用 Bombardier 的修改版本,为每次运行生成随机请求 URL: http://localhost:3000/static/

应用场景

为了确保结果一致,每个测试在开始数据收集之前都会经历 5K 请求预热阶段。

然后,在不同范围的并发连接级别(50、100 和 300)中仔细记录测量结果,每个级别都承受 500 万个请求工作负载。

结果评估

除了简单地跟踪原始速度之外,我们还将采用详细的指标框架来捕获延迟分布(最小值、百分位数、最大值)和吞吐量(每秒请求数)。

CPU 和内存的资源使用情况监控将补充此分析,从而提供不同工作负载下系统性能的全面了解。

测试结果

结果以图表形式呈现如下:

06224228-ae1a-11ee-8b88-92fbcf53809c.png062f5292-ae1a-11ee-8b88-92fbcf53809c.png06390eb8-ae1a-11ee-8b88-92fbcf53809c.png06437376-ae1a-11ee-8b88-92fbcf53809c.png0647384e-ae1a-11ee-8b88-92fbcf53809c.png0653c172-ae1a-11ee-8b88-92fbcf53809c.png065b428a-ae1a-11ee-8b88-92fbcf53809c.png06666d90-ae1a-11ee-8b88-92fbcf53809c.png066b9356-ae1a-11ee-8b88-92fbcf53809c.png066fde52-ae1a-11ee-8b88-92fbcf53809c.png

总结

对静态文件服务的分析表明,物理线程在性能和资源效率方面略胜一筹(与我们的预期相反)。

不过,这种受 I/O 限制的场景可能并不是充分发挥虚拟线程潜力的理想场所。涉及数据库交互的任务可能会显示出更多令人信服的优势。也许负载不足以让虚拟线程发挥出最大的作用。为了找出答案,我们将在接下来的文章中介绍 URL短链(数据库驱动)、二维码生成(CPU受限)和混合工作负载场景(如表单数据处理),旨在揭示虚拟线程真正出类拔萃的案例。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8284

    浏览量

    83128
  • JAVA
    +关注

    关注

    19

    文章

    2910

    浏览量

    103228
  • 线程
    +关注

    关注

    0

    文章

    495

    浏览量

    19530
  • SpringBoot
    +关注

    关注

    0

    文章

    172

    浏览量

    117

原文标题:用Spring Boot 3.2虚拟线程搭建静态文件服务器有多快?

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Spring Boot虚拟线程和Webflux性能对比

    早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。
    发表于 09-24 14:54 383次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>虚拟</b><b class='flag-5'>线程</b>和Webflux性能对比

    如何让FTP文件服务器支持.7z文件

    如何让FTP文件服务器支持.7z文件此软件压缩的压缩比要比普通ZIP文件高30-50%。因此,它可以把经WinZip压缩的文件再压缩2-10%。文件
    发表于 04-21 23:41

    启动Spring Boot项目应用的三种方法

    基础。我们知道了Spring Boot是个什么了,那么我们又该如何启动Spring Boot应用呢?这里小编给大家推荐常用的三种方法。分别是IDEA编辑
    发表于 01-14 17:33

    如何配置嵌入式服务器

    嵌入式Web服务器每个Spring Boot Web应用程序都包含一个嵌入式Web服务器。此功能会导致许多操作方法问题,包括如何更改嵌入式服务器
    发表于 10-27 08:35

    Spring Boot使用Tomcat作为默认的嵌入式服务器

    默认情况下,Spring Boot使用Tomcat作为默认的嵌入式服务器,将其更改为Jetty,只需排除Tomcat并包含如下的Jetty即可:1. spring-boot-start
    发表于 12-15 08:59

    为什么要使用嵌入式服务器?

    嵌入式服务器就是我们的可执行单元包含服务器的二进制文件(例如,tomcat.jar)。例如,对于一个 Spring Boot 应用程序来说,
    发表于 12-27 06:38

    【飞腾派4G版免费试用】Spring Boot和飞腾派融合构建的农业物联网系统-环境搭建

    ntpdate-u 120.25.108.11) 7.安装MySQL服务器(sudo apt install mysql -server) 遇到问题: 1测试中板子TF卡处发热较为严重。 下期更新: Spring Boot
    发表于 12-11 15:00

    学习Spring Boot 嵌入式服务器

    嵌入式Web服务器每个Spring Boot Web应用程序都包含一个嵌入式Web服务器。此功能会导致许多操作方法问题,包括如何更改嵌入式服务器
    发表于 10-20 15:36 7次下载
    学习<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 嵌入式<b class='flag-5'>服务器</b>

    网站搭建时该如何选择租用服务器

    搭建网站的时候是必须要用到服务器服务器分很多种,有用来开发游戏叫游戏服务器,用来存放数据叫数据库服务器,有应用
    发表于 03-14 09:44 817次阅读

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot
    的头像 发表于 09-29 10:24 679次阅读

    用这4招 优雅的实现Spring Boot异步线程间数据传递

    Spring Boot 自定义线程池实现异步开发相信看过陈某的文章都了解,但是在实际开发中需要在父子线程之间传递一些数据,比如用户信息,链路信息等等
    的头像 发表于 01-30 10:40 839次阅读

    JServer:用json文件做数据存储的零代码API测试服务器

    Rust 编写的 json 接口和静态文件服务器
    的头像 发表于 07-19 16:31 608次阅读
    JServer:用json<b class='flag-5'>文件</b>做数据存储的零代码API测试<b class='flag-5'>服务器</b>

    Spring Boot的启动原理

    spring-boot-maven-plugin 的 maven 项目打包插件,可以方便的将 Spring Boot 项目打成 jar 包。这样我们就不再需要部署 Tomcat 、Jetty等之类的 Web
    的头像 发表于 10-13 11:44 435次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring布能用来搭建基础架构吗

    Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它利用 Spring 框架的强大功能,使得基础架构的搭建变得更加简
    的头像 发表于 11-16 10:56 245次阅读

    Spring Boot 3.2支持虚拟线程和原生镜像

    Spring Boot 3.2 前几日发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试一下。
    的头像 发表于 11-30 16:22 411次阅读