Spring Boot 3.2四个新特点提升运行性能

随着 Spring Framework 6.1 和 Spring Boot 3.2 普遍可用性的临近,我们想分享一下 Spring 团队为让开发人员优化其应用程序的运行时效率而做出的几项努力的概述。

我们将介绍以下技术和用例:

  • Spring MVC 将使用 基于JDK 21 虚拟线程 Web 堆栈
  • 使用 Spring 和 GraalVM Native Image 优化容器部署
  • JVM 检查点恢复:使用 Spring 和 Project CRaC 扩展到零
  • 通过 Spring AOT 和 Leyden 项目一睹 OpenJDK 的未来

1、Spring MVC 将使用 基于JDK 21 虚拟线程 Web 堆栈
虚拟线程(Virtual Threads)旨在降低以简单、流行的每请求线程方式编写的服务器应用程序的成本,以接近最佳的硬件利用率进行扩展。

虚拟线程降低了 I/O 阻塞的成本,因此非常适合 Servlet 栈上的 Spring Web MVC 应用程序。通过虚拟线程设置,Spring MVC 可以在 Tomcat 或 Jetty 等平台上充分利用这些新的运行时特性。在大多数用例中,这不需要修改代码,就能自然地提供最佳性能,而无需对线程池配置进行微调。

在 Spring Framework 6.1 中引入一个名为 RestClient 的 "虚拟线程友好型现代 HTTP 客户端"(Spring Cloud Gateway 和 Spring 产品组合中的相关基础架构同样可以从虚拟线程设置和 Spring MVC 中受益,从而提供一致的整体体验。

那么,这对 WebFlux 和反应堆栈意味着什么呢?
我们特意选择了不同的阻塞堆栈和反应堆栈,以充分利用 WebFlux 服务器中的反应优势,并尽可能精简 Spring Web MVC 堆栈(start.spring.io 上迄今为止最常用的 Web 堆栈)和常规阻塞线程架构。

  • Servlet 容器上的 Spring MVC 是虚拟线程的理想定位,是提高传统网络应用程序可扩展性的理想解决方案。
  • 另一方面,WebFlux 服务器提供了优化的反应式堆栈,非常适合 Netty I/O 设置,通过不同的编程模型提供同等的运行时优势。

当您需要应用级并发(例如,发送多个远程 HTTP 请求(可能是流式请求)并合并结果)时:

  • WebFlux 和 Reactor 等反应式 API 目前具有无可比拟的附加值,
  • Kotlin 的 Coroutines 及其 Flow 类型也具有无可比拟的附加值,它们提供了命令式和声明式编程模型的有趣组合。
  • RSocket 是反应式交互模型带来巨大附加值的另一个例子。

请注意, Spring MVC 也提供可选的反应式支持。

因此,如果您只需要在服务器应用程序中的几个用例中处理并发性问题,您可以简单地使用带有虚拟线程设置的 Spring MVC 堆栈,并在 Web 控制器中无缝地包含反应式 WebClient 交互,Spring MVC 会将反应式返回值调整为 Servlet 异步响应。

Spring MVC 中的这种反应式支持完全是可选的,只有在实际使用反应式端点时才需要在堆栈中使用 Reactor 和 Reactive Streams,而且 HTTP 堆栈要基于 Servlet 容器,如 Tomcat 或 Jetty(而不是 Netty)。

对于典型的网络Web场景,我们预计虚拟线程将成为 Spring MVC 的常见选择,成为 Java 21+ 的 Spring 开发人员的Web服务器栈。

请确保使用 Spring Boot 3.2 或更高版本,将属性 spring.threads.virtual.enable 设置为 true,并使用最新的库和驱动程序版本来评估虚拟线程。

2、使用 Spring 和 GraalVM 原生镜像优化容器部署
我们将继续完善 Spring Boot 3 中引入的 GraalVM 本机支持。主要用例是使用 Buildpacks 构建优化的容器映像,其中包含一个微小的操作系统基础层,以及通过 Spring AOT(Ahead Of Time)转换和 GraalVM 本地映像编译器编译为本地可执行文件的应用程序。无需分发 JVM。

这样就可以部署在几十毫秒内启动的小型容器(通常比普通 JVM 的启动时间快 50 倍),降低应用基础架构的内存消耗,并立即实现峰值性能。

GraalVM 紧跟 Java 的新特性,例如已经提供了一流的虚拟线程支持:请参阅 Josh Long 最近发表的博文《 All together now》。

与 JVM 相比,GraalVM 的出色运行特性得益于不同的权衡取舍。本地镜像编译需要几分钟而不是几秒钟。它需要额外的元数据才能正确处理反射、代理和 JVM 的其他动态行为。Spring 会推断出很多此类元数据,但任何实际项目都可能需要一些额外的提示才能正常运行(例如,对于组织依赖关系)。最后,Spring AOT 转换和 GraalVM 原生镜像的结合要求我们在构建时冻结类路径和 Spring Boot Bean 条件。您通常可以在运行时配置中更改数据库的 URL 或密码,但不能更改数据库类型或更改 Spring Bean 的结构。

从历史上看,另一个缺点是由于缺乏即时编译而导致峰值性能有限。

有了即时启动和立即可用的峰值性能,Spring Boot 本机应用程序就能实现零扩展。

缩放为零
缩放为零是对无服务器的一种概括。工作负载不仅可以部署到无服务器云平台,还可以部署到任何提供在没有请求要处理时向零扩展能力的 Kubernetes 或云平台。通过 Kubernetes,您可以使用 Knative 或 KEDA 等解决方案来实现零扩展。

而且,你并不局限于函数,你可以将任何类型的应用程序、任何类型的编程模型(包括传统的网络应用程序)扩展到零。无服务器最重要的特点不在于技术,而在于它所实现的 "即用即付 "计费模式。

在各种用例中,扩展到零可能会很有趣。JVM 在开发大流量网站方面表现出色,但老实说,我们也开发了许多小型后台应用程序,这些应用程序通常不会一直使用。既然没人使用,我们为什么还要付费呢?还有一些暂存环境,它们通常只需要运行一小部分时间,还有一些微服务,缓存允许在大部分时间关闭其中的几个。还有高可用性,它迫使我们为每个服务维护两个实例,以备不时之需,因为我们的应用程序启动时间太长,无法从危险中恢复。

但是,对于那些无法接受 GraalVM 原生镜像所要求的权衡的项目来说,如何将其扩展为零呢?

3、JVM 检查点恢复:利用 Spring 和 CRaC 项目实现零扩展
CRaC 是一个 OpenJDK 项目,它定义了一个新的 Java API,允许您在 HotSpot JVM 上检查点和还原应用程序,该项目由 Azul Systems 开发,同时也得到 AWS Lambda 和 IBM OpenLiberty 的支持。它基于在 Linux 上实现检查点/还原功能的 CRIU 项目。

其原理如下:您几乎像往常一样启动应用程序,但使用的是启用了 CRaC 的 JDK 版本。然后在某个时间点,可能是在执行了所有常用代码路径而导致 JVM 发热的某些工作负载之后,使用 API 调用、jcmd 命令、HTTP 端点或其他机制触发检查点。

然后,运行中的 JVM 的内存表示(包括其热度)会被序列化到磁盘上,这样就可以在稍后的时间点(可能是在具有类似操作系统和 CPU 架构的另一台机器上)快速恢复。恢复后的进程保留了 HotSpot JVM 的所有功能,包括运行时的进一步 JIT 优化。

有趣的是,"检查点 "和 "恢复 "与 Spring 应用上下文生命周期的停止和启动阶段非常匹配。

Spring Framework 6.1 的 CRaC 支持主要是将 CRaC 和 Spring 生命周期映射到一起,其他支持与 CRaC 无关,主要是对 Spring 生命周期的完善,旨在正确关闭和重新创建套接字、文件和池。除了常规的启动和停止生命周期外,这里的目标是支持多个停止和重启周期。

与 GraalVM 一样,Project CRaC 允许应用程序从零扩展到零,即使在小型服务器上也能在几十毫秒内瞬间启动。这比普通 JVM 冷启动快 50 倍,与 GraalVM 本机镜像类似。但是,让我们来探讨一下其中的利弊得失。

请记住,我们正处于 CRaC 项目的早期阶段,Spring Boot 3.2 是支持 CRaC 的第一个版本。随着检查点还原技术和 Spring 支持的发展,其中一些限制可能会被取消。

4、通过 Spring AOT 和 Project Leyden 一窥 OpenJDK 的未来
我们已经看到了通过 GraalVM 和 CRaC 将 Spring 工作负载扩展到零的两种方法,但其中涉及到不小的权衡。如果有另一种方法可以在减少限制的情况下提高 Spring Boot 运行时特性,那会怎样呢?

您可能听说过 Project Leyden,这是一个新的 OpenJDK 项目,旨在改善 Java 程序的启动时间、达到峰值性能的时间和占用空间。

Project Leyden 最近引入了 "premain "优化(基本上是类数据共享 + AOT 的类固醇),有趣的是,Java Platform 团队发现了 Spring Ahead-Of-Time 优化的巨大协同作用,Spring Ahead-Of-Time 优化最初是为了支持 GraalVM 原生镜像而创建的,但已经能够将 JVM 的启动时间缩短 15%。

虽然 "premain "优化是高度实验性的(目前它只是 GitHub 上 Leyden 代码库的一个实验性分支),但 Spring 团队最近通过结合 JVM 上的 Spring AOT 和项目 Leyden 中的这些优化,已经测得 Spring Petclinic 示例应用程序的启动时间缩短了 2 到 4 倍,预热速度也加快了,而且几乎没有任何取舍。

与 GraalVM 和 CRaC 不同的是,这些优化措施目前还无法实现零扩展,因为它们无法让应用程序在生产中以几十毫秒的速度启动。但是,如果我们能在几乎不受任何限制的情况下显著改善 JVM 的启动和预热时间,那么它就有可能成为主流。

来自:https://www.jdon.com/69141.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix“专家坐诊”第207期问答汇总

问题一 Q:不小心把host表删除了,怎么处理?现在使用的zabbix 4.0.3的server,agent是4.2.1,能不能不动agent的情况下升级server版本,重新部署? A:数据库有备份话恢复即可,…

SSTI模板注入(flask) 学习总结

文章目录 Flask-jinja2 SSTI 一般利用姿势SSTI 中常用的魔术方法内建函数 利用 SSTI 读取文件Python 2Python 3 利用 SSTI 执行命令寻找内建函数 eval 执行命令寻找 os 模块执行命令寻找 popen 函数执行命令寻找 importlib 类执行命令寻找 linecache 函数执行命令寻找 subproce…

华为FAT模式无线AP配置实例

硬件:AP3010DN 软件版本:VRP software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) [Huawei]dis ver Huawei Versatile Routing Platform Software VRP (R) software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) Copyright (C) 2011…

windows中elasticsearch7中添加用户名密码验证

1.找到elsatic的bin目录输入cmd 2.生成ca证书 输入 elasticsearch-certutil ca 在es7根目录生成ca证书,输入密码时直接回车即可,否则后面会报错 Please enter the desired output file [elastic-stack-ca.p12]: #这里直接回车即可 Enter password for…

JAVA学习日记1——JAVA简介及第一个java程序

简单记忆 JAVA SE :标准版,核心基础 JAVA EE:企业版,进阶 JDK:Java Development Kit,Java开发工具包,包含JRE JRE:Java Runtime Environment,Java运行时环境&#xff…

flutter 消息并发时处理,递归查询

收到新消息的时候执行receiveNewConversation方法 可以自己模拟一下两条数据插入,延时执行插入会话的操作 收到一条新的会话消息,先记录会话ID到列表,直到第一条处理完(插入数据库后清理这个会话ID),才处理…

mybatis generator 表名多了个点

csdn有一个,要收费,研究后原因如下,是 mysql不支持 SQL catalogs and schema, 解决方式就是去掉 这两个字段,同时在jdbcConnection中设置nullCatalogMeansCurrent属性为true。 手册如下 MySql does not properly supp…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (2)

上一篇文章中: 手撕ch7/pose_estimation_3d2d(1),我们调用了epnp的方法进行位姿估计,这里我们使用非线性优化的方法来求解位姿,使用g2o进行BA优化 首先介绍g2o:可参考:g2o详细介绍 1.构建g2o图…

MLE<=> KL

MLE等价于KL散度 最大似然估计 (MLE) 和Kullback-Leibler散度 (KL散度) 之间有深厚的联系。我将先介绍两者之间的联系,然后通过一个例子进行说明。 首先,回忆一下两者的定义: 最大似然估计: θ ^ arg ⁡ max ⁡ θ L ( θ ∣ X ) \hat{\theta}\arg \m…

加权平均、EMD、小波等方法去噪效果对比

加权平均、EMD、小波等方法去噪效果对比 代码 整体代码如下 %% clear all; clc;load(data_filter120Hz.mat); %可自己生成随机噪声 fs1000;%采样频率是1000Hz %% %生成正弦波信号 tlinspace(0, length(data)/fs-1/fs, length(data)); y1 15*sin(2*pi* 2.8 *t);%生成频率为2.…

Android之使用QBadgeView给TabLayout顶部栏设置数量角标,数值可更新

TabLayout搭配ViewPager、Fragement使用可看另一篇文章&#xff1a; Android中TabLayoutViewPagerFragment实现顶部导航栏 本文主要描述给TabLayout的某一栏添加角标&#xff0c;数值可更新&#xff1a; 一、效果 二、TabLayout使用 1、xml文件中 <com.google.android.m…

通讯协议学习之路:QSPI协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 一、…

【Django 01】环境搭配与项目配置

1. 介绍 https://github.com/Joe-2002/sweettalk-django4.2#readme Django 是一个使用 Python 编写的开源 Web 应用程序框架&#xff0c;它提供了一套用于快速开发安全、 可扩展和高效的 Web 应用程序的工具和功能。Django 基于 MVC&#xff08;Model-View-Controller&#xf…

Windows11家庭版没有本地组策略编辑器解决

1. 新建一个文本文件将下面代码粘到里面&#xff0c;保存后修改后缀为.cmd或者.bat echo off pushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt dir /b C:\Windows\servicing\Packa…

redis(普通连接和连接池、字符串类型、hash类型、列表类型)

1 redis普通连接和连接池 1.1 普通连接 1.2 连接池 2 redis字符串类型 3 redis hash类型 4 redis列表类型 1 redis普通连接和连接池 #1 python 代码作为客户端---》连接# 2 安装模块&#xff1a;pip install redis1.1 普通连接 from redis import Redisconn Redis(host&qu…

Selenium浏览器自动化怎么上传文件

Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展&#xff0c;文件上传的方式越来越多样。而有一些文件上传的控件&#xff0c;要做自动化控制会更复杂一些&#xff0c;这篇文章主要讨论在复杂情况下&#xff0c;如何通过自动化完成文件上传。 1. input 元素上传…

蓝桥杯每日一题2023.10.17

迷宫 - 蓝桥云课 (lanqiao.cn) 题目描述 样例&#xff1a; 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 0100000000101010001101000010100000101010101100…

Ubuntu18中的连接网络图标恢复

上图的图标不存在&#xff0c;也连不上网。 输入命令停止网络管理 service NetworkManager stop删除网络管理缓存文件 sudo rm /var/lib/NetworkManager/NetworkManager.state重启网络管理 service NetworkManager start修改网络管理文件 将‘managedfalse’修改为‘man…

性能测试-JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

[常用组件]文本省略 + Tooltip提示

[常用组件]文本省略 Tooltip提示 很常用就对了 单行省略 .text {width: 100px;text-overflow: ellipsis;overflow: hidden;word-break: break-all;white-space: nowrap; }多行省略 .text{width: 100px;display: -webkit-box;overflow: hidden;text-overflow: ellipsis;-we…