0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring干掉原生JVM?

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-05-05 09:25 ? 次閱讀


Spring 團(tuán)隊(duì)日前發(fā)布了 Spring Native Beta 版。通過(guò) Spring Native,Spring 應(yīng)用將有機(jī)會(huì)與 GraalVM 原生鏡像的方式運(yùn)行。為了更好地支持原生運(yùn)行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了優(yōu)化原生配置的注解。

最近,Spring 發(fā)布了 Spring Native 的 beta 版本,該功能已經(jīng)在 start.spring.io 上可用了。

https://github.com/spring-projects-experimental/spring-native

https://start.spring.io/

這意味著,除了 Spring 誕生以來(lái)就支持的 Java 虛擬機(jī),官方添加了使用 GraalVM 將 Spring 應(yīng)用編譯成原生鏡像的 beta 支持,這樣的話,就能提供一種新的方式來(lái)部署 Spring 應(yīng)用。Spring Native 支持 Java 和 Kotlin。

這些原生的 Spring 應(yīng)用可以作為一個(gè)獨(dú)立的可執(zhí)行文件進(jìn)行部署(不需要安裝 JVM),并且還能提供有趣的特征,包括幾乎瞬時(shí)的啟動(dòng)(一般會(huì)小于 100 毫秒)、瞬時(shí)的峰值性能以及更低的資源消耗,其代價(jià)是比 JVM 更長(zhǎng)的構(gòu)建時(shí)間和更少的運(yùn)行時(shí)優(yōu)化。

51580fc2-eadc-11ed-90ce-dac502259ad0.jpg

通過(guò)簡(jiǎn)單的 mvn spring-boot:build-image 或 gradle bootBuildImage 命令,就能生成一個(gè)優(yōu)化的容器鏡像,它包含了一個(gè)最小的操作系統(tǒng)層和一個(gè)小的原生可執(zhí)行文件,該文件只包含了必需的東西即 JDK、Spring 以及應(yīng)用中所使用的依賴。

請(qǐng)看下面這個(gè)最小的容器鏡像,它是一個(gè) 50MB 的可執(zhí)行文件,包含了 Spring Boot、Spring MVC、Jackson、Tomcat、JDK 和應(yīng)用本身。

51611072-eadc-11ed-90ce-dac502259ad0.jpg

這種原生方式,在很多場(chǎng)景下都會(huì)對(duì) Spring 應(yīng)用產(chǎn)生價(jià)值:

  • 使用 Spring Cloud Function 的 Serverless 應(yīng)用
  • 更廉價(jià)、更可持續(xù)地托管 Spring 微服務(wù)
  • 與 VMware Tanzu 這樣的 Kubernetes 平臺(tái)有很好的契合性
  • 想要最優(yōu)的容器鏡像,以打包 Spring 應(yīng)用和服務(wù)

在使用場(chǎng)景上,比如 Piotr Mińkowski 提供了一個(gè)非常棒的指南,介紹了如何在 Knative 上使用 Spring Boot 和 GraalVM 構(gòu)建原生微服務(wù)。

https://piotrminkowski.com/2021/03/05/microservices-on-knative-with-spring-boot-and-graalvm/

1. 團(tuán)隊(duì)協(xié)作

Spring Native beta 是整個(gè) Spring 團(tuán)隊(duì)及其家族項(xiàng)目廣泛合作的結(jié)果:Spring Framework、Spring Boot 還包括 Spring Data、Spring Security、Spring Cloud 和 Spring Initializr。

據(jù)悉,原生功能的工作范圍比 Spring 更廣,因?yàn)樵婕暗礁鼜V泛的 JVM 生態(tài)系統(tǒng),所以官方一直在與 GraalVM 團(tuán)隊(duì)合作,以改善原生鏡像的兼容性和資源消耗。

以下是來(lái)自 GraalVM 團(tuán)隊(duì)的 Vojin Jovanovic 的一段話。

“與 Spring 團(tuán)隊(duì)協(xié)作打造原生 JVM 生態(tài)系統(tǒng)是一件非常愉快的事情:他們深厚的技術(shù)知識(shí),再加上對(duì)社區(qū)的敏感觸覺(jué),總是能帶來(lái)最好的解決方案。最新的 Spring Native 版本,以及它在 JVM 生態(tài)系統(tǒng)中的眾多用法,為原生編譯的廣泛采用鋪平了道路。”

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

2. 支持的范圍

現(xiàn)在,Spring Native已經(jīng)從alpha過(guò)渡到beta,那么很重要的一點(diǎn)就是明確他弄所支持的功能范圍。

Alpha是第一步,我們進(jìn)行了大量試驗(yàn)并完善了Spring Native(以前稱為Spring GraalVM Native)的體系結(jié)構(gòu),兼容性和對(duì)一系列樣本進(jìn)行了重大更改的封裝。我們還報(bào)告了GraalVM團(tuán)隊(duì)修復(fù)的許多問(wèn)題,目的是縮小JVM與Spring應(yīng)用程序的本機(jī)之間的差距。

雖然它仍被認(rèn)為是實(shí)驗(yàn)性的,但 beta 版意味著 Spring 現(xiàn)在在 Spring 生態(tài)系統(tǒng)的一個(gè)子集上提供了對(duì)原生的支持。如果你的應(yīng)用正在使用業(yè)已支持的依賴,那么你可以試用它,在出現(xiàn)問(wèn)題時(shí)可以提 bug 或貢獻(xiàn) pull request。在最新的 Spring Boot 2.x 小版本的每個(gè)補(bǔ)丁發(fā)布時(shí),都會(huì)有一個(gè)新的 Spring Native 版本。Spring Native 0.9.0 支持 Spring Boot 2.4.3,Spring Native 0.9.1 將支持 Spring Boot 2.4.4 等。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

3. start.spring.io

Stéphane Nicoll 在對(duì) http://start.spring.io 和相關(guān) IDE 的集成中,引入了對(duì) Spring Native 的支持,所以現(xiàn)在這是探索如何使用 Spring 構(gòu)建原生應(yīng)用最簡(jiǎn)單的方式。

516e690c-eadc-11ed-90ce-dac502259ad0.jpg

添加 Spring Native 依賴后將會(huì)使用所需的依賴和插件自動(dòng)配置 Maven 或 Gradle 項(xiàng)目,以便于支持原生。應(yīng)用代碼本身沒(méi)有變化。

請(qǐng)檢查自動(dòng)生成的 HELP.md 文件,該文件包含了有用的鏈接和文檔,同時(shí)它還能標(biāo)記出來(lái)你是否選擇了一些在原生環(huán)境下不支持的依賴。

4. 預(yù)先轉(zhuǎn)換

原生與JVM有說(shuō)不同:類路徑在構(gòu)建時(shí)是固定的,反射或資源需要進(jìn)行配置,這里沒(méi)有類的懶加載(可執(zhí)行文件中包含的所有內(nèi)容在啟動(dòng)的時(shí)候都會(huì)加載進(jìn)來(lái))并且有些代碼可以在構(gòu)建期調(diào)用。

為了充分擁抱這些特性,并且能讓 Spring 應(yīng)用以最大的兼容性和最小的資源消耗運(yùn)行在原生環(huán)境中,Brian Clozel 在這個(gè)版本中引入了 Spring 預(yù)先(ahead-of-time,AOT)轉(zhuǎn)換的 Maven 和 Gradle 插件,這個(gè)插件會(huì)對(duì) Spring 應(yīng)用執(zhí)行預(yù)先轉(zhuǎn)換。

第一種轉(zhuǎn)換的目的是生成 GraalVM 原生配置(反射、資源、代理、原生鏡像選項(xiàng)),這是通過(guò)由 Andy Clement 設(shè)計(jì)和實(shí)現(xiàn)的一個(gè)特別棒的推斷引擎做到的,該引擎能夠理解 Spring 編程模型和基礎(chǔ)設(shè)施。例如,每個(gè)帶有 @Controller 注解的類,都會(huì)在生成的 reflect-config.json 文件中添加一個(gè)條目。

有些原生配置是無(wú)法推斷的,對(duì)于這些情況,Spring Native 引入了原生線索(native hint)注解(參見(jiàn) Javadoc 以了解詳情),這些注解允許 Spring Native 支持原生配置,這種方式比常規(guī)的基于 JSON 的原生鏡像配置更加可維護(hù)、類型安全和靈活。例如,Spring Native 對(duì) MySQL 驅(qū)動(dòng)支持就提供了線索注解,它們會(huì)在原生鏡像配置 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)
})
publicclassMySqlHintsimplementsNativeConfiguration{}

NativeConfiguration和其他動(dòng)態(tài)配置機(jī)制允許實(shí)現(xiàn)更加強(qiáng)大和動(dòng)態(tài)化的配置生成,但是需要注意它們的 API 在未來(lái)的版本中可能會(huì)有很大變化。

Spring開(kāi)發(fā)人員也可以直接在 @Configuration 或 @SpringBootApplication 類上添加應(yīng)用特定的原生線索注解,例如,對(duì)于使用 RestTemplate 或 WebClient 這樣的編程 API 序列化一個(gè) Book 類為 JSON:

@TypeHint(types=Book.class)
@SpringBootApplication
publicclassWebClientApplication{
//...
}

在使用預(yù)先轉(zhuǎn)換系統(tǒng)時(shí),最后一個(gè),可能也是最強(qiáng)大的一個(gè)機(jī)制就是根據(jù) Spring Boot 部署模型和 GraalVM 原生鏡像特征所引入的封閉世界(closed-world)假設(shè),它能夠自動(dòng)生成針對(duì)原生環(huán)境進(jìn)行優(yōu)化的代碼。這里的目標(biāo)就是限制所需的外部原生配置的數(shù)量,從而提高兼容性,這是通過(guò)原生鏡像編譯器對(duì)代碼結(jié)構(gòu)的分析實(shí)現(xiàn)的,同時(shí)還能通過(guò)減少反射、資源或代理所需的配置,降低資源占用。一個(gè)具體的例子就是對(duì)各種 spring.factory(Spring Boot 背后的擴(kuò)展機(jī)制)的預(yù)先轉(zhuǎn)換,從而實(shí)現(xiàn)一個(gè)優(yōu)化過(guò)的程序版本,該版本不需要反射并且會(huì)過(guò)濾掉應(yīng)用上下文中不必要的條目。

對(duì) Spring AOT來(lái)說(shuō),這只是一個(gè)開(kāi)始,我們計(jì)劃添加更加強(qiáng)大的轉(zhuǎn)換,比如將 @Configuration 替換為函數(shù)式配置,從而通過(guò)預(yù)先分析替換運(yùn)行時(shí)反射,能夠自動(dòng)生成使用像 lambda 表達(dá)式和方法引用這種程序構(gòu)造的配置類。這樣的話,就能允許 GraalVM 原生鏡像編譯器立即理解 Spring 配置,無(wú)需任何的反射配置或 *.class 資源。

需要記住的一個(gè)關(guān)鍵點(diǎn)是,在使用 Spring Native 時(shí),這個(gè) AOT 生成的代碼在 JVM 上也會(huì)默認(rèn)使用,這樣的話能夠通過(guò) JVM 允許的短反饋循環(huán)(short feedback loop),用調(diào)試器和所有常規(guī)工具實(shí)現(xiàn)“原生友好的代碼路徑”。

盡管Spring AOT轉(zhuǎn)換目前主要是由原生場(chǎng)景需求驅(qū)動(dòng),但是有很多轉(zhuǎn)換并不是特定于原生場(chǎng)景的,有一些可能為 JVM 上運(yùn)行的 Spring Boot 應(yīng)用提供優(yōu)化。和往常一樣,對(duì)于這種主題,重要的是要以數(shù)據(jù)為驅(qū)動(dòng),所以我們會(huì)衡量效率和性能來(lái)驅(qū)動(dòng)我們的決策。

我們很可能會(huì)完善 IDE 集成,目前請(qǐng)務(wù)必閱讀相關(guān)文檔,了解潛在的手動(dòng)配置步驟,以便在 IDE 中運(yùn)行應(yīng)用程序之前更新生成的源碼。

5. 結(jié)論

在支持原生方面,Spring 有兩個(gè)支柱性的策略。第一個(gè)是在不需要對(duì)現(xiàn)有的數(shù)百萬(wàn)個(gè) Spring Boot 應(yīng)用進(jìn)行重大改動(dòng)的情況下,對(duì) Spring 基礎(chǔ)架構(gòu)進(jìn)行調(diào)整以適應(yīng)原生。這包括在 Spring 頂層項(xiàng)目中為實(shí)現(xiàn)原生友好而做出的改變,像 @NativeHint 這樣的基礎(chǔ)架構(gòu),以及在 Spring Native 中逐漸成熟的 Spring AOT 構(gòu)建插件。

第二個(gè)支柱比Spring本身的范圍更廣,原生是一個(gè)與 JVM 特性有所差異的平臺(tái),但 Java 生態(tài)系統(tǒng)需要盡可能地保持一致,以避免出現(xiàn)兩種截然不同的 Java 風(fēng)格,如果這樣的話,將會(huì)是維護(hù)上的一個(gè)挑戰(zhàn)。


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14259
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    12168
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    888

    瀏覽量

    27812

原文標(biāo)題:Spring 干掉原生 JVM?!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    java spring教程

    java spring教程理解Spring 實(shí)現(xiàn)原理掌握Spring IOC,AOP掌握Spring的基礎(chǔ)配置和用法熟練使用SSH開(kāi)發(fā)項(xiàng)目Sprin
    發(fā)表于 09-11 11:09

    什么是java spring

    什么是java springSpring是一個(gè)開(kāi)源框架,它由Rod Johnson創(chuàng)建。它是為了解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性而創(chuàng)建的。Spring使用基本的JavaBean來(lái)完成以前只可能由EJB完成
    發(fā)表于 09-11 11:16

    進(jìn)擊的 Java ,云原生時(shí)代的蛻變

    /spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar# Start and stop the JVM
    發(fā)表于 09-17 15:54

    jvm參數(shù)配置問(wèn)題怎么解決

    jvm參數(shù)配置問(wèn)題
    發(fā)表于 05-05 17:29

    Jvm的整體結(jié)構(gòu)和特點(diǎn)

    中都能夠?qū)崿F(xiàn)。在計(jì)算機(jī)中創(chuàng)建虛擬機(jī)時(shí),需要將實(shí)體機(jī)的部分硬盤和內(nèi)存容量作為虛擬機(jī)的硬盤和內(nèi)存容量。每個(gè)虛擬機(jī)都有獨(dú)立的CMOS、硬盤和操作系統(tǒng),可以像使用實(shí)體機(jī)一樣對(duì)虛擬機(jī)進(jìn)行操作。  2、JVM
    發(fā)表于 01-05 17:23

    spring教程ppt

    主要內(nèi)容Spring 概述Spring 整體結(jié)構(gòu)Spring實(shí)例Spring核心概念介紹控制反轉(zhuǎn)(IOC)依賴注入(DI)
    發(fā)表于 09-11 11:00 ?138次下載
    <b class='flag-5'>spring</b>教程ppt

    Spring認(rèn)證_什么是Spring GraphQL

    Spring GraphQL 為構(gòu)建在 GraphQL Java 上的 Spring 應(yīng)用程序提供支持。兩個(gè)團(tuán)隊(duì)之間的聯(lián)合聯(lián)合。我們的共同理念是少固執(zhí)己見(jiàn),更專注于全面和廣泛的支持。 Spring
    的頭像 發(fā)表于 08-06 14:30 ?617次閱讀
    <b class='flag-5'>Spring</b>認(rèn)證_什么是<b class='flag-5'>Spring</b> GraphQL

    Spring認(rèn)證」什么是Spring GraphQL?

    這個(gè)項(xiàng)目建立在 Boot 2.x 上,但它應(yīng)該與最新的 Boot2.4.x5 相關(guān)。 要?jiǎng)?chuàng)建項(xiàng)目,請(qǐng)轉(zhuǎn)到start.spring.io并為要使用的GraphQL傳輸選擇啟動(dòng)器: 啟動(dòng)機(jī) 運(yùn)輸 執(zhí)行
    的頭像 發(fā)表于 08-10 14:08 ?728次閱讀
    「<b class='flag-5'>Spring</b>認(rèn)證」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring認(rèn)證是什么?

    Spring?Certified?Professional?2022 Spring Professional認(rèn)證旨在測(cè)試和驗(yàn)證學(xué)生對(duì) SpringSpring Boot核心方面的
    的頭像 發(fā)表于 07-04 10:19 ?1206次閱讀
    <b class='flag-5'>Spring</b>認(rèn)證是什么?

    強(qiáng)大的Spring Boot 3.0要來(lái)了

    和 Bugfix。 Spring Boot 3.0 的開(kāi)發(fā)工作始于實(shí)驗(yàn)性的 Spring Native,旨在為 GraalVM 原生鏡像提供支持。 在該版本中,開(kāi)發(fā)者現(xiàn)在可以使用標(biāo)準(zhǔn) Spri
    的頭像 發(fā)表于 10-31 11:17 ?1417次閱讀

    JVM內(nèi)存布局詳解

    JVM內(nèi)存布局規(guī)定了Java在運(yùn)行過(guò)程中內(nèi)存申請(qǐng)、分配、管理的策略,保證了JVM的穩(wěn)定高效運(yùn)行。不同的JVM對(duì)于內(nèi)存的劃分方式和管理機(jī)制存在部分差異。結(jié)合JVM虛擬機(jī)規(guī)范,一起來(lái)探討
    的頭像 發(fā)表于 04-26 10:10 ?441次閱讀
    <b class='flag-5'>JVM</b>內(nèi)存布局詳解

    Spring Kafka的各種用法

    最近業(yè)務(wù)上用到了Spring Kafka,所以系統(tǒng)性的探索了下Spring Kafka的各種用法,發(fā)現(xiàn)了很多實(shí)用的特性,下面介紹下Spring Kafka的消息重試機(jī)制。 0. 前言 原生
    的頭像 發(fā)表于 09-25 17:04 ?809次閱讀

    Spring Boot 3.2支持虛擬線程和原生鏡像

    Spring Boot 3.2 前幾日發(fā)布,讓我們用 Java 21、GraalVM 和虛擬線程來(lái)嘗試一下。
    的頭像 發(fā)表于 11-30 16:22 ?584次閱讀

    jvm調(diào)優(yōu)參數(shù)

    JVM(Java虛擬機(jī))是Java程序的運(yùn)行環(huán)境,它負(fù)責(zé)解釋Java字節(jié)碼并執(zhí)行相應(yīng)的指令。為了提高應(yīng)用程序的性能和穩(wěn)定性,我們可以調(diào)優(yōu)JVM的參數(shù)。 JVM調(diào)優(yōu)主要涉及到堆內(nèi)存、垃圾收集器、線程棧
    的頭像 發(fā)表于 12-05 11:29 ?518次閱讀

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    JVM(Java虛擬機(jī))參數(shù)的設(shè)置和調(diào)優(yōu)對(duì)于提高Java應(yīng)用程序的性能和穩(wěn)定性非常重要。在本文中,我們將詳細(xì)介紹JVM參數(shù)的設(shè)置和調(diào)優(yōu)方法。 一、JVM參數(shù)的設(shè)置 內(nèi)存參數(shù): -Xms:設(shè)置J
    的頭像 發(fā)表于 12-05 11:36 ?1046次閱讀