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 参数。
# On the JVM you plan to deploy to:
java -Xshare:on -XX:SharedArchiveFile=app-cds.jsa -jar myapp.jar
对于我们来说,CDS 将启动时间缩短了 50% 以上!以下是使用 CDS 和 AOT 的示例宠物项目的启动时间比较,
如果您想了解有关 spring farmework 中 CDS 的更多信息,可以在此处参考官方文档
2. 虚拟线程(Project Loom):释放轻量级并发的力量
虚拟线程是 Project Loom 最受期待的功能之一,它将改变高并发应用程序的游戏规则。与传统线程相比,它们非常轻量,因此可以实现数千(甚至数百万)个并发任务。
// Create a virtual thread
Thread.startVirtualThread(() -> {
// Your task logic
});
虽然虚拟线程仍处于试验阶段,但它们已经使我们能够简化代码库并大幅提高性能。
3. 原生映像编译 (GraalVM):Java 部署的未来?
如果您曾梦想过闪电般的启动时间和极小的内存占用,那么 GraalVM 原生映像编译值得探索。它将 Java 代码编译为独立的可执行文件,从而无需在运行时使用 JVM。
# Build a native image
native-image -jar myapp.jar
注意事项?原生镜像调试起来可能比较棘手,而且有些库可能无法很好地运行。但是,潜在的好处不容忽视。
如果您想了解有关 GraalVM 的更多信息,我推荐 Alex 的 这篇文章
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's new Observation API for tracing
ObservationRegistry observationRegistry = ... // Obtain an ObservationRegistry
Observation.start("my-operation", observationRegistry).stop();
通过密切关注应用程序的动态,您可以在问题变得严重之前快速识别并修复它们。
这是一篇关于 springboot 中的可观察性的博客文章
升级冒险:一个警示故事
如果我不提我们在升级过程中面临的挑战,那我就太失职了。最大的障碍是依赖。许多库尚未赶上 Spring Boot 3,因此我们不得不寻找替代方案或坚持使用旧版本。
此外,一些新功能(如虚拟线程)需要较新的 JVM,这可能并不适合所有人。
结论:Java 的未来是光明的
尽管升级存在挑战,但我相信 Spring Boot 3 是 Java 生态系统向前迈出的一大步。新功能在性能、可扩展性和开发人员体验方面提供了显着的改进。如果您还没有尝试,我鼓励您尝试一下。但要做好面对一些困难的准备。
如果您尝试过这些功能中的任何一个,或者您有任何疑问,请在评论中告诉我。祝您编码愉快!
附注如果您被困在较旧的 Java 版本中,请不要绝望!这里提到的许多功能在 Spring Boot 2.x 中也可用,尽管有一些变化。