領先一步
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 週年。哇。寫下這個都讓我感到驚訝。
大家新年快樂!