Spring 團隊日前發(fā)布了 Spring Native Beta 版。通過 Spring Native,Spring 應用將有機會與 GraalVM 原生鏡像的方式運行。為了更好地支持原生運行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了優(yōu)化原生配置的注解。Spring 發(fā)布了 Spring Native 的 beta 版本,并在start.spring.io上運行它。實際上,這意味著自Spring成立以來,除了Spring支持的常規(guī)Java虛擬機之外,我們還將添加Beta支持,以使用GraalVM將Spring應用程序編譯到本機映像中,從而提供一種部署Spring應用程序的新方法。支持Java和Kotlin。這些本機Spring應用程序可以部署為獨立的可執(zhí)行文件(無需安裝JVM),并提供有趣的特性,包括幾乎即時啟動(通常<100ms),即時峰值性能和較低的內存消耗,但所需的構建時間和運行時優(yōu)化次數少于JVM。使用簡單mvn spring-boot:build-image或gradle bootBuildImage命令,您可以生成一個優(yōu)化的容器映像,該映像將包含一個最小的OS層和一個小的本機可執(zhí)行文件,該映像僅隨附JDK,Spring以及您在應用程序中使用的依賴項中的必需位。請參閱下面的示例,其中包含50MB可執(zhí)行文件的最小容器映像,其中包含Spring Boot,Spring MVC,Jackson,Tomcat,JDK和應用程序。這種原生方式,在很多場景下都會對 Spring 應用產生價值:具有Spring Cloud功能的無服務器
以更便宜和更可持續(xù)的方式托管Spring微服務
非常適合VMware Tanzu等Kubernetes平臺
想要創(chuàng)建最佳的容器映像來打包您的Spring應用程序和服務
在使用場景上,比如 Piotr Mińkowski 提供了一個非常棒的指南,介紹了如何在 Knative 上使用 Spring Boot 和 GraalVM 構建原生微服務。
Spring Native beta 是整個 Spring 團隊及其家族項目廣泛合作的結果:Spring Framework、Spring Boot 還包括 Spring Data、Spring Security、Spring Cloud 和 Spring Initializr。以下是來自 GraalVM 團隊的 Vojin Jovanovic 的一段話。“與 Spring 團隊協(xié)作打造原生 JVM 生態(tài)系統(tǒng)是一件非常愉快的事情:他們深厚的技術知識,再加上對社區(qū)的敏感觸覺,總是能帶來最好的解決方案。最新的 Spring Native 版本,以及它在 JVM 生態(tài)系統(tǒng)中的眾多用法,為原生編譯的廣泛采用鋪平了道路。”隨著Spring Native從alpha過渡到beta,我認為弄清我們提供的支持范圍很重要。Alpha是第一步,我們進行了大量試驗并完善了Spring Native(以前稱為Spring GraalVM Native)的體系結構,兼容性和對一系列樣本進行了重大更改的封裝。我們還報告了GraalVM團隊修復的許多問題,目的是縮小JVM與Spring應用程序的本機之間的差距。雖然仍被認為是實驗性的,但beta意味著Spring現(xiàn)在為Spring生態(tài)系統(tǒng)的子集提供了對native的支持。如果項目正在使用受支持的依賴項,則可以在項目上進行嘗試;如果出現(xiàn)問題,則引發(fā)錯誤或提出請求請求。最新版本的Spring Boot 2.x次要版本的每個修補程序版本都會出現(xiàn)一個新版本的Spring Native。Spring Native 0.9.0支持Spring Boot 2.4.3,Spring Native 0.9.1支持Spring Boot 2.4.4,等等。雖然會發(fā)生一些重大變化,但我們將記錄遷移路徑。文檔質量達到了一個新的水平:參考文檔以html單頁或pdf的形式提供],并且我們發(fā)布了本機提示的Javadoc公共API。Stéphane Nicoll 在對 start.spring.io 和相關 IDE 的集成中,引入了對 Spring Native 的支持,所以現(xiàn)在這是探索如何使用 Spring 構建原生應用最簡單的方式。添加 Spring Native 依賴后將會使用所需的依賴和插件自動配置 Maven 或 Gradle 項目,以便于支持原生。應用代碼本身沒有變化。請檢查自動生成的 HELP.md 文件,該文件包含了有用的鏈接和文檔,同時它還能標記出來你是否選擇了一些在原生環(huán)境下不支持的依賴。本機不同于JVM:類路徑在構建時是固定的,例如需要反射或資源進行配置,沒有類延遲加載(可執(zhí)行文件中附帶的所有內容在啟動時都加載到內存中),并且可以調用一些代碼在構建時。為了充分體現(xiàn)這些特性并允許Spring應用程序在本機上以最大的兼容性和最小的占用空間運行,Brian Clozel在此版本中引入了Spring提前(AOT)Maven和Gradle插件,它們可以提前執(zhí)行您的應用程序上的轉換。無法推斷出某些本機配置,對于這些情況,我們引入了本機提示注釋(有關更多詳細信息,請參見Javadoc),這使Spring Native可以比基于常規(guī)JSON的本機圖像配置更可維護,類型安全和靈活地支持本機配置。例如同春本地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和其他動態(tài)配置機制允許更強大的和動態(tài)的配置生成,但要注意它們的API將在即將到來的版本演變了很多。
Spring開發(fā)人員還可以使用特定于應用程序的本機提示直接注釋其@Configuration或@SpringBootApplication類,例如,Book通過諸如RestTemplate或的編程API將類序列化為JSON WebClient:@TypeHint(types = Book.class)@SpringBootApplicationpublic class WebClientApplication {// ...}
與提前轉換系統(tǒng)一起使用時,最后一種可能是最強大的機制是使用Spring Boot部署模型與GraalVM native結合引入的封閉世界假設自動生成本機優(yōu)化代碼(源代碼和字節(jié)碼)的功能。圖像特征。這里的目標是通過使用本機圖像編譯器可以開箱即用地分析的代碼構造來限制所需的額外本機配置的數量,以提高兼容性,并通過減少反射所需的配置數量來減少占用空間,資源或代理。一個具體的例子是各種形式的提前轉換spring.factories (Spring Boot背后的擴展機制)到優(yōu)化的程序設計版本,該版本不需要反射,并且可以在應用程序的上下文中過濾掉不必要的條目。
要記住的一個關鍵點是,在使用Spring Native時,默認情況下在JVM上也會使用AOT生成的代碼,以允許您使用JVM允許的短反饋循環(huán)來行使“本機友好的代碼路徑”。您的調試器和所有常規(guī)工具。盡管Spring AOT轉換當前主要由本機需求驅動,但是其中許多不是本機特定的,并且可能其中一些可以提供優(yōu)化以在JVM上運行Spring Boot應用程序。與此類主題一樣,重要的是數據驅動,以便我們測量效率和績效來決定我們的決策。我們可能會改進IDE的集成,現(xiàn)在確保在IDE中運行應用程序之前,請先閱讀相關文檔以進行潛在的手動配置步驟,以更新生成的源代碼。Spring戰(zhàn)略要本地化有兩個主要支柱。第一個是使Spring基礎結構適應本機,而無需對數百萬個現(xiàn)有的Spring Boot應用程序進行重大更改。其中包括我們在Spring頂級項目中所做的更改,以使其對本機友好,@NativeHint我們將在Spring Native中成熟的基礎架構(例如)和Spring AOT構建插件。第二個支柱比Spring本身更廣泛,native是一個具有與JVM不同的特性的平臺,但是Java生態(tài)系統(tǒng)需要盡可能地一致,以避免兩種非常不同的Java風格,這將難以維護。這就是為什么我們與GraalVM團隊進行深入合作以縮小這一差距的原因。在接下來的幾個月中,這項合作將專注于為更廣泛的JVM生態(tài)系統(tǒng)改善本機測試和本機配置。最近面試BAT,整理一份面試資料《Java面試BAT通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數據庫、數據結構等等。獲取方式:關注公眾號并回復 java 領取,更多內容陸續(xù)奉上。