Spring Boot 3:你需要了解的五大新特性
让你的Spring Boot应用更强大:5个Spring Boot功能大幅提升性能(以及你如何也能做到)
如果你像我一样,你可能对保持Spring Boot项目的最新版本有一种爱恨交织的感觉。一方面,总是有新的功能让人兴奋不已;另一方面,又有担心破坏你辛苦建立的一切的忧虑,使得语气更加自然。
最近,我们决定将几个微服务项目升级到了Spring Boot 3。这并不是个小工程(稍后会详细说明),但这对我们的应用产生了巨大的影响。我想分享对我们来说最有帮助的五个特性,以及一些代码片段帮你开始。
1. 类数据共享 (CDS):你的快速启动创业公司的秘密武器本质上,CDS 是一种 JVM 优化技巧。它通过生成应用程序类的快照(就像一个蓝图一样),然后将该快照存储在共享归档文件中来工作。当你启动 Spring Boot 应用程序时,JVM 可以参考这个归档文件,从而大大加快类加载速度。为什么这很重要?类加载是启动时间的主要因素,特别是在大型的 Spring Boot 应用程序中。
CDS在哪些场景中表现出色
- 微服务和云原生应用: 微服务架构通常涉及许多小型服务频繁启动和停止。CDS 可以显著降低每次启动的开销,从而实现更快的扩展和响应能力。
- 容器化环境: 像 Docker 这样的容器设计用于快速部署。CDS 可以通过加快应用程序在容器内准备好以处理流量的时间来补充这一点。
- 长时间运行的应用程序: 如果您的应用连续运行数天或数周,CDS 的初始启动优化可能看起来并不重要。然而,每次重新部署时,您都能从减少的类加载时间中获益。
- 资源受限的环境: CDS 还可以降低内存消耗,因为多个 JVM 实例可以共享相同的类元数据。在资源有限的情况下尤其有用。
如何放置CDS(一步步指南)
- 启用CDS归档: Spring Boot 3让这个过程更简单。在
application.properties
文件中添加以下内容:
spring.context.exit-on-refresh=true
-XX:ArchiveClassesAtExit=app-cds.jsa
这会让Spring Boot在启动时创建一个名为app-cds.jsa
的CDS归档,紧接着直接退出。
2. 生成归档: 运行一次您的Spring Boot应用程序以生成CDS归档。它将与您的可执行jar文件位于同一目录下。
3. 使用归档: 在实际启动应用时,包含以下JVM参数:
# 在你要部署的JVM上:
在命令行中使用如下指令:java -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar myapp.jar
对我们来说,CDS将启动时间减少了超过一半!以下是比较使用CDS和AOT的示例项目启动时间的对比:
如果你想了解更多关于spring框架中的CDS,可以参考官方文档(此处的CDS指...)。
使用 Spring Framework 6.1 让你的 Java 代码更上一层楼并探索 Spring 可以为你带来什么。spring.io2. 虚拟线程技术(Loom项目):释放轻量级并发的优势
虚拟线程(Virtual Threads),Project Loom 最令人期待的功能之一,极大地改变了高并发应用程序的游戏规则。它们比传统线程轻得多,使得同时运行数千(甚至数百万)任务成为可能。
// 创建一个虚拟线程(更轻量的线程实现)
Thread.startVirtualThread(() -> {
// 你的任务代码
});
尽管虚拟线程仍处于实验阶段,它们已经帮助我们简化了代码库,并大幅提升了性能。我还写了一篇博客,专门对比了虚拟线程的性能。
Spring Boot 虚拟线程技术了解虚拟线程与 Project Loom。在 Java 19 中创建了一个带有虚拟线程功能的 Spring MVC 应用程序medium.com3. 本机编译(GraalVM 技术):Java 部署的未来方向?
如果你曾经梦想过拥有闪电般的启动时间和极小的内存占用,那么探索GraalVM的本机图像编译是值得的。它将你的Java代码编译为一个独立的可执行文件,在运行时无需使用JVM。
# 构建原生镜像
native-image -jar myapp.jar
调试原生图片可能会很棘手,而且某些库可能不配合。不过,这些潜在的好处实在太大,不容忽视。
如果你想了解更多关于GraalVM的信息,你可以看看Alex写的这篇Medium上的文章。
探索 GraalVM:入门与实践指南中:中4. HTTP异常的问题详情:更有效的错误处理,更少的头疼事
Spring Boot 3 让为您的 REST API 提供有意义的错误响应变得更简单。使用 ProblemDetail
(问题详情),您可以依照 RFC 7807 返回结构化的错误详情。
@RestControllerAdvice
public class GlobalExceptionHandler {
// 全局异常处理器,用于处理所有异常
@ExceptionHandler(Exception.class)
ProblemDetail handleException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, ex.getMessage());
}
}
从此,您的 API 消费者将获得详细的错误详情,让处理故障变得简单。
5. 可观测性改进:更密切关注您的应用的健康
Spring Boot 3 引入了多项改进,使监控应用程序的健康状况和性能变得更简单。您将发现新的指标数据、增强的追踪功能以及与流行可观察性工具的更好集成。
// Micrometer的新Observation API用于追踪
ObservationRegistry observationRegistry = ... // 获取ObservationRegistry实例
Observation.start("my-operation", observationRegistry).stop();
通过时刻关注应用的状态,你可以快速发现并解决潜在问题,避免它们演变成大麻烦。
这是我写的一篇关于Spring Boot可观测性的博客
使用Micrometer、Prometheus和Grafana创建自定义可观测性的指南深入了解应用程序的性能和行为medium.com 升级冒险:一则警世故事如果我不提一下我们在升级过程中遇到的挑战,我就太失职了。最大的困难是所谓的“依赖地狱”(dependency hell)。许多库还没有准备好支持Spring Boot 3,所以我们必须寻找替代方案或继续使用旧版本。
另外,一些新功能,比如虚拟线程,需要更新版本的JVM,这可能对一些人来说不太现实。
结论:Java 的未来一片光明尽管升级过程中会有一些挑战,但我确信Spring Boot 3对于Java生态系统来说是个巨大的飞跃。新功能在性能、可扩展性和开发体验方面都有了显著的提升。如果你还没试过,我鼓励你试试看。但要做好准备,可能会遇到一些小麻烦。
在评论区留言告诉我如果试过这些功能,有任何问题可以问我。祝你编程愉快!
附言:如果你还在使用旧版本的Java,别担心!很多提到的功能在Spring Boot 2.x中也都有提供,虽然有些不同。
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章