领先一步
VMware 提供培训和认证,助您加速进步。
了解更多欢迎阅读新一期的《本周 Spring》!今天是 2023 年 12 月 26 日,我们即将迎来新年!你知道这意味着什么,对吧?是时候进行年度回顾了,看看充满奇妙和精彩的 Spring 世界里的所有最新和最棒的东西。这就是《Spring 这一年》。那么,以下是 2023 年的一些最重要主题,然后我们将进入我们通常的综述。
毫无疑问,你肯定已经听说过人工智能领域令人难以置信的飞跃式发展了!它无处不在!甚至在 ChatGPT 横空出世之前,我们就已经有了 GitHub 的 Copilot 和 Codota,向各地的开发者展示了 AI 如何加速他们的代码开发。现在,世界其他地方也看到了它的潜力。AI 太棒了!虽然大部分 AI 是用底层代码和 Python 实现的,但我们大多数人无需关心这一点。这就像我们不需要关心大多数数据库是用什么语言实现的一样。我们大多数人不会自己编写 SQL 数据库。因此,真正重要的是编写集成 AI 的应用程序的人体工程学。在这方面,我认为 Spring AI 尤其引人注目。所有的 LLM 都提供 API,通常是基于 HTTP 的。所以这很容易。还有什么呢?嗯,AI 服务以 tokens 为单位进行处理——本质上衡量了对给定 LLM 的请求可能涉及多少数据(包括请求和响应)。tokens 数量越少,你能发送给 LLM 以指导其响应的数据就越少。想象一下,你正在尝试构建一个可以回答图书馆书籍相关问题或银行账户相关问题的机器人。你需要为其提供一种访问这些数据的方式,并且需要找到一种方法将这些数据放入给定 LLM 的上下文窗口中。整个流程——从摄取到摘要再到通过向量存储进行检索——都需要 Java 和 Spring 所擅长的优雅性和人体工程学。我在最近与英特尔的 Arun Gupta 合作制作的视频中探讨了整个端到端流程(有时被称为 R.A.G.,即 retrieval augmented generation)。
去年 11 月,我们在 Spring Boot 3.0 中引入了 GraalVM 原生镜像支持,作为一个正式发布的生产就绪特性。GraalVM 的核心思想是它是一个提前编译器,主动获取代码并允许您将其转化为操作系统和架构特定的原生代码。结果令人惊叹!启动时间显著加快,并且内存占用显著减小。但也有一些成本和让步。您需要提供配置文件,编译器可以使用这些文件来理解您何时何地可能进行反射、序列化、JDK 代理等动态操作。Spring Boot 3.0 及更高版本附带一个 AOT 引擎,它在编译时分析您的 Spring Boot 应用程序,并为您生成相关的配置。结果呢?在大多数常见情况下,您的应用程序可以被转化为 GraalVM 原生镜像,并享受这些惊人的好处。立即尝试一下:访问 start.spring.io 并添加 GraalVM native image
支持。我写了一本电子书,您可能会喜欢,它详细介绍了 Spring 的 AOT 引擎中的惊人机遇。它是免费的。如果您更喜欢观看视频,可以在这里查看我对该技术的深入教程。
在我看来,Java 21 是自 Java 1.0 以来所有 Java 版本中最重要的一个发布。它充满了各种特性——比如 records、模式匹配、智能 switch 表达式、自动推断、多行字符串以及无数其他特性——这使得它成为 Java 8 用户必须升级的版本。它还使 Java 成为目前生产力最高、性能最佳、能效最高的平台之一。
我最喜欢的功能是 Project Loom,或者说 虚拟线程。虚拟线程提供了一种轻量级的线程运行时,它可以检测 阻塞操作——例如 Thread.sleep
、InputStream#read
等,并将它们从正在执行的线程上移开,从而有效地释放该线程去处理系统中的其他事情。您的系统是否被 IO 拖累,持续地向其他网络服务发送请求?那么您可能花费更多时间等待数据而不是其他任何事情。这意味着,如果有很多请求进来,它们很可能不得不等待被处理,而其他线程只是空闲地等待数据到达,无法继续进行。Project Loom 解决了这个问题,确保您在空闲时绝不会独占一个线程。最棒的是,无论您在哪里使用线程,都可以通过一行代码有效地使用它;或者,如果您使用 Spring Boot 3.2,只需在一处设置一个属性即可应用于整个应用程序。太简单了!我在这个介绍 Spring Boot 3.2 的视频中讲解了虚拟线程。
注意到我在谈论 GraalVM 原生镜像时说了“大多数时候”吗?那是因为它并非总是有效。它经常工作,但它做的事情与 JRE 不同,因此有时会违背 JRE 的承诺。例如,Java agent 在 GraalVM 原生镜像中无法工作。如果您只是想要更快的启动时间呢,例如在无服务器环境中?
程序(运行在 Linux 等操作系统上)通常会启动、初始化数据结构、将它们加载到 RAM,然后开始执行。这种初始化可能会很慢——就像大多数运行在 JRE 上的程序一样。CRIU 是 Linux 中的一种机制,它允许您对应用程序的运行状态进行快照,然后将快照写入磁盘。然后您可以将该快照加载到另一个正在运行的程序中,从而跳过初始化。结果呢?瞬时启动时间。这涉及到一些生命周期。您的程序需要知道它何时即将被快照。否则,它就没有机会清除任何敏感密码并关闭任何您不想在快照中捕获并写入磁盘的临时 socket。对于 Java 程序,Project CRaC(协调检查点恢复)提供了一种简单的方式来参与这个生命周期。而且 Spring Boot 3.2 现在也支持 CRaC 了。我在这个介绍 Spring Boot 3.2 的视频中讲解了 Project 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 年初与您见面,迎接全新的一年——当然,还有《本周 Spring》本身成立 13 周年。哇。写下这个都让我感到惊讶。
大家新年快乐!