日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

给新手看的 Micronaut 入门教程,10 分钟写出一个 Micronaut 程序

發(fā)布時(shí)間:2024/4/14 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 给新手看的 Micronaut 入门教程,10 分钟写出一个 Micronaut 程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下內(nèi)容均選自 Micronaut 入門實(shí)戰(zhàn):基于 JVM 的微服務(wù)框架 。

Micronaut是什么?

Micronaut 是一個(gè)現(xiàn)代化的基于 JVM 的全??蚣?#xff0c;用于構(gòu)建模塊化且易于測試的微服務(wù)或無服務(wù)程序。

同時(shí),Micronaut 使用 Netty,并且對響應(yīng)式編程提供一流的支持。對于 JVM 領(lǐng)域的全棧框架來說,Micronaut 是一個(gè)非常有前途的新成員。

Micronaut 旨在提供構(gòu)建微服務(wù)所需要的一切工具,包含:

  • 依賴注入(DI)和控制翻轉(zhuǎn)(IoC)。
  • 合理的默認(rèn)值和自動(dòng)配置。
  • 配置及配置共享。
  • 服務(wù)發(fā)現(xiàn)。
  • HTTP 路由。
  • 具有負(fù)載均衡的 HTTP 客戶端。

同時(shí),Micronaut 也致力于避免像 Spring、Spring Boot 和 Grails 中的弊端,通過:

  • 快速啟動(dòng)。
  • 減少內(nèi)存占用。
  • 極少的反射使用。
  • 極少的代理使用。
  • 簡單的單元測試。

在以前,像 Spring 和 Grails 這些框架并不是被設(shè)計(jì)來在 server-less、安卓 Apps 或低內(nèi)存占用的場景中運(yùn)行。相反,Micronaut 則是為此而生。

Micronaut 通過使用 Java 的 annotation processor 來實(shí)現(xiàn)以上功能,annotation processor 可以在任何支持其的 JVM 上使用,包括在使用 Netty 構(gòu)建的 HTTP Server 和 Client 上。

為了提供和 Spring 以及 Grails 相似的編程模型,這些 annotation processor 預(yù)編譯了必要的元數(shù)據(jù)(Metadata)來進(jìn)行依賴注入、定義 AOP 代理以及配置你的應(yīng)用程序,使其能夠在微服務(wù)環(huán)境中運(yùn)行。

創(chuàng)建第一個(gè) Micronaut 程序

接下來將要?jiǎng)?chuàng)建我們的第一個(gè) Micronaut 程序,內(nèi)容包括提供一個(gè) /hello API 接口以及相應(yīng)的測試類。

然后,使用 GraalVM 提供的 native image 將程序構(gòu)建為一個(gè)可運(yùn)行的二進(jìn)制文件。

▲創(chuàng)建程序

Micronaut 提供了一個(gè) CLI(Command Line Interface,命令行接口)讓我們可以方便快速地創(chuàng)建一個(gè) Micronaut 程序。這個(gè) CLI 包含了用于生成指定類型項(xiàng)目的命令,可以選擇項(xiàng)目的構(gòu)建工具、測試框架甚至是程序使用的語言。同時(shí),它也提供了生成代碼(如:Controller、Client Interface 和 Serverless Functions)的命令。詳情可參考官網(wǎng)文檔 Micronaut CLI。

下面我們來使用 Micronaut CLI 來創(chuàng)建程序,在實(shí)驗(yàn)樓 WebIDE 終端中執(zhí)行以下命令:

mn create-app example.micronaut.complete
  • mn 用于調(diào)用 Micronaut 的 CLI。
  • create-app 即表明要?jiǎng)?chuàng)建一個(gè) Micronaut 程序。默認(rèn)情況下,create-app 會(huì)創(chuàng)建一個(gè) Java Micronaut 程序,并使用 Gradle 構(gòu)建系統(tǒng)。但你也可以使用其他的構(gòu)建工具(如:Maven)和語言(如:Groovy 和 Kotlin)。
  • example.micronaut.complete 作為參數(shù),指定了程序的默認(rèn)包名和程序名,最后一個(gè) . 號前面的內(nèi)容將作為包名(此處即:example.micronaut),后面的內(nèi)容將作為文件夾名(此處即:complete)。

執(zhí)行后的結(jié)果如下:

注意:以后的實(shí)驗(yàn)中,如無特殊說明,都將在 /home/project 目錄下創(chuàng)建程序。

Application

Application.java 文件被用于使用 Gradle 或部署時(shí)運(yùn)行程序,你也可以通過直接執(zhí)行該類的 main() 函數(shù)來直接運(yùn)行程序。其代碼如下:

package example.micronaut;import io.micronaut.runtime.Micronaut;public class Application {public static void main(String[] args) {Micronaut.run(Application.class);} }

▲編寫代碼

Controller

為了創(chuàng)建一個(gè)能夠響應(yīng)并返回 “Hello World” 的微服務(wù),首先我們需要?jiǎng)?chuàng)建一個(gè) Controller。

在 src/main/java/example/micronaut 目錄下創(chuàng)建 HelloController.java 文件,編寫代碼如下:

package example.micronaut;import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Produces;@Controller("/hello") // ① public class HelloController {@Get // ②@Produces(MediaType.TEXT_PLAIN) // ③public String index() {return "Hello World"; // ④} }

為了便于查看,我們在程序中用數(shù)字來標(biāo)注,然后在下方給予解釋,序號一一對應(yīng)。

  • 在這里,我們使用 @Controller 注解定義了一個(gè) Controller,并把它映射到 /hello 路徑。
  • @Get 注解用于將 index() 方法和所有 HTTP GET 的請求進(jìn)行映射。
  • 在默認(rèn)情況下,Micronaut 程序的響應(yīng)會(huì)使用 application/json 作為 Content-Type。這里我們返回一個(gè)字符串類型的數(shù)據(jù),不是 JSON,所以設(shè)置為 text/plain。
  • 返回字符串 “Hello World” 作為請求響應(yīng)結(jié)果。
  • 注:后續(xù)實(shí)驗(yàn)中,如無特殊說明的情況下,在編寫程序時(shí),默認(rèn)使用 src/main/java/example/micronaut 作為目錄。

    如:創(chuàng)建 HelloController.java 文件。

    即:在 src/main/java/example/micronaut 目錄下創(chuàng)建 HelloController.java 文件。

    Test

    接著我們創(chuàng)建一個(gè) Junit 的測試來驗(yàn)證當(dāng)我們對 /hello 進(jìn)行一次 GET 請求時(shí),是否會(huì)得到 Hello World 作為響應(yīng)。

    在 src/test/java/example/micronaut 目錄下創(chuàng)建 HelloControllerTest.java 文件,編寫代碼如下:

    package example.micronaut;import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull;import io.micronaut.http.HttpRequest; import io.micronaut.http.client.RxHttpClient; import io.micronaut.http.client.annotation.Client; import io.micronaut.test.annotation.MicronautTest; import org.junit.jupiter.api.Test;import javax.inject.Inject;@MicronautTest // ① public class HelloControllerTest {@Inject@Client("/")RxHttpClient client; // ②@Testpublic void testHello() {HttpRequest<String> request = HttpRequest.GET("/hello"); // ③String body = client.toBlocking().retrieve(request);assertNotNull(body);assertEquals("Hello World", body);} }
  • 對類使用 @MicronautTest 注解,這樣 Micronaut 會(huì)初始化 Application Context 和 Embedded Server。
  • 注射 RxHttpClient 的 bean,用于執(zhí)行 HTTP 請求來訪問 Controller。
  • 使用 Micronaut 提供的 API 創(chuàng)建 HTTP 請求。
  • ▲運(yùn)行程序

    測試程序

    在運(yùn)行程序之前,最好的做法是先進(jìn)行測試。在實(shí)驗(yàn)樓 WebIDE 終端中執(zhí)行以下命令進(jìn)行測試。

    # 進(jìn)入項(xiàng)目的目錄 cd /home/project/complete # 測試 ./gradlew test

    執(zhí)行的結(jié)果如下所示。

    運(yùn)行程序

    在實(shí)驗(yàn)樓 WebIDE 終端中使用以下命令可以讓程序在 8080 端口運(yùn)行。

    ./gradlew run

    當(dāng)控制臺顯示內(nèi)容如下時(shí),表明程序已經(jīng)處于運(yùn)行狀態(tài)中。

    接著,打開 Web 服務(wù),在地址欄末尾添加 /hello 來訪問我們的 /hello API。結(jié)果如下。

    如果要停止程序運(yùn)行,按下 Ctrl + C 即可。

    ▲使用 GraalVM 生成 Native Image

    我們將使用 GraalVM,一個(gè)多語言可嵌入的虛擬機(jī),來為我們的程序生成一個(gè) Native Image(本地鏡像)。

    Native Images 用到了 GraalVM 的 ahead-of-time 技術(shù)為基于 JVM 的應(yīng)用改善啟動(dòng)時(shí)間并減少內(nèi)存占用。

    ▲Micronaut + GraalVM 的變化

    Micronaut 本身不依賴反射或動(dòng)態(tài)類加載,所以可以很好地適配 GraalVM Native。

    首先,添加 Micronaut Graal 的注解處理器來用于生成 native-image 工具要使用的 reflection-config.json 元數(shù)據(jù)。

    打開項(xiàng)目的 build.gradle 文件,追加以下依賴。

    dependencies {annotationProcessor "io.micronaut:micronaut-graal" }

    GraalVM Native Image 允許我們預(yù)編譯(ahead-of-time compile)Java 代碼來生成一個(gè)叫做本地鏡像(Native Image)的獨(dú)立可執(zhí)行文件。這個(gè)可執(zhí)行文件包含了程序本身、庫和 JDK,且不運(yùn)行在 Java 虛擬機(jī)上,但在另一個(gè)叫做 SVM(Substrate VM) 的虛擬機(jī)中包含了必要的組件,如內(nèi)存管理和線程調(diào)度。SVM 是運(yùn)行時(shí)組件的一個(gè)統(tǒng)稱,這些組件包括 deoptimizer_,_garbage collector 和 thread scheduling 等等。這使得生成的程序會(huì)比使用 Java 虛擬機(jī)時(shí)擁有更快的啟動(dòng)速度以及更低的內(nèi)存占用。

    我們需要在 build.gradle 中添加一個(gè) SVM 的依賴:

    dependencies {compileOnly "org.graalvm.nativeimage:svm:19.3.0" }

    為了使構(gòu)建鏡像更加簡潔,我們需要?jiǎng)?chuàng)建一個(gè) native-image.properties 文件。標(biāo)準(zhǔn)做法是使用 sra/main/resources/META-INF/native-image 文件夾并在該文件夾下創(chuàng)建一個(gè)遵循 Maven 坐標(biāo)來描述程序的文件夾。例如,我們的項(xiàng)目名設(shè)為 micronautguide,則應(yīng)創(chuàng)建 example.micronaut/micronautguide 文件夾。下面通過命令行的模式來進(jìn)行創(chuàng)建。

    # 進(jìn)入項(xiàng)目目錄 cd /home/project/complete # 創(chuàng)建文件夾 mkdir -p src/main/resources/META-INF/native-image/example.micronaut/micronautguide # 創(chuàng)建文件 touch src/main/resources/META-INF/native-image/example.micronaut/micronautguide/native-image.properties

    然后,在 native-image.properties 文件中編寫以下內(nèi)容。

    Args = -H:IncludeResources=logback.xml|application.yml \-H:Name=micronautguide \-H:Class=example.micronaut.Application
    • -H:IncludeResources:參數(shù)允許我們設(shè)置包括哪些靜態(tài)資源,可以使用正則表達(dá)式。這里為 logback.xml 和 application.yml。
    • -H:Name:參與指定了生成的 Native Image 的名字,這里為 micronautguide。
    • -H:Class:參數(shù)指定了程序的入口(定義了 main() 方法的類)。這里為 example.micronaut.Application,即 Application.java 文件中的 main() 方法。

    ▲生成 Native Image

    為了生成 Native Image,我們需要先生成程序的 FAT JAR。

    在實(shí)驗(yàn)樓 WebIDE 終端中執(zhí)行以下命令。

    ./gradlew assemble

    執(zhí)行后的結(jié)果如下。

    然后開始生成 Native Image,生成鏡像的命令如下。

    native-image --no-server -cp build/libs/complete-0.1-all.jar
    • -no-server 選項(xiàng)表明不使用基于 server 的鏡像來構(gòu)建。

    重要提示

    構(gòu)建 Native Image 的開銷較大,由于實(shí)驗(yàn)樓的環(huán)境限制,標(biāo)準(zhǔn)環(huán)境下會(huì)因內(nèi)存不足而失敗。所以我們建議跳過構(gòu)建鏡像的步驟,下載我們提前構(gòu)建的 Native Image。同學(xué)可以在自己電腦上進(jìn)行嘗試。

    在實(shí)驗(yàn)樓 WebIDE 終端中執(zhí)行以下命令下載構(gòu)建好的鏡像。

    # 進(jìn)入項(xiàng)目目錄 cd /home/project/complete # 下載鏡像 wget https://labfile.oss.aliyuncs.com/courses/1511/micronautguide # 為文件添加可執(zhí)行權(quán)限 chmod +x ./micronautguide

    這里提供一下生成鏡像時(shí)的控制臺輸出截圖,可以看到在 1 核 4 G 的環(huán)境中花了 20 分鐘的時(shí)間。

    最后,讓我們來體驗(yàn)一下生成的鏡像的優(yōu)勢。在實(shí)驗(yàn)樓 WebIDE 中執(zhí)行以下命令運(yùn)行程序。

    ./micronautguide -Xmx68m

    執(zhí)行結(jié)果如下。

    可以看到程序比起之前啟動(dòng)的速度明顯提升了不少。新建一個(gè)控制臺(菜單欄 -> Terminal -> New Terminal),執(zhí)行以下命令來訪問 /hello API 接口。

    curl localhost:8080/hello

    執(zhí)行結(jié)果如下。


    你的第一個(gè)程序就完成啦,可在 Micronaut 入門實(shí)戰(zhàn):基于 JVM 的微服務(wù)框架 查看本節(jié)實(shí)驗(yàn)的源碼并繼續(xù)學(xué)習(xí)后面的內(nèi)容。

    總結(jié)

    以上是生活随笔為你收集整理的给新手看的 Micronaut 入门教程,10 分钟写出一个 Micronaut 程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 91在线视频网址 | 69精品人人 | 国产欧美一区二区三区视频在线观看 | 国产精品人 | 精品亚洲乱码一区二区 | 日韩在线www | 国产欧美一区二区精品忘忧草 | 少妇婷婷| 色播五月婷婷 | 少妇诱惑av | xxx视频网站 | 午夜精品剧场 | 五十路av | 玖玖伊人| 91夫妻视频 | 四虎黄色影视 | 国产欧美久久久久久 | 成人在线免费高清视频 | 精品人妻在线视频 | 久操视频在线观看 | av先锋资源 | 丰满女人又爽又紧又丰满 | 中文一区视频 | 黄色高清免费 | 日本黄色特级片 | 草草影院第一页yycc.com | 国产不卡一 | a∨鲁丝一区鲁丝二区鲁丝三区 | 国产乱在线| 亚洲婷婷在线视频 | 入禽太深免费视频 | 在线免费观看欧美大片 | 中文字幕日韩欧美在线 | 国产人妻久久精品一区二区三区 | 一女被多男玩喷潮视频 | 国产又粗又猛又爽又黄的视频一 | 成人影视在线播放 | 欧美日韩二区三区 | 亚洲精品伦理 | 精品一区二区三区毛片 | 在线视频亚洲色图 | 中文字幕在线观看视频免费 | 正在播放亚洲 | 欧美色图首页 | 国产一二区在线观看 | 国产女人在线 | 国产精品888| 久久国产网站 | 色妇网 | 亚洲天堂免费观看 | 亚洲精品视频导航 | 国产网站91 | 午夜性色福利视频 | 最新中文字幕免费 | 一区二区三区在线观看av | 一区二区三区四区欧美 | 怡红院精品视频 | 丁香花婷婷 | 裸体裸乳免费看 | 一二区免费视频 | www.日本黄| 伊人涩涩| 精品人妻久久久久一区二区三区 | 91 高清 在线 制服 偷拍 | 成年人网站黄色 | 少妇视频在线 | 国内免费精品视频 | 激情戏网站 | 欧美v日韩 | 99人妻少妇精品视频一区 | 成人动漫一区二区 | 波多野结衣国产 | 欧美激情在线观看 | 日本少妇色 | 人与动物av | 日韩欧美自拍 | 日韩精品一区二区三区高清免费 | 人人爽人人爽人人 | 国产精品福利一区 | 国产精品久久77777 | 亚洲色图制服诱惑 | 欧洲成人在线 | 日韩毛片大全 | 日本在线看| 日韩小视频在线观看 | wwwxxx在线播放 | 亚洲人成免费电影 | 国产91在线 | 亚洲 | 不卡视频一区二区三区 | 国产黄色网络 | 色窝窝无码一区二区三区 | 91毛片网站| 日本狠狠操 | 国产精品亚洲五月天丁香 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 扒开女人屁股进去 | 国产成人亚洲精品无码h在线 | 91精品亚洲一区 | 人人干av|