2023年春季回顾

工程 | Josh Long | 2023年12月26日 | ...

欢迎来到另一期《本周Spring》!今天是2023年12月26日,我们正凝视着新年!你知道这意味着什么吗?是时候进行我们一年一度的总结了,回顾Spring世界里所有最新和最棒的内容。这就是《今年的Spring》。因此,以下是一些2023年最大的主题,然后我们将进入我们定期安排的总结。

人工智能 (AI)

毫无疑问,你已经听说过人工智能领域令人难以置信的飞跃式进步!它无处不在!甚至在ChatGPT出现之前,我们就有GitHub的Copilot和Codota向各地的开发者展示了AI可以成为他们代码的加速剂。现在,世界其他地区也看到了它的潜力。AI太棒了!虽然大部分AI都是用低级代码和Python实现的,但我们大多数人不需要关心这些。就像我们不在乎大多数数据库是用什么语言实现的一样。我们大多数人不会编写自己的SQL数据库。因此,真正重要的是集成AI的应用程序的可用性。我认为,在这里,Spring AI特别引人注目。所有大型语言模型 (LLM) 都提供API,通常是基于HTTP的。所以这很容易。还有什么呢?好吧,AI产品处理的是“标记”——本质上是衡量给定对LLM的请求可能涉及多少数据(在请求和响应中)。标记数量越少,你可以发送给LLM来告知其响应的数据就越少。假设你正在尝试构建一个可以回答图书馆中书籍问题的机器人,或者可以回答你银行账户问题的机器人。你需要为它提供访问这些数据的方法,并且你需要找到一种方法将这些数据放入给定LLM的上下文窗口中。整个流程——从摄取到汇总再到通过向量存储检索——都需要Java和Spring擅长的优雅性和可用性。我在最近与英特尔的Arun Gupta一起制作的视频中查看了这个端到端流程(有时被称为RAG,或检索增强生成)。

GraalVM

我们在去年的11月将GraalVM原生镜像支持作为GA生产就绪特性引入Spring Boot 3.0。GraalVM背后的核心思想是它是一个提前编译器,主动获取代码并允许你将其转换为特定于操作系统和体系结构的原生代码。结果令人惊叹!启动时间明显加快,内存占用也明显减少。但是也有一些成本,一些让步。你需要提供编译器可以用来理解何时何地你可能会执行动态操作(如反射、序列化、JDK代理等)的配置文件。Spring Boot 3.0及更高版本附带一个AOT引擎,它会在编译时分析你的Spring Boot应用程序,并为你生成相关的配置。结果?大多数情况下,对于常见的情况,你的应用程序可以转换为GraalVM原生镜像,并享受这些令人惊叹的好处。立即尝试:start.spring.io,并添加GraalVM原生镜像支持。我写了一本关于Spring的AOT引擎中令人惊叹的机会的电子书,你可能会喜欢。它是免费的。如果你更喜欢观看视频,你可以在这里查看我对这项技术的深入教程

虚拟线程 (Project Loom)

在我看来,Java 21是自Java 1.0以来最重要的Java版本。它充满了许多特性——例如记录、模式匹配、智能switch表达式、自动推断、多行字符串以及其他无数特性——这使得它成为Java 8用户的必备升级。它还使Java成为最具生产力、性能最高和能效最高的平台之一。

我最喜欢的功能是Project Loom,也就是虚拟线程。虚拟线程提供了一个轻量级的线程运行时,它可以检测阻塞操作——Thread.sleepInputStream#read等,并将它们从正在执行它们的线程中移出,从而有效地释放该线程来处理系统中的其他事情。你的系统是否因为IO而效率低下,不断地向其他网络服务发送请求?那么你可能在等待数据上花费的时间比其他任何事情都多。这意味着,如果有很多请求进来,它们很可能必须等待被处理,而其他线程只是空闲地等待数据到达,无法继续前进。Project Loom解决了这个问题,确保你永远不会在空闲时占用线程。而且,最棒的是,使用它实际上只是一行代码,无论你使用什么线程,或者如果你使用的是Spring Boot 3.2,只需在一个地方设置一个属性即可应用于整个应用程序。很容易!我在介绍Spring Boot 3.2的视频中介绍了虚拟线程。

检查点协调恢复 (Project CRaC)

注意我说的是“大多数情况下”当谈到GraalVM原生镜像时?这是因为它并不总是有效。它经常有效,但它做的事情与JRE不同,因此有时会违背JRE的承诺。例如,Java代理在GraalVM原生镜像中不起作用。例如,如果你只想加快启动时间,例如在无服务器环境中呢?

程序(在像Linux这样的操作系统上运行)通常启动、初始化数据结构、将它们加载到RAM中,然后开始执行。这种初始化可能很慢——就像大多数在JRE上运行的程序一样。CRIU是Linux中的一种机制,它允许你对正在运行的应用程序的状态进行快照,然后将该快照写入磁盘。然后,你可以将该快照加载到另一个正在运行的程序中,并跳过初始化。结果?即时快速启动时间。这里涉及一些生命周期。你的程序需要知道何时将要进行快照。否则,它将没有机会清理任何敏感密码并关闭任何你不想捕获到快照中并写入磁盘的临时套接字。对于Java程序,Project CRaC(检查点协调恢复)提供了一种参与此生命周期的简单方法。Spring Boot 3.2现在也支持CRaC。我在介绍Spring Boot 3.2的视频中介绍了Project CRaC。

Docker驱动的开发

在5月份,我们发布了Spring Boot 3.1,它引入了对Docker驱动的开发的新支持。现在,Spring Boot可以从本地Docker Compose描述文件或Testcontainers中获取连接信息,从而避免你必须为数据库提供连接详细信息,并提供了一种更好的方法让Spring帮助你在开发环境中处理基础设施服务的生命周期。我在这个视频中介绍了这些令人兴奋的新可能性

Spring Modulith

Spring Boot是一个与Spring团队一起结对编程的机会。这是一种关于如何在基于Java和Spring的应用程序中集成和使用这些技术的有主见的做法。它支持许多不同的架构。并非所有架构都是平等的。如果你想构建一个分布式系统,可以使用Spring Cloud。但是,如果你想构建一个代码库,并以促进模块化、团队可扩展性和简洁、清晰的架构的方式来做呢?这就是Spring Modulith发挥作用的地方。Spring Modulith负责人Oliver Drotbohm在SpringOne的演讲中介绍了Spring Modulith。

现在是你们定期安排的节目……

这是你们一直在等待的每周总结。

这是 2023 年的最后一期综述。我希望今年过得愉快,来年更好。期待着在 2024 年年初与大家见面,迎接新的一年,当然还有《本周 Spring》的 13 周年纪念日。哇,就连写出来都让我难以置信。

新年快乐,大家!

获取 Spring 新闻通讯

关注 Spring 新闻通讯

订阅

领先一步

VMware 提供培训和认证,助力您快速进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部