搶先一步
VMware 提供培訓和認證,以加速您的進度。
瞭解更多我很高興代表團隊和所有貢獻者宣布 Spring Native 0.11 的發布,它為 Spring Boot 2.6 提供原生支援。這個雄心勃勃的版本是 Spring 團隊五個月辛勤工作的成果,他們一直在開發一個全新的架構,將 Spring 對於使用 GraalVM 建立原生可執行檔的支援提升到新的層次。 您現在可以在 start.spring.io 上試用它!
在此新的 Spring Tips 影片中,了解更多關於 Spring Native 0.11 的資訊,並觀看 Spring Developer Advocate Josh Long 的實際操作。
最大的變化無疑是引入了新的 AOT 引擎,該引擎在建置時對您的 Spring 應用程式進行深入分析,以轉換和最佳化您的應用程式並產生所需的 GraalVM 原生配置。 這些轉換由 Maven 和 Gradle Spring AOT 外掛程式執行。
深入研究,AOT 引擎在建置時評估條件,以便產生針對您的應用程式專門設計的最佳化應用程式上下文和 Spring 工廠(Spring Boot 背後的外掛程式系統)。 實際上,這意味著
在執行階段執行的 Spring 基礎架構更少
在執行階段評估的條件更少
反射更少,因為使用了程式化 Bean 註冊
AOT 引擎根據識別為作用中的 Bean、對 Spring 程式設計模型的了解以及與 Spring Native 捆綁或由您的應用程式本身提供的原生提示,推斷執行您的應用程式作為原生可執行檔所需的原生配置。
我們要特別感謝 Stéphane Nicoll,他領導了這個新 AOT 引擎的設計和實作。
AOT 引擎的一個主要優點是它支援更小的原生可執行檔記憶體佔用空間,因為原生配置更準確,所需的反射更少,並且執行階段所需的 Spring 基礎架構更少。
與 Spring Native 0.10 相比,Spring Native 0.11 平均提供了 20% 到 26% 的佔用空間減少! 下圖顯示了一些範例應用程式的資料點
與 0.10 相比,Spring Native 0.11 的啟動時間快了 16% 到 35%,因為某些處理已從執行階段移至建置時間。 由於我們無法在這個小版本更新中微調 Spring Boot 和 Spring Framework 的內部架構,因此仍有改進的空間。
AOT 引擎也更準確,因為它不會嘗試分析 Spring 注釋或各種型別來複製 Spring 在執行階段所做的事情。 相反,它會分支出一個新進程,在其中它會在建置時建立和內省應用程式上下文(而不啟動它)。 這樣就可以使用 Spring Framework 在執行階段所做事情的一個子集,並且在 Bean 定義層級上工作,這更準確。
在建置時執行這些最佳化意味著與常規 Spring Boot 自動配置模型相比,執行階段靈活性較低。 您仍然可以在執行已編譯的 Spring Boot 應用程式時更改 HTTP 連接埠或應用程式的日誌級別,但您無法透過使用設定檔在執行階段新增新的 Bean。
這就是為什麼在 JVM 上,AOT 模式是可選的。 如果它符合您的需求,您可以使用的最佳化。 在原生上(從設計上來說,在執行階段的動態性要小得多),它是強制性的。 此外,請記住,目前是在建置時評估條件。 我們可能會在未來使其更具彈性,以便它應該適合大多數用例。
新的引擎提供了一個可外掛和模組化的架構,使用者(如您或 Spring 專案團隊)可以使用它來支援各種新功能。
例如,請參閱 BeanFactoryNativeConfigurationProcessor
擴充點的此實作,它會提前自動為使用 @RequestScope
或 @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
注釋的 Bean 建立類別 Proxy
public class ScopeNativeConfigurationProcessor implements BeanFactoryNativeConfigurationProcessor {
@Override
public void process(ConfigurableListableBeanFactory beanFactory, NativeConfigurationRegistry registry) {
new BeanFactoryProcessor(beanFactory).processBeansWithAnnotation(Scope.class, (beanName, beanType) -> {
Scope scope = beanFactory.findAnnotationOnBean(beanName, Scope.class);
if (scope.proxyMode() == ScopedProxyMode.TARGET_CLASS) {
registry.proxy().add(NativeProxyEntry.ofClass(beanType, ProxyBits.NONE,
ScopedObject.class, Serializable.class, AopInfrastructureBean.class));
}
});
}
}
NativeConfiguration
擴充點已經過改進,也可以使用 NativeConfigurationRegistry
提供 API
public interface NativeConfiguration {
default boolean isValid(AotOptions aotOptions) { return true; }
default void computeHints(NativeConfigurationRegistry registry, AotOptions aotOptions) { return; }
}
這些擴充點已定義,然後在 META-INF/spring.factories
中探索,因此您可以提供您自己的。
我們在 Spring Native 0.11 上所做工作的一個非常重要的部分是實作 AOT 程式碼路徑的測試支援,以便將原生測試支援提升到一個全新的層次。 結果是相容性顯著提高,支援更多種類的測試。
結合 原生建置工具 提供的強大的 JUnit 5 原生支援,它讓您可以像在 JVM 上一樣執行 Spring Boot、Spring Framework 或僅僅是簡單的 JUnit 測試。
與 Spring 無關,目前尚不支援 Mockito,但目前正在進行工作,使其在未來可以工作。
在將在 JVM 上執行的應用程式上執行 AOT 轉換有兩個主要好處。
第一個好處是能夠輕鬆地在 IDE 中偵錯將在原生上執行的程式碼(主要應用程式或測試),例如。
第二個優點是更好的效率。 目前,它提供了大約 4% 到 17% 的更小佔用空間。
AOT 模式還可以將應用程式啟動速度加快 3% 到 24%。
請注意,到目前為止,我們並沒有特別關注 JVM 效率,因此在後續版本中可能會有改進的機會。
Bellsoft Liberica Native Image Kit (NIK) 是一個基於 GraalVM 開源程式碼庫和 Liberica JDK 的原生映像檔編譯器發行版。 從 Spring Native 0.11 開始,預設使用它來支援 Buildpacks 原生功能,這與 JDK 端保持一致,JDK 端也預設使用 Liberica JDK。 您也可以使用它的 SDKMAN 整合功能,或透過下載並安裝它,來在本機安裝。
今年稍早,該團隊與 BellSoft 宣布,使用 Liberica Native Image Kit 的 VMware 客戶可以將他們的 Spring 應用程式作為原生可執行檔執行,並確信他們獲得完全支援。
Spring Native 0.11 也讓我們有機會提供基於 Spring Boot 2.6 的新基準線。
GraalVM 21.3 提供對 Java 11 和 Java 17 的支援,並利用條件式原生組態和其他相關的改進,以允許更小的佔用空間和對 JVM 生態系統更好的原生支援。 GraalVM 的 Java 8 版本已不再提供,因為它太舊而無法合理維護,但您仍然可以使用 GraalVM 的 Java 11 版本編譯大多數 Java 8 應用程式。 支援 Native Build Tools 0.9.8,我們將繼續合作以改進它。
我認為 Spring Native 0.11 實現了為 Spring Boot 提供成熟原生選項的目標。 Spring 團隊現在可以專注於下一個主要步驟:作為 Spring Framework 6、Spring Boot 3 和相關產品組合專案的一部分,改進原生支援。
請記住,我們在 Spring Native 上所做的一切都是與其他 Spring 專案密切合作完成的,但沒有進行深入的架構變更。 隨著 AOT 和原生功能成為 Spring Boot 3 和 Spring Framework 6 的主要主題,這些功能的品質、可維護性和易用性將達到一個新的水平。 AOT 引擎將得到改進並直接整合到 Spring Framework 中。 其他專案(例如 Spring Data 或 Spring Security)將能夠為其範圍提供原生支援(並對其進行測試),而 Spring Boot 將在其外掛程式和文件中提供開箱即用的 AOT 和原生可執行檔支援。
我們與 GraalVM 團隊和 JVM 生態系統的合作將會增加,以便為 Spring 之外的各種函式庫提供原生組態,無論是直接在這些函式庫中,還是在直接整合到 Native Build Tools 層級的原生組態儲存庫中。
我們計劃在 2022 年 5 月在 Spring Boot 3 里程碑 3 中提供開箱即用的 GraalVM 原生支援,充分利用我們在 Spring Native 上的工作中所學到的一切。 計劃於 2022 年底全面上市。 我們有很多令人興奮的計劃,但現在,讓我們花時間與 Spring 團隊和貢獻的 Spring 社群成員一起慶祝這個版本。 乾杯!