領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多經過一年半的工作,我很高興地宣佈,我們正在釋出 Spring Native 的 Beta 版本,並且它已在 start.spring.io 上可用!
實際上,這意味著除了 Spring 自建立以來一直支援的常規 Java 虛擬機器之外,我們還增加了對使用 GraalVM 將 Spring 應用程式編譯為 原生映象 的 Beta 支援,以提供一種部署 Spring 應用程式的新方法。支援 Java 和 Kotlin。
這些原生 Spring 應用程式可以作為獨立的可執行檔案進行部署(無需安裝 JVM),並提供有趣的特性,包括幾乎即時啟動(通常 < 100 毫秒)、即時峰值效能和更低的記憶體消耗,但代價是構建時間更長,執行時最佳化比 JVM 少。

透過簡單的 mvn spring-boot:build-image 或 gradle bootBuildImage 命令,您可以生成一個最佳化的容器映象,其中包含一個最小的作業系統層和一個小型原生可執行檔案,該檔案僅包含 JDK、Spring 和您應用程式中使用的依賴項所需的位。例如,下面是一個包含 Spring Boot、Spring MVC、Jackson、Tomcat、JDK 和應用程式的 50MB 可執行檔案的最小容器映象。

您的 Spring 應用程式有很多可以用原生方式部署的場景
結合 Spring Cloud Function 的 Serverless
更經濟、更可持續地託管您的 Spring 微服務
非常適合 Kubernetes 平臺,例如 VMware Tanzu
希望建立最佳的容器映象來打包您的 Spring 應用程式和服務
我相信出色的 Spring 社群會發現更多,例如 Piotr Mińkowski 關於如何使用 Spring Boot 和 GraalVM 在 Knative 上構建原生微服務的精彩教程。
Spring Native Beta 是 Spring 團隊及其專案組合(Spring Framework、Spring Boot、Spring Data、Spring Security、Spring Cloud 和 Spring Initializr)廣泛協作的結果。觀看此影片,瞭解 Spring 團隊如何構建 Spring Native Beta 以及它提供的功能,包括對全新 start.spring.io 支援的演示。
我們的原生工作範圍比 Spring 更廣,因為原生涉及到更廣泛的 JVM 生態系統,因此我們一直與 GraalVM 團隊合作,以提高原生映象的相容性和佔用空間。以下是 GraalVM 團隊的 Vojin Jovanovic 的引述:
“與 Spring 團隊合作構建原生 JVM 生態系統是一件非常令人高興的事情:他們深厚的技術知識,以及對社群的敏銳洞察力,總是能帶來最佳的解決方案。最新的 Spring Native 版本及其在 JVM 生態系統中的眾多應用,為原生編譯的廣泛採用鋪平了道路。”
隨著 Spring Native 從 Alpha 版升級到 Beta 版,我認為有必要明確我們提供的支援範圍。
Alpha 是第一步,我們在此階段進行了大量實驗,並在大量具有破壞性更改的樣本中優化了 Spring Native(以前稱為 Spring GraalVM Native)的架構、相容性和佔用空間。我們還報告了大量問題,GraalVM 團隊已修復這些問題,以縮小 JVM 和原生映象在 Spring 應用程式上的差距。
雖然它仍被視為實驗性的,但 Beta 版意味著 Spring 現在為Spring 生態系統的子集提供原生支援。如果您的專案使用了受支援的依賴項,您可以嘗試使用它們,如果出現問題,可以報告 bug 或貢獻 pull requests。對於最新的 Spring Boot 2.x 次要版本的每個補丁版本,都會發佈一個新的 Spring Native 版本。Spring Native 0.9.0 支援 Spring Boot 2.4.3,Spring Native 0.9.1 將支援 Spring Boot 2.4.4,依此類推。會有破壞性更改,但我們會記錄遷移路徑。文件質量已達到新水平:參考文件可作為html 單頁或pdf 提供,並且我們釋出了原生提示公共 API 的 Javadoc。
Stéphane Nicoll 在 start.spring.io 和相關的 IDE 整合中引入了對 Spring Native 的支援,因此從今天起,這可能是探索如何使用 Spring 構建原生應用程式的最簡單方法。

新增 Spring Native 依賴項將自動為您的 Maven 或 Gradle 專案配置必需的依賴項和外掛以支援原生。應用程式程式碼本身保持不變。
請務必檢查生成的 HELP.md 檔案,其中包含有用的連結和文件,同時還會指示您是否選擇了某些在原生環境中不受支援的依賴項。
原生與 JVM 不同:類路徑在構建時固定,需要進行配置(例如,用於反射或資源),沒有類懶載入(可執行檔案中包含的所有內容都在啟動時載入到記憶體中),並且某些程式碼可以在構建時呼叫。
為了充分利用這些特性,並使 Spring 應用程式在原生環境中具有最大的相容性和最小的佔用空間,Brian Clozel 在此版本中引入了 Spring 提前編譯(AOT)Maven 和 Gradle 外掛,它們會對您的應用程式執行提前轉換。
第一種轉換旨在基於由出色的 Andy Clement 設計和實現的推理引擎生成 GraalVM 原生配置(反射、資源、代理、native-image 選項),該引擎理解 Spring 程式設計模型和基礎架構。例如,對於每個用 @Controller 標註的類,都會在生成的 reflect-config.json 檔案中新增一個條目。
某些原生配置無法推斷,對於這些情況,我們引入了原生提示註解(更多詳細資訊請參閱Javadoc),這使得 Spring Native 能夠以比常規基於 JSON 的原生映象配置更易於維護、型別安全和靈活的方式來支援原生配置。例如,Spring Native 的 MySQL 驅動程式支援提供提示,這些提示允許在原生映象的 reflect-config.json、resource-config.json 和 native-image.properties 中生成正確的條目,如下所示:
@NativeHint(
trigger = Driver.class,
options = "--enable-all-security-services",
types = @TypeHint(types = {
FailoverConnectionUrl.class,
FailoverDnsSrvConnectionUrl.class,
// ...
}), resources = {
@ResourceHint(patterns = "com/mysql/cj/TlsSettings.properties"),
@ResourceHint(patterns = "com.mysql.cj.LocalizedErrorMessages",
isBundle = true)
})
public class MySqlHints implements NativeConfiguration {}
NativeConfiguration 和其他動態配置機制允許生成更強大、更動態的配置,但請注意,它們 API 在未來版本中將發生很大變化。
Spring 開發人員還可以直接在他們的 @Configuration 或 @SpringBootApplication 類上使用特定於應用程式的原生提示進行註解,例如,透過 RestTemplate 或 WebClient 等程式化 API 將 Book 類序列化為 JSON。
@TypeHint(types = Book.class)
@SpringBootApplication
public class WebClientApplication {
// ...
}
在與提前編譯轉換系統一起工作時,最後一個也是可能最強大的機制是能夠利用 Spring Boot 部署模型結合 GraalVM 原生映象特性引入的封閉世界假設,自動生成原生最佳化的程式碼(原始碼和位元組碼)。這樣做的目標是限制所需額外原生配置的數量,以提高相容性,方法是使用原生映象編譯器開箱即用的程式碼結構,並透過減少反射、資源或代理所需的配置量來降低佔用空間。一個具體的例子是,提前編譯各種 spring.factories(Spring Boot 後面的擴充套件機制)到一個最佳化的程式化版本,該版本不需要反射,並且在您的應用程式上下文中過濾掉不必要的條目。
這只是 Spring AOT 的一個開始,我們打算新增更強大的轉換,例如將@Configuration 轉換為函式式配置,透過提前分析來替換執行時反射,該分析將自動生成使用 lambda 和方法引用等程式化構造的配置類。這將使 GraalVM 原生映象編譯器能夠開箱即用地理解 Spring 配置,而無需任何反射配置或 *.class 資源。
要記住的一個關鍵點是,在使用 Spring Native 時,此 AOT 生成的程式碼預設也會在 JVM 上使用,以便您可以使用 JVM 提供的簡短反饋迴圈,以及偵錯程式和所有常規工具來練習“原生友好型程式碼路徑”。
雖然 Spring AOT 轉換目前主要由原生需求驅動,但其中許多並非原生特有,並且有些可能為在 JVM 上執行 Spring Boot 應用程式提供最佳化。對於此類主題,一如既往,重要的是基於資料做出決策,因此我們將衡量效率和效能來驅動我們的決策。
我們可能會改進 IDE 整合,但目前請務必閱讀相關文件,瞭解在 IDE 中執行應用程式之前更新生成原始碼的潛在手動配置步驟。
Spring 的原生戰略有兩個主要支柱。第一個是適應 Spring 基礎架構以適應原生環境,而無需對數百萬現有的 Spring Boot 應用程式進行重大更改。這包括我們在 Spring 頂級專案中進行的使原生友好的更改、@NativeHint 等基礎架構以及我們在 Spring Native 中不斷完善的 Spring AOT 構建外掛。有關即將釋出的步驟的更多資訊,請檢視我們的路線圖。
第二個支柱比 Spring 本身更廣泛,原生是一個與 JVM 具有不同特性的平臺,但 Java 生態系統需要儘可能保持一致,以避免兩種截然不同的 Java 風格,這將難以維護。因此,我們與 GraalVM 團隊進行了密切合作,以縮小這一差距。在接下來的幾個月中,這項合作將側重於改進更廣泛 JVM 生態系統的原生測試和原生配置。
Spring 開發人員可以透過我們提供的各種示例瞭解更多關於原生的資訊,訪問start.spring.io 測試我們新的原生支援,閱讀更新的參考指南,閱讀發行說明(特別是如果您從早期版本升級),甚至貢獻支援您最喜歡的依賴項。如果您想了解更多關於相關的 Spring 商業支援資訊,您也可以聯絡我們。
最後,我要特別感謝已經提供了大量有益反饋和貢獻的 Spring 社群,感謝 GraalVM 團隊的出色合作,也感謝整個 Spring 團隊為使 Spring 開發人員更容易採用原生技術而付出的辛勤努力。
祝您使用愉快!