来源:medium.com/@egorponomarev
spring boot 3.2 前几日发布,让我们用 java 21、graalvm 和虚拟线程来尝试一下。
spring boot 3.2 支持:
java 21
虚拟线程
原生镜像(自 2022 年 11 月 spring boot 3.0 发布以来,spring boot 已在生产环境中支持 graalvm 原生镜像)
java 21
我们期待 2023 年 9 月 19 日发布的 java 21,spring boot 3.2 已经做到完全支持了。
正如所声明的那样,java 21 提供了数千项性能、稳定性和安全性改进,包括平台增强功能,可帮助开发人员提高生产力并推动整个组织的创新和增长。
虚拟线程
更重要的更新之一是虚拟线程,这是 project loom 提供的功能。我们不打算深入细节,官方 jep 提供了很好的解释:
graalvm 和本机镜像
graalvm 是一种高性能 jdk,可以使用替代的即时 (jit) 编译器来加快 java 和基于 jvm 的应用程序的性能。
native image 是一种提前将 java 代码编译为独立可执行文件(称为本机映像)的技术。该可执行文件包括应用程序类、其依赖项中的类、运行时库类以及来自 jdk 的静态链接本机代码。
它不在 java vm 上运行,但包含来自不同运行时系统的必要组件,如内存管理、线程调度等。与 jvm 相比,生成的程序具有更快的启动时间和更低的运行时内存开销。
尝鲜一下
让我们从安装 java 21.0.1 graal 开始,最简单的方法是使用sdkman 并将其指定为您机器的默认 java 版本:
sdk install java 21.0.1-graal
sdk default java 21.0.1-graal
另一种安装方法是手动下载
我们将使用spring initializr页面创建一个新的spring boot项目,使用 spring boot 3.2.0、java 21、gradle-groovy以及spring web和graalvm本地支持依赖项。
要在 spring boot 3.2 中启用虚拟线程,我们只需在 application.yml 或 application.properties 文件中设置一个属性:
spring.threads.virtual.enabled:true
这个配置起到的作用:
tomcat 将使用虚拟线程来处理 http 请求。这意味着处理 web 请求的应用程序代码(例如控制器中的方法)将在虚拟线程上运行。
调用@async方法时,spring mvc 的异步请求处理和 spring webflux 的阻塞执行支持现在将利用虚拟线程
标记有@scheduled的方法将在虚拟线程上运行
因此,我们将尝试使用这 3 个集成来实现虚拟线程。
此外,一些特定的集成将在虚拟线程上工作,例如 rabbitmq/kafka 监听器,以及 spring data redis/apache pulsar 相关的集成。但这些集成超出了本文的范围,有兴趣的可以参考 spring boot 3.2 官方示例。
代码
1.对于 tomcat 传入的 http 请求,我们创建一个简单的控制器:
@restcontroller@requestmapping(/test)public class testcontroller { private static final logger log = loggerfactory.getlogger(testcontroller.class); @getmapping public void test() { log.info(rest controller method has been called {}, thread.currentthread()); }}
2.异步任务
我们将在应用程序启动时调用其“run”方法
@componentpublic class asynctaskexecutorservice { private static final logger log = loggerfactory.getlogger(asynctaskexecutorservice.class); @async public void run() { log.info(async task method has been called {}, thread.currentthread()); }}
3.scheduled 定时任务
一个简单的方法,每 15 秒调用一次
@componentpublic class schedulerservice { private static final logger log = loggerfactory.getlogger(schedulerservice.class); @scheduled(fixeddelaystring = 15000) public void run() { log.info(scheduled method has been called {}, thread.currentthread()); }}
让我们运行我们的应用程序:
./gradlew bootrun
并调用我们的端点
curl — 位置 — 请求 get 'localhost:8085/test'
我们得到什么:
starting appapplication using java 21.0.1 with pid 38126started appapplication in 1.131 seconds (process running for 1.491)async task method has been called virtualthread[#52,task-1]/runnable@forkjoinpool-1-worker-5scheduled method has been called virtualthread[#46,scheduling-1]/runnable@forkjoinpool-1-worker-1rest controller method has been called virtualthread[#62,tomcat-handler-0]/runnable@forkjoinpool-1-worker-1scheduled method has been called virtualthread[#46,scheduling-1]/runnable@forkjoinpool-1-worker-1
我们可以看到我们的方法的日志链接到公共 forkjoinpool 线程池。
根据jep:预期行为:
jdk 的虚拟线程调度程序是一个工作窃取的 forkjoinpool,它以 fifo 模式运行。调度程序的并行度是可用于调度虚拟线程的平台线程的数量。
现在让我们在 graalvm 上运行它。
首先,我们需要构建一个 graalvm 本机映像:(此命令可能需要几分钟)然后运行:(使用您的应用程序的名称而不是“app”)
./gradlew nativecompile./build/native/nativecomplie/app
它也可以工作,并且启动时间要快得多,这符合声明的“与 jvm 相比,生成的程序具有更快的启动时间和更低的运行时内存开销”。
在这里您可以找到包含本文中使用的代码的存储库来源
结论
spring boot 3.2 是我们一直在等待的东西!具有虚拟线程的本机映像允许我们编写能够提供与 go 类似级别的性能和可扩展性的代码,从而保持 jvm 的强大生态系统。
但是,您必须考虑到并非所有库都已采用其代码来与虚拟线程正常工作(在大多数情况下,它正在用 reentrantlock 替换“synchronize”块),您应该小心虚拟线程将使用的逻辑。
英飞凌推出REAL3 ToF图像传感器
国内高管公布O-RAN产品路线图
三大芯片巨头角逐2nm技术
印度加密货币判决背后是怎样的
硬件编解码IP准备就绪,H.266时代即将到来
Spring Boot 3.2支持虚拟线程和原生镜像
小米有品故宫电子香薰机高清图集
德国鸡尾酒吧Sausalitos推出了一个加密货币忠诚奖励计划
飞思卡尔推出三款用于汽车安全的Power Architect
5G时代下远程医疗已成为现实
你担心身边的辐射吗
可见光照度传感器的产品特性
了解黑客如何利用机器学习来识别目标系统中的漏洞
联想Z5ProGT855版体验评测 值不值得入手
防雷器在电源系统中的应用
基于RTOS的RZ/A3UL HMI SMARC模块化解决方案
CO2法规促进汽车电子行业创新设计
LoRa无线通信模块在运动安全上的物联网运用
光纤传输的特点优势及在小区智能化系统中的应用
大联大世平集团推出基于NXP产品的精度达厘米级的汽车数字钥匙方案