在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Spring干掉原生JVM?

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-05-05 09:25 ? 次閱讀


Spring 團隊日前發布了 Spring Native Beta 版。通過 Spring Native,Spring 應用將有機會與 GraalVM 原生鏡像的方式運行。為了更好地支持原生運行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了優化原生配置的注解。

最近,Spring 發布了 Spring Native 的 beta 版本,該功能已經在 start.spring.io 上可用了。

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

https://start.spring.io/

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

這些原生的 Spring 應用可以作為一個獨立的可執行文件進行部署(不需要安裝 JVM),并且還能提供有趣的特征,包括幾乎瞬時的啟動(一般會小于 100 毫秒)、瞬時的峰值性能以及更低的資源消耗,其代價是比 JVM 更長的構建時間和更少的運行時優化。

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

通過簡單的 mvn spring-boot:build-image 或 gradle bootBuildImage 命令,就能生成一個優化的容器鏡像,它包含了一個最小的操作系統層和一個小的原生可執行文件,該文件只包含了必需的東西即 JDK、Spring 以及應用中所使用的依賴。

請看下面這個最小的容器鏡像,它是一個 50MB 的可執行文件,包含了 Spring Boot、Spring MVC、Jackson、Tomcat、JDK 和應用本身。

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

這種原生方式,在很多場景下都會對 Spring 應用產生價值:

  • 使用 Spring Cloud Function 的 Serverless 應用
  • 更廉價、更可持續地托管 Spring 微服務
  • 與 VMware Tanzu 這樣的 Kubernetes 平臺有很好的契合性
  • 想要最優的容器鏡像,以打包 Spring 應用和服務

在使用場景上,比如 Piotr Mińkowski 提供了一個非常棒的指南,介紹了如何在 Knative 上使用 Spring Boot 和 GraalVM 構建原生微服務。

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

1. 團隊協作

Spring Native beta 是整個 Spring 團隊及其家族項目廣泛合作的結果:Spring Framework、Spring Boot 還包括 Spring Data、Spring Security、Spring Cloud 和 Spring Initializr。

據悉,原生功能的工作范圍比 Spring 更廣,因為原生涉及到更廣泛的 JVM 生態系統,所以官方一直在與 GraalVM 團隊合作,以改善原生鏡像的兼容性和資源消耗。

以下是來自 GraalVM 團隊的 Vojin Jovanovic 的一段話。

“與 Spring 團隊協作打造原生 JVM 生態系統是一件非常愉快的事情:他們深厚的技術知識,再加上對社區的敏感觸覺,總是能帶來最好的解決方案。最新的 Spring Native 版本,以及它在 JVM 生態系統中的眾多用法,為原生編譯的廣泛采用鋪平了道路。”

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

2. 支持的范圍

現在,Spring Native已經從alpha過渡到beta,那么很重要的一點就是明確他弄所支持的功能范圍。

Alpha是第一步,我們進行了大量試驗并完善了Spring Native(以前稱為Spring GraalVM Native)的體系結構,兼容性和對一系列樣本進行了重大更改的封裝。我們還報告了GraalVM團隊修復的許多問題,目的是縮小JVM與Spring應用程序的本機之間的差距。

雖然它仍被認為是實驗性的,但 beta 版意味著 Spring 現在在 Spring 生態系統的一個子集上提供了對原生的支持。如果你的應用正在使用業已支持的依賴,那么你可以試用它,在出現問題時可以提 bug 或貢獻 pull request。在最新的 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 等。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

3. start.spring.io

Stéphane Nicoll 在對 http://start.spring.io 和相關 IDE 的集成中,引入了對 Spring Native 的支持,所以現在這是探索如何使用 Spring 構建原生應用最簡單的方式。

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

添加 Spring Native 依賴后將會使用所需的依賴和插件自動配置 Maven 或 Gradle 項目,以便于支持原生。應用代碼本身沒有變化。

請檢查自動生成的 HELP.md 文件,該文件包含了有用的鏈接和文檔,同時它還能標記出來你是否選擇了一些在原生環境下不支持的依賴。

4. 預先轉換

原生與JVM有說不同:類路徑在構建時是固定的,反射或資源需要進行配置,這里沒有類的懶加載(可執行文件中包含的所有內容在啟動的時候都會加載進來)并且有些代碼可以在構建期調用。

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

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

有些原生配置是無法推斷的,對于這些情況,Spring Native 引入了原生線索(native hint)注解(參見 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)
})
publicclassMySqlHintsimplementsNativeConfiguration{}

NativeConfiguration和其他動態配置機制允許實現更加強大和動態化的配置生成,但是需要注意它們的 API 在未來的版本中可能會有很大變化。

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

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

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

對 Spring AOT來說,這只是一個開始,我們計劃添加更加強大的轉換,比如將 @Configuration 替換為函數式配置,從而通過預先分析替換運行時反射,能夠自動生成使用像 lambda 表達式和方法引用這種程序構造的配置類。這樣的話,就能允許 GraalVM 原生鏡像編譯器立即理解 Spring 配置,無需任何的反射配置或 *.class 資源。

需要記住的一個關鍵點是,在使用 Spring Native 時,這個 AOT 生成的代碼在 JVM 上也會默認使用,這樣的話能夠通過 JVM 允許的短反饋循環(short feedback loop),用調試器和所有常規工具實現“原生友好的代碼路徑”。

盡管Spring AOT轉換目前主要是由原生場景需求驅動,但是有很多轉換并不是特定于原生場景的,有一些可能為 JVM 上運行的 Spring Boot 應用提供優化。和往常一樣,對于這種主題,重要的是要以數據為驅動,所以我們會衡量效率和性能來驅動我們的決策。

我們很可能會完善 IDE 集成,目前請務必閱讀相關文檔,了解潛在的手動配置步驟,以便在 IDE 中運行應用程序之前更新生成的源碼。

5. 結論

在支持原生方面,Spring 有兩個支柱性的策略。第一個是在不需要對現有的數百萬個 Spring Boot 應用進行重大改動的情況下,對 Spring 基礎架構進行調整以適應原生。這包括在 Spring 頂層項目中為實現原生友好而做出的改變,像 @NativeHint 這樣的基礎架構,以及在 Spring Native 中逐漸成熟的 Spring AOT 構建插件。

第二個支柱比Spring本身的范圍更廣,原生是一個與 JVM 特性有所差異的平臺,但 Java 生態系統需要盡可能地保持一致,以避免出現兩種截然不同的 Java 風格,如果這樣的話,將會是維護上的一個挑戰。


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14887
  • JVM
    JVM
    +關注

    關注

    0

    文章

    160

    瀏覽量

    12524
  • 虛擬機
    +關注

    關注

    1

    文章

    962

    瀏覽量

    29069

原文標題:Spring 干掉原生 JVM?!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    java spring教程

    java spring教程理解Spring 實現原理掌握Spring IOC,AOP掌握Spring的基礎配置和用法熟練使用SSH開發項目Sprin
    發表于 09-11 11:09

    什么是java spring

    什么是java springSpring是一個開源框架,它由Rod Johnson創建。它是為了解決企業應用開發的復雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成
    發表于 09-11 11:16

    進擊的 Java ,云原生時代的蛻變

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

    Jvm的整體結構和特點

    中都能夠實現。在計算機中創建虛擬機時,需要將實體機的部分硬盤和內存容量作為虛擬機的硬盤和內存容量。每個虛擬機都有獨立的CMOS、硬盤和操作系統,可以像使用實體機一樣對虛擬機進行操作。  2、JVM
    發表于 01-05 17:23

    spring教程ppt

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

    Spring認證_什么是Spring GraphQL

    Spring GraphQL 為構建在 GraphQL Java 上的 Spring 應用程序提供支持。兩個團隊之間的聯合聯合。我們的共同理念是少固執己見,更專注于全面和廣泛的支持。 Spring
    的頭像 發表于 08-06 14:30 ?925次閱讀
    <b class='flag-5'>Spring</b>認證_什么是<b class='flag-5'>Spring</b> GraphQL

    Spring認證」什么是Spring GraphQL?

    這個項目建立在 Boot 2.x 上,但它應該與最新的 Boot2.4.x5 相關。 要創建項目,請轉到start.spring.io并為要使用的GraphQL傳輸選擇啟動器: 啟動機 運輸 執行
    的頭像 發表于 08-10 14:08 ?990次閱讀
    「<b class='flag-5'>Spring</b>認證」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring認證是什么?

    Spring?Certified?Professional?2022 Spring Professional認證旨在測試和驗證學生對 SpringSpring Boot核心方面的
    的頭像 發表于 07-04 10:19 ?1528次閱讀
    <b class='flag-5'>Spring</b>認證是什么?

    強大的Spring Boot 3.0要來了

    和 Bugfix。 Spring Boot 3.0 的開發工作始于實驗性的 Spring Native,旨在為 GraalVM 原生鏡像提供支持。 在該版本中,開發者現在可以使用標準 Spri
    的頭像 發表于 10-31 11:17 ?2244次閱讀

    JVM內存布局詳解

    JVM內存布局規定了Java在運行過程中內存申請、分配、管理的策略,保證了JVM的穩定高效運行。不同的JVM對于內存的劃分方式和管理機制存在部分差異。結合JVM虛擬機規范,一起來探討
    的頭像 發表于 04-26 10:10 ?690次閱讀
    <b class='flag-5'>JVM</b>內存布局詳解

    Spring Kafka的各種用法

    最近業務上用到了Spring Kafka,所以系統性的探索了下Spring Kafka的各種用法,發現了很多實用的特性,下面介紹下Spring Kafka的消息重試機制。 0. 前言 原生
    的頭像 發表于 09-25 17:04 ?1325次閱讀

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

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

    jvm的dump太大了怎么分析

    分析大型JVM dump文件可能會遇到的一些挑戰。首先,JVM dump文件通常非常大,可能幾百MB或幾個GB。這是因為它們包含了JVM的完整內存快照,包括堆和棧的所有對象和線程信息。分析這種大型
    的頭像 發表于 12-05 11:01 ?3333次閱讀

    jvm調優參數

    JVM(Java虛擬機)是Java程序的運行環境,它負責解釋Java字節碼并執行相應的指令。為了提高應用程序的性能和穩定性,我們可以調優JVM的參數。 JVM調優主要涉及到堆內存、垃圾收集器、線程棧
    的頭像 發表于 12-05 11:29 ?886次閱讀

    jvm參數的設置和jvm調優

    JVM(Java虛擬機)參數的設置和調優對于提高Java應用程序的性能和穩定性非常重要。在本文中,我們將詳細介紹JVM參數的設置和調優方法。 一、JVM參數的設置 內存參數: -Xms:設置J
    的頭像 發表于 12-05 11:36 ?2130次閱讀
    主站蜘蛛池模板: 你懂的网址在线观看 | 国产天天色 | 午夜男人网 | 午夜在线影院 | 国产高清一区二区三区四区 | 亚洲va中文字幕 | 在线视频免费观看 | 国产小视频在线观看 | 私色综合网 | 五月婷婷 六月丁香 | 操美女大逼逼 | 大量真实偷拍情侣视频野战 | 91在线免费看 | 啪啪午夜 | 午夜欧美精品久久久久久久 | 2017天天干夜夜操 | 婷婷综合久久中文字幕 | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 亚洲国产人久久久成人精品网站 | 国产传媒在线观看视频免费观看 | 福利影院在线 | 久久国产乱子伦精品免费一 | 亚洲国产福利精品一区二区 | 欧美日韩国产另类一区二区三区 | 久青草国产在线视频_久青草免 | 欧美mv日韩mv国产mv网站 | 日韩欧美一级 | 日本在线观看www | 爱操综合网 | ww在线观看| 日韩美女奶水喂男人在线观看 | 日本欧洲亚洲一区在线观看 | 亚洲视频一区二区 | h网站免费在线观看 | 欧美极品在线视频 | 亚洲酒色1314狠狠做 | 日本一区二区高清免费不卡 | 四虎在线观看免费永久 | 亚洲伊人tv综合网色 | 天天色天天射天天操 | 4hc44四虎www视频 |