Spring Boot 3.2虚拟线程和CRAC详解

 Spring Framework 6.1.0和Spring Boot 3.2.0已经相继发布,亮点是:从高性能应用程序的角度出发,推出了对两项非常重要的创新的支持:虚拟线程(Virtual Threads)和 CRAC 项目。

虚拟线程
Spring 支持虚拟线程是有条件的,取决于两个因素:

  • 使用 JDK 21 运行应用程序和

  • 激活 spring.threads.virtual.enabled 配置选项。

目前,Spring Boot 中的 Tomcat 和 Jetty 服务器都使用虚拟线程处理查询。这意味着应用代码(如管理网络请求的控制器方法)将在虚拟线程上运行,从而可能提高应用性能。

将虚拟线程纳入 Spring 还带来了一些额外的变化:

Spring 创建了 VirtualThreadTaskExecutor,当激活虚拟线程时,SimpleAsyncTaskExecutor 和 SimpleAsyncTaskScheduler 都会默认使用虚拟线程。

这一变更有很多副作用,包括:

  • @EnableAsync 方法的行为变更、

  • Spring MVC 中的异步请求处理以及

  • Spring WebFlux 中对阻塞执行的支持。

它还会影响单个集成的性能,如 RabbitMQ 或 Kafka、Spring Data Redis 和 Apache Pulsar的监听器。

如果能有更细粒度的选项来决定我们真正想要使用虚拟线程的地方--这将简化大型项目的迁移。也许在未来的版本中会有。

到目前为止,Spring 本身还没有详细分析虚拟线程对Web应用程序的影响。不过,我建议大家看看 Spring 的竞争对手 Quarkus 的优秀系列文章,他们已经对这个问题进行了相当深入的研究。其影响和最佳实践应该不相上下。

CRAC 项目
在介绍第二个重要主题,即 CRaC 项目之前,有必要先解释一下被称为冷启动问题的问题。

您可能已经知道,Java 应用程序在开始以高性能方式处理流量之前通常需要一定的预热时间。这是传统服务器应用程序和无服务器应用程序的共同特点,传统服务器应用程序需要及时编译(JiT)过程和动态剖析才能达到最佳性能,而无服务器应用程序只需要(在某些情况下)从头开始设置整个环境来处理单个请求。

幸运的是,有多种解决方案可以缓解这种 "冷启动 "问题--例如,GraalVM 使我们能够生成 Java 应用程序的 "本地 "版本。此外,还可以利用快速启动或 AppCDS 等技术来缓存单独的 JVM 运行时片段,从而避免在启动时从头开始初始化它们。但是,如果我们能持续重用预热、预编译的应用程序代码呢?或者更好的办法是,重用已加载数据(如 ML 模型)的 Java 进程的整个内存?为了实现这一目标,我们应该考虑一种称为 CRIU 的机制。

用户空间检查点/还原(CRIU)是 Linux 的一项功能,可将运行中的应用进程 "转储 "到磁盘。下一个实例可以从捕获上一个快照的位置启动,从而缩短启动时间。

AppCDS 这样的技术与传统的保存方式类似:我们选择能够让我们稍后恢复应用程序状态的部分,然后简单地保存它们。而保存状态则不涉及这些微妙之处--随着计算机的发展,我们拥有了更多的存储空间,我们只需将整个内存状态转存到磁盘上(以老式游戏机为例,存储空间可能达到惊人的 1Mb),然后在需要时将其原样重放即可。

CRIU 是在 JVM 之外运行的通用操作系统功能,因此在安全性和便利性方面都面临着挑战。每个应用程序都有自己的特点,而且根据应用程序服务器、网络应用程序或批处理作业的不同,写入磁盘的时间也各不相同。

春天选择了一种有竞争力的解决方案--是时候转用 CRaC 了。

CRaC 项目(应用程序延续中的检查点/恢复)是一种工具解决方案,它利用了 Java 应用程序中的检查点/恢复机制。这使得运行中的 JVM 状态(检查点)得以保留并在稍后恢复,从而使应用程序能够跳过初始加载和预热阶段,更迅速地运行。与 "裸 "CRIU 相比,它采用了适当的挂接和改进措施,以方便 JVM 使用整个系统。

要将 Spring Framework 与 Project CRaC 以及 Virtual Threads 整合使用,需要满足某些先决条件:

  • 其中包括启用了检查点/恢复功能的 JVM,目前只有 Azul 或 Liberica 支持 Linux。
  • 不过,只有后者的 21 版本允许并发使用虚拟线程。
  • 此外,classpath 中必须附加 org.crac:crac 库(1.4.0 或更高版本),还需要指定特定的命令行参数,如 -XX:CRaCCheckpointTo=PATH。
  • 检查点过程生成的文件封装了 JVM 内存的完整状态,其中可能包括敏感数据。这就需要对安全影响进行全面评估。
  • 值得注意的是,该进程还会影响 java.util.Random 的随机性,使其随机性 "略微 "降低,因为所有进程都是从同一种子启动的。

CRaC 与 Spring 的集成相当全面,因为它能无缝集成到应用程序的自然生命周期中。

  • 可使用 jcmd application.jar JDK.checkpoint 命令触发检查点。该命令可有效停止 Spring 运行的所有 Bean,允许它们关闭资源。

  • 一旦恢复,这些相同的 Bean 将重新启动,并根据需要重新打开资源。

除了手动触发外,该集成的一个重要功能是能够设置在应用程序启动时自动启动检查点/恢复。

  • 通过设置 Java 系统属性-Dspring.context.checkpoint=onRefresh,

  • 启动时会在 LifecycleProcessor.onRefresh 阶段自动创建检查点。

实际上,这意味着所有(非lazy的)单子都已实例化,InitializingBean.afterPropertiesSet 回调已执行,但 Lifecycle.startmethods 尚未运行,ContextRefreshedEvent 尚未发出。

Spring 框架 6.1
Spring Framework 6.1 与 JDK 21 广泛兼容。新版本增强了 "应用容器 "本身,尤其是生命周期管理功能。它现在包含了暂停和恢复任务的功能,并改进了 ThreadPoolTaskExecutor 和 ThreadPoolTaskScheduler 中对任务关闭的控制。

最新版本还为 @Scheduled 方法提供了更好的可观察性,并改进了创建验证器的 "工厂"。
它还为 Spring MVC 和 WebFlux 中的控制器方法参数提供了内置方法验证支持。这消除了对控制器类级别 @Validated 注解的要求。说到注解,@PropertySource 现在扩展了对 SpEL(Spring 表达式语言)表达式中符号的支持。

此外还引入了 RestClient,这是一种新的同步 HTTP 客户端,与 WebClient 类似,但已预先配置并专为 REST 查询量身定制。

数据库访问方面的变化也很有趣--该版本的一个有趣之处是引入了 JdbcClient,它是 JDBC 的统一界面。此外,还增加了对 R2DBC 的支持。在数据层的变更列表中,还包括了对应用程序生命周期中事务活动的改进。

Spring Boot 3.2.0
除了 Spring Framework 6.1 的新功能外,Spring Boot 3.2.0 还引入了几个新的集成和功能。

值得注意的是:

  • Spring Boot 3.2.0 扩展了对 Apache Pulsar 的支持。
  • Spring Framework 6.1 中的 RestClient 接口为开发人员提供了功能性阻塞 HTTP API。
  • 此外还支持 JdbcClient。
  • 一个重要的新增功能是在使用 Micrometer 时自动记录 Correlation Id,这可能会让许多开发人员免于在崩溃时因缺乏足够信息而陷入不愉快的境地。
  • 还为 Micrometer 注释提供了自动配置支持:Timed、@Counted、@NewSpan、@ContinueSpan 和 @Observed。

3.2.0 版增强了按照云原生计算基金会的云原生构建包(Cloud-Native Buildpacks)标准构建 Docker 映像的功能。默认情况下,构建 Docker 映像的任务现在使用主机的配置。

有趣的支持项目
1、Apache Pulsar 的 Spring
Apache Pulsar 采用存储空间与计算能力分离的架构,与 Kafka 竞争。这提供了独立扩展这些组件的能力,实现了不同程度的资源隔离。这与 Kafka 的统一架构形成鲜明对比,后者的计算能力和存储空间紧密相连,因此必须同时扩展资源。

Spring for Apache Pulsar 1.0.0 是一款帮助创建基于 Apache Pulsar 应用程序的工具。它主要依赖于 spring-pulsar-spring-boot-starter 模块,该模块可简化应用程序的配置和开发。该工具可自动配置 PulsarClient 等关键组件,消息发送方和接收方都可使用这些组件。它还能通过 PulsarTemplate 方便地生成和消费消息,并通过 @PulsarListener 注释简单地订阅和响应消息。此外,该工具还支持 TLS 和各种身份验证方法。

简单提一下[Spring Integration 6.2](https://docs.spring.io/spring-integration/reference/whats-new.htmlwhats-new) :和往常一样,它包含了很多内容,但没有什么能明显改变任何人的生活。不过,如果你使用 Kafka、MongoDB 或 Debezium,它还是值得一看的。

2、Spring Security 6.2 and Spring Session 3.2.0
Spring Security 6.2 中的重大修改包括:当存在 CorsConfigurationSource Bean 时自动添加 .cors();轻松创建各种配置:全新的 AbstractConfiguredSecurityBuilder.with(...) 方法;简化 OAuth2 客户端组件配置。此外,还引入了对 OIDC Back-channel 注销的支持,并增强了 SecurityContext 传播、可调整的重定向策略(RedirectStrategy)和 HTTP Basic 请求解析。

Spring Session 3.2.0 与安全一直紧密联系在一起,它的实体主要有两大增强功能。首先是引入了 SessionIdGenerator,允许创建自定义会话 ID。后者则是增强了安全反序列化 Redis 会话的能力。

Spring 授权服务器Spring Authorization Server 1.2 也已发布。不过,该版本中的大部分更新都只是补丁注释,因此意义不大。

https://www.jdon.com/70218.html

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

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

相关文章

每日一练2023.11.26——打印沙漏【PTA】

题目链接:L1-002 打印沙漏 题目要求: 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ************ *****所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐&am…

小程序如何进行版本回退

当商家决定回退小程序版本时,可能是因为新版本出现了一些问题或者不符合预期,需要恢复到之前的稳定版本。下面具体介绍怎么回退小程序的版本。 在小程序管理员后台->版本设置处,点击版本回退。确认后,小程序会回退到上一次的版…

邮箱发送短信的多种方式

第一种&#xff1a;邮箱验证方法&#xff1a; 导入依赖&#xff1a; <!-- mail依赖&#xff08;发送短信的依赖&#xff09; --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> &l…

面对Spring 不支持java8的改变方法

接下来&#xff0c;就只有17与21了&#xff0c;JDK开发人员每隔半年&#xff0c;发布一个新的版本&#xff0c;但是新版本也只是维护一段时间&#xff08;一年/半年&#xff09;业务越小&#xff0c;升级越简单 1.如何创建Spring Boot项目,阿里云上去下载代码&#xff0c;然后使…

Vue简单的表单操作

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

【点云surface】 凹包重构

1 处理过程可视化 原始数据 直通滤波过滤后 pcl::ProjectInliers结果 pcl::ExtractIndices结果 凹包结果 凸包结果 2 处理过程分析&#xff1a; 原始点云 ---> 直通滤波 --> pcl::SACSegmentation分割出平面 -->pcl::ProjectInliers投影 --> pcl::ConcaveHull凹包…

编程题 :简单的洗牌算法的实现

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f324;️简单的洗牌算法…

【C++ Primer Plus学习记录】延时循环

有时候&#xff0c;让程序等待一段时间很有用。例如&#xff0c;可能遇到这样的程序&#xff0c;在屏幕上显示一条消息&#xff0c;而没来及阅读之前&#xff0c;又出现了其他内容。这样读者担心自己错过了重要的、无法恢复的消息。如果程序在显示其他内容之前等待5秒钟&#x…

Mybatis反射工厂类DefaultReflectorFactory

DefaultReflectorFactory是反射工厂接口ReflectorFactory的默认实现&#xff0c;其主要是实现了对反射对象Reflector的创建和缓存。 有三个方法&#xff1a; // 判断是否开启缓存boolean isClassCacheEnabled();// 设置是否缓存void setClassCacheEnabled(boolean classCacheEn…

java基础进阶-线程池

1、线程池 线程池就是一个可以复用线程的技术。 2、应用场景 用户每发起一个请求&#xff0c;后台就需要创建一个新线程来处理&#xff0c;下次新任务来了肯定又要创建新线程处理的&#xff0c;而创建新线程的开销是很大的&#xff0c;并且请求过多时&#xff0c;肯定会产生大…

单片机学习1——点亮一个LED灯

Keil软件编写程序&#xff1a; 特殊功能寄存器声明&#xff1a; #include<reg52.h>sbit LED P1^0;void main() {LED 0;while(1); } 代码说明&#xff1a; sbit 语句是特殊功能位声明。 生成HEX文件&#xff0c;这个文件是下载到单片机里的文件。Options for Target…

【Linux】初识重定向(输入输出)

一切皆文件 这是Linux的设计理念&#xff0c;因为这个理念的存在我们可以使用统一的方法对待不同的东西&#xff0c;&#xff0c;这也是为什么嵌入式之类的会需要Linux&#xff0c;因为用LInux来操纵硬件真的很方便 另外我们下文也会都基于这个理念来命名&#xff0c; 比如&am…

1.用数组输出0-9

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、举一反三一、题目描述 二、题目分析 三、解题 程序运行代码 总结 前言 本系列为数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用数组输出0-9 二、题目分析 数组下标从0开始 用数组…

趣链科技,HyperChain

目录 趣链科技 HyperChain 产品介绍 CA认证即电子认证服务 趣链科技 趣链区块链平台Hyperchain-核心产品-趣链科技 趣链科技飞洛区块链服务开放平台

AIGC技术的未来趋势:创新、智能化与社会影响

随着人工智能生成内容&#xff08;AIGC&#xff09;技术的不断演进&#xff0c;我们不仅见证了其在各个领域的广泛应用&#xff0c;还能够推测其未来的发展趋势。本文将探讨AIGC技术未来的几个关键趋势&#xff0c;涵盖创新、智能化以及可能的社会影响。 1. 模型的进一步优化和…

MySQL(免密登录)

简介: MySQL免密登录是一种允许用户在没有输入密码的情况下直接登录到MySQL服务器的配置。这通常是通过在登录时跳过密码验证来实现的。 1、修改MySQL的配置文件 使用vi /etc/my.cnf&#xff0c;添加到【mysqld】后面 skip-grant-tables #配置项告诉mysql跳过权限验证&#…

[Spring ~必知必会] Bean 基础常识汇总

文章目录 Bean 相关到底什么是beanFactorybeanFactory能干啥ApplicationContext是什么ApplicationContext的功能比 BeanFactory多了什么 容器的实现BeanFactory的实现ApplicationContext的实现xml 配置配置类配置 Bean 的生命周期3.1 Bean 的常见的后处理器测试代码总结 3.2 工…

python回溯求解电话号码组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 输入&#xff1a;digits "23" 输出&#xff1a;["ad&qu…

振南技术干货集:FFT 你知道?那数字相敏检波 DPSD 呢?(2)

注解目录 1 、DPSD 的基础知识 1.1 应用模型 1.2 原理推导 1.3 硬件 PSD &#xff08;相敏检波&#xff0c;就是从繁乱复杂的信号中将我们关心的信号检出来&#xff0c;同时对相位敏感。 数学原理&#xff0c;逃不掉的&#xff0c;硬着头皮看吧。&#xff09; 2 、DPSD …

【Redis缓存】RedisTemplate如何获取符合要求的key,批量获取key

RedisTemplate如何获取符合要求的key,批量获取key 一、方法/命令二、数据使用 一、方法/命令 如果使用命令的形式&#xff0c;输入以下命令即可 keys *如果使用RedisTemplate&#xff0c;则方法为 redisTemplate.keys()获取所有符合条件的key。 二、数据使用 redis中缓存了…