領先一步
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 個週年紀念。哇。寫下來都讓我難以置信。
祝大家新年快樂!