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

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

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

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

jf_ro2CN3Fa ? 來源:medium.com ? 2023-11-30 16:22 ? 次閱讀

來源:medium.com/@egorponomarev

Spring Boot 3.2 前幾日發(fā)布,讓我們用 Java 21、GraalVM 和虛擬線程來嘗試一下。

Spring Boot 3.2 支持:

Java 21

虛擬線程

原生鏡像(自 2022 年 11 月 Spring Boot 3.0 發(fā)布以來,Spring Boot 已在生產(chǎn)環(huán)境中支持 GraalVM 原生鏡像)

Java 21

我們期待 2023 年 9 月 19 日發(fā)布的 Java 21,Spring Boot 3.2 已經(jīng)做到完全支持了。

正如所聲明的那樣,Java 21 提供了數(shù)千項(xiàng)性能、穩(wěn)定性和安全性改進(jìn),包括平臺增強(qiáng)功能,可幫助開發(fā)人員提高生產(chǎn)力并推動整個(gè)組織的創(chuàng)新和增長。

虛擬線程

更重要的更新之一是虛擬線程,這是 Project Loom 提供的功能。我們不打算深入細(xì)節(jié),官方 JEP 提供了很好的解釋:

GraalVM 和本機(jī)鏡像

GraalVM 是一種高性能 JDK,可以使用替代的即時(shí) (JIT) 編譯器來加快 Java 和基于 JVM 的應(yīng)用程序的性能。

Native Image 是一種提前將 Java 代碼編譯為獨(dú)立可執(zhí)行文件(稱為本機(jī)映像)的技術(shù)。該可執(zhí)行文件包括應(yīng)用程序類、其依賴項(xiàng)中的類、運(yùn)行時(shí)庫類以及來自 JDK 的靜態(tài)鏈接本機(jī)代碼。

它不在 Java VM 上運(yùn)行,但包含來自不同運(yùn)行時(shí)系統(tǒng)的必要組件,如內(nèi)存管理、線程調(diào)度等。與 JVM 相比,生成的程序具有更快的啟動時(shí)間和更低的運(yùn)行時(shí)內(nèi)存開銷。

嘗鮮一下

讓我們從安裝 Java 21.0.1 graal 開始,最簡單的方法是使用SDKMAN 并將其指定為您機(jī)器的默認(rèn) Java 版本:

sdk install java 21.0.1-graal

sdk default java 21.0.1-graal

另一種安裝方法是手動下載

我們將使用Spring Initializr頁面創(chuàng)建一個(gè)新的Spring Boot項(xiàng)目,使用 Spring Boot 3.2.0、Java 21、Gradle-Groovy以及Spring Web和GraalVM本地支持依賴項(xiàng)。

要在 Spring Boot 3.2 中啟用虛擬線程,我們只需在 application.yml 或 application.properties 文件中設(shè)置一個(gè)屬性:

spring.threads.virtual.enabled:true

這個(gè)配置起到的作用:

Tomcat 將使用虛擬線程來處理 HTTP 請求。這意味著處理 Web 請求的應(yīng)用程序代碼(例如控制器中的方法)將在虛擬線程上運(yùn)行。

調(diào)用@Async方法時(shí),Spring MVC 的異步請求處理和 Spring WebFlux 的阻塞執(zhí)行支持現(xiàn)在將利用虛擬線程

標(biāo)記有@Scheduled的方法將在虛擬線程上運(yùn)行

因此,我們將嘗試使用這 3 個(gè)集成來實(shí)現(xiàn)虛擬線程。

此外,一些特定的集成將在虛擬線程上工作,例如 RabbitMQ/Kafka 監(jiān)聽器,以及 Spring Data Redis/Apache pulsar 相關(guān)的集成。但這些集成超出了本文的范圍,有興趣的可以參考 Spring Boot 3.2 官方示例。

代碼

1.對于 Tomcat 傳入的 HTTP 請求,我們創(chuàng)建一個(gè)簡單的控制器:

@RestController
@RequestMapping("/test")
publicclassTestController{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(TestController.class);

@GetMapping
publicvoidtest(){
log.info("Restcontrollermethodhasbeencalled{}",Thread.currentThread());
}
}

2.異步任務(wù)

我們將在應(yīng)用程序啟動時(shí)調(diào)用其“run”方法

@Component
publicclassAsyncTaskExecutorService{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(AsyncTaskExecutorService.class);

@Async
publicvoidrun(){
log.info("Asynctaskmethodhasbeencalled{}",Thread.currentThread());
}
}

3.Scheduled 定時(shí)任務(wù)

一個(gè)簡單的方法,每 15 秒調(diào)用一次

@Component
publicclassSchedulerService{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(SchedulerService.class);

@Scheduled(fixedDelayString="15000")
publicvoidrun(){
log.info("Scheduledmethodhasbeencalled{}",Thread.currentThread());
}
}

讓我們運(yùn)行我們的應(yīng)用程序:

./gradlewbootRun

并調(diào)用我們的端點(diǎn)

curl—位置—請求GET'localhost:8085/test'

我們得到什么:

StartingAppApplicationusingJava21.0.1withPID38126
StartedAppApplicationin1.131seconds(processrunningfor1.491)
AsynctaskmethodhasbeencalledVirtualThread[#52,task-1]/runnable@ForkJoinPool-1-worker-5
ScheduledmethodhasbeencalledVirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
RestcontrollermethodhasbeencalledVirtualThread[#62,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1
ScheduledmethodhasbeencalledVirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1

我們可以看到我們的方法的日志鏈接到公共 ForkJoinPool 線程池。

根據(jù)JEP:預(yù)期行為:

JDK 的虛擬線程調(diào)度程序是一個(gè)工作竊取的 ForkJoinPool,它以 FIFO 模式運(yùn)行。調(diào)度程序的并行度是可用于調(diào)度虛擬線程的平臺線程的數(shù)量。

現(xiàn)在讓我們在 GraalVM 上運(yùn)行它。

首先,我們需要構(gòu)建一個(gè) GraalVM 本機(jī)映像:(此命令可能需要幾分鐘)然后運(yùn)行:(使用您的應(yīng)用程序的名稱而不是“app”)

./gradlewnativeCompile

./build/native/nativeComplie/app

它也可以工作,并且啟動時(shí)間要快得多,這符合聲明的“與 JVM 相比,生成的程序具有更快的啟動時(shí)間和更低的運(yùn)行時(shí)內(nèi)存開銷”。

在這里您可以找到包含本文中使用的代碼的存儲庫來源

結(jié)論

Spring Boot 3.2 是我們一直在等待的東西!具有虛擬線程的本機(jī)映像允許我們編寫能夠提供與 Go 類似級別的性能和可擴(kuò)展性的代碼,從而保持 JVM 的強(qiáng)大生態(tài)系統(tǒng)。

但是,您必須考慮到并非所有庫都已采用其代碼來與虛擬線程正常工作(在大多數(shù)情況下,它正在用 ReentrantLock 替換“synchronize”塊),您應(yīng)該小心虛擬線程將使用的邏輯。

審核編輯:湯梓紅

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

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104477
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    503

    瀏覽量

    19634
  • 鏡像
    +關(guān)注

    關(guān)注

    0

    文章

    160

    瀏覽量

    10689
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    161

原文標(biāo)題:Spring Boot 3.2 正式發(fā)布,開箱即用的虛擬線程和 GraalVM,嘗鮮一下!

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

收藏 人收藏

    評論

    相關(guān)推薦

    Spring Boot如何實(shí)現(xiàn)異步任務(wù)

    ,用來告訴 Spring 這個(gè)方法是一個(gè)異步方法,Spring 會將這個(gè)方法的執(zhí)行放在異步線程中進(jìn)行。使用 @Async 注解需要滿足以下條件: 需要在 Spring
    的頭像 發(fā)表于 09-30 10:32 ?1380次閱讀

    Spring Boot虛擬線程和Webflux性能對比

    早上看到一篇關(guān)于Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯(cuò)。內(nèi)容較長,抓重點(diǎn)給大家介紹一下這篇文章的核心內(nèi)容,方便大家快速閱讀。
    發(fā)表于 09-24 14:54 ?830次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>虛擬</b><b class='flag-5'>線程</b>和Webflux性能對比

    使用Spring Boot 3.2虛擬線程搭建靜態(tài)文件服務(wù)器

    Spring Boot 3.2 于 2023 年 11 月大張旗鼓地發(fā)布,標(biāo)志著 Java 開發(fā)領(lǐng)域的一個(gè)關(guān)鍵時(shí)刻。這一突破性的版本引入了一系列革命性的功能。
    的頭像 發(fā)表于 01-09 09:34 ?1070次閱讀
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> <b class='flag-5'>3.2</b><b class='flag-5'>虛擬</b><b class='flag-5'>線程</b>搭建靜態(tài)文件服務(wù)器

    請問6455支持對16位flash操作嗎?

    求教!最近在使用6455,EMIF的CE3空間接了16位的flash用來boot程序。第一個(gè)問題6455支持對16位flash操作嗎?我用的異步16位通信方式,不能正確操作flash,我從網(wǎng)上沒有
    發(fā)表于 01-22 07:42

    CH9121的虛擬串口軟件在哪?CH9120支持嗎?

    CH9121的虛擬串口軟件在哪?CH9120支持
    發(fā)表于 10-17 06:45

    Spring Boot從零入門1 詳述

    在開始學(xué)習(xí)Spring Boot之前,我之前從未接觸過Spring相關(guān)的項(xiàng)目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計(jì)也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?592次閱讀

    Spring Boot特有的實(shí)踐

    Spring Boot是最流行的用于開發(fā)微服務(wù)的Java框架。在本文中,我將與你分享自2016年以來我在專業(yè)開發(fā)中使用Spring Boot所采用的最佳實(shí)踐。這些內(nèi)容是基于我的個(gè)人經(jīng)驗(yàn)
    的頭像 發(fā)表于 09-29 10:24 ?860次閱讀

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

    和 Bugfix。 Spring Boot 3.0 的開發(fā)工作始于實(shí)驗(yàn)性的 Spring Native,旨在為 GraalVM 原生鏡像提供
    的頭像 發(fā)表于 10-31 11:17 ?1652次閱讀

    用這4招 優(yōu)雅的實(shí)現(xiàn)Spring Boot異步線程間數(shù)據(jù)傳遞

    Spring Boot 自定義線程池實(shí)現(xiàn)異步開發(fā)相信看過陳某的文章都了解,但是在實(shí)際開發(fā)中需要在父子線程之間傳遞一些數(shù)據(jù),比如用戶信息,鏈路信息等等
    的頭像 發(fā)表于 01-30 10:40 ?1096次閱讀

    MEXE02支持軟件介紹

    MEXE02支持軟件介紹
    的頭像 發(fā)表于 03-09 15:16 ?1926次閱讀
    MEXE02<b class='flag-5'>支持</b>軟件介紹

    Spring干掉原生JVM?

    這意味著,除了 Spring 誕生以來就支持的 Java 虛擬機(jī),官方添加了使用 GraalVM 將 Spring 應(yīng)用編譯成原生
    的頭像 發(fā)表于 05-05 09:25 ?511次閱讀
    <b class='flag-5'>Spring</b>干掉<b class='flag-5'>原生</b>JVM?

    Spring Boot Actuator快速入門

    不知道大家在寫 Spring Boot 項(xiàng)目的過程中,使用過 Spring Boot Actuator 嗎?知道 Spring
    的頭像 發(fā)表于 10-09 17:11 ?591次閱讀

    Spring Boot啟動 Eureka流程

    在上篇中已經(jīng)說過了 Eureka-Server 本質(zhì)上是一個(gè) web 應(yīng)用的項(xiàng)目,今天就來看看 Spring Boot 是怎么啟動 Eureka 的。 Spring Boot 啟動 E
    的頭像 發(fā)表于 10-10 11:40 ?839次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot的啟動原理

    可能很多初學(xué)者會比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴打包成一個(gè)獨(dú)立的 Jar 包,因?yàn)閭鹘y(tǒng)的 Java 項(xiàng)目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?597次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot 的設(shè)計(jì)目標(biāo)

    什么是Spring Boot Spring BootSpring 開源組織下的一個(gè)子項(xiàng)目,也是 S
    的頭像 發(fā)表于 10-13 14:56 ?541次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計(jì)目標(biāo)