领先一步
VMware 提供培训和认证,助您加速进步。
了解更多欢迎来到又一期“本周 Spring 动态”!今天是 2023 年 12 月 26 日,我们即将迎来新的一年!您知道这意味着什么,对吧?是时候进行年度回顾了,看看 Spring 领域最新、最精彩的一切。这就是“2023 年 Spring 展望”。因此,以下是 2023 年的一些最大主题,然后我们将继续进行我们常规的 roundup。
你无疑已经听说过人工智能领域令人难以置信的飞跃式发展!它无处不在!即使在 ChatGPT 出现之前,我们也有 GitHub 的 Copilot 和 Codota 向所有开发者展示了 AI 可以成为他们代码的加速器。现在,世界其他地方也看到了它的潜力。AI 太棒了!虽然其中大部分是以底层代码和 Python 的形式实现的,但大多数人不需要关心。就像我们不关心大多数数据库是用什么语言实现的。大多数人不会编写自己的 SQL 数据库。所以,真正重要的是编写集成 AI 的应用程序的易用性。而在这一点上,我认为 Spring AI 尤其引人注目。所有 LLM 都提供 API,通常是基于 HTTP 的。所以这很容易。还有什么呢?好吧,AI 服务以token为单位提供——本质上是一种衡量给定的 LLM 请求可能涉及的数据量(在请求和响应中)的度量。token 数量越少,你可以发送给 LLM 来告知其响应的数据就越少。想象一下,你正在尝试构建一个机器人,它可以回答有关图书馆藏书的问题,或者回答有关你银行账户的问题。你需要给它一种访问这些数据的方式,并且需要找到一种方法将这些数据放入给定 LLM 的上下文窗口中。整个管道——从摄取到摘要再到通过向量存储检索——都需要 Java 和 Spring 精通的优雅和易用性。我查看了整个端到端管道(有时在 我最近与 Intel 的 Arun Gupta 合作的一个视频中,也被称为 R.A.G.,或检索增强生成)。
我们在去年 11 月将 GraalVM 原生镜像支持作为 GA 生产就绪功能引入 Spring Boot 3.0。GraalVM 的核心思想是它是一个提前编译器,可以主动处理代码,并允许你将其转换为特定于操作系统和体系结构的本地代码。结果令人惊叹!启动时间明显加快并且 RAM 占用空间明显减小。但也有一些代价,一些妥协。你需要提供配置文件,编译器可以使用这些配置文件来了解你可能在何时何地进行反射、序列化、JDK 代理等动态操作。Spring Boot 3.0 及更高版本随附一个 AOT 引擎,该引擎在编译时分析你的 Spring Boot 应用程序并为你生成相关配置。结果呢?大多数情况下,对于常见情况,你的应用程序可以转换为 GraalVM 原生镜像并享受这些惊人的好处。立即尝试:start.spring.io 并添加 `GraalVM native image` 支持。我写了一本关于 Spring 的 AOT 引擎中令人兴奋的机遇的电子书,你可能会喜欢。它是免费的。如果你更喜欢观看视频,你可以在这里查看我关于该技术的深入教程。
在我看来,Java 21 是自 Java 1.0(可能)以来最重要的 Java 版本。它充满了功能——如记录、模式匹配、智能 switch 表达式、自动推断、多行字符串,以及数百万个其他功能——使对于 Java 8 用户来说,这是一个必须升级的版本。它还使 Java 成为最富有成效、最强大的平台之一,也是能效最高的平台之一。
我最喜欢的功能是 Loom 项目,或虚拟线程。虚拟线程提供了一个轻量级的线程运行时,它会检测阻塞操作——Thread.sleep、InputStream#read 等,并将它们从正在执行的线程上移开,从而有效地释放该线程来处理系统中的其他事情。你是否处于一个被 IO 拖累的系统中,有不断的请求通过网络发送到其他网络服务?那么你可能花费更多时间等待数据而不是其他任何事情。这意味着,如果你收到大量请求,在其他线程只是空闲地等待数据到达而无法继续前进时,它们可能不得不等待被处理。Loom 项目解决了这个问题,确保你永远不会在空闲时独占一个线程。而且,最重要的是,使用它在你使用线程的地方实际上只需要一行代码,或者,如果你使用 Spring Boot 3.2,就像在应用程序的一个地方设置一个属性一样简单。太容易了!我在这个介绍 Spring Boot 3.2 的视频中研究了虚拟线程。
注意,在谈论 GraalVM 原生镜像时,我说的是“大多数时候”?那是因为它并不总是有效。它足够经常有效,但它做的事情与 JRE 不同,因此有时会违反 JRE 的承诺。例如,Java 代理在 GraalVM 原生镜像中不起作用。如果你只是想加快启动时间,例如在无服务器环境中,该怎么办?
程序(在 Linux 等操作系统上运行)通常会启动,初始化数据结构,将它们加载到 RAM 中,然后开始执行。这种初始化可能很慢——就像大多数在 JRE 上运行的程序一样。CRIU 是 Linux 中的一种机制,它允许你拍摄运行应用程序的快照,然后将该快照写入磁盘。然后,你可以将该快照加载到另一个运行的程序中,并跳过初始化。结果呢?即时快速的启动时间。这涉及一些生命周期。你的程序需要知道何时即将被快照。否则,它将没有机会清理任何敏感密码并关闭任何不希望被捕获在快照中并写入磁盘的临时套接字。对于 Java 程序,CRaC 项目(协调恢复检查点)提供了一种简单的方式来参与此生命周期。Spring Boot 3.2 现在也支持 CRaC。我在这个介绍 Spring Boot 3.2 的视频中研究了 CRaC 项目。
今年 5 月,我们发布了 Spring Boot 3.1,它引入了对 Docker 驱动开发的新支持。现在,Spring Boot 可以从本地 Docker Compose 描述文件或 Testcontainers 获取连接信息,让你无需提供数据库连接详细信息,并提供了一种更好的方式,让 Spring 在开发环境中帮助你管理基础设施服务的生命周期。我在这个视频中研究了这些令人兴奋的新可能性。
Spring Boot 提供了一个与 Spring 团队进行结对编程的机会。它是一种在你的 Java 和 Spring 应用程序中集成和利用技术的约定俗成的方法。它支持多种不同的架构。并非所有架构都生而平等。如果你想构建一个分布式系统,有 Spring Cloud。但是,如果你想构建一个代码库,并以一种旨在促进模块化、团队可扩展性和清晰、无纠缠的架构的方式来构建呢?这就是 Spring Modulith 的用武之地。Spring Modulith 的负责人 Oliver Drotbohm 在SpringOne 的这次演讲中介绍了 Spring Modulith。
这是你一直期待的每周回顾。
AiClient 现在是 ChatClient,等等。这是 2023 年的最后一次回顾。我希望今年过得不错,明年会更好。我期待着在新的一年里,在 2024 年初与大家见面,迎来新的一年,当然,还有This Week in Spring 本身创办的第 13 个周年纪念。哇。写下来都让我难以置信。
祝大家新年快乐!