成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

誰(shuí)才是微服務(wù)贏家:Quarkus 與 Spring Boot

開發(fā) 架構(gòu)
在容器時(shí)代(“ Docker 時(shí)代”),無(wú)論您是否在使用它,都不可否定java的活力。Java 在性能方面一直比較有優(yōu)勢(shì),主要是因?yàn)榇a和真實(shí)機(jī)器之間的抽象層,多平臺(tái)的成本(一次編寫,隨處運(yùn)行 - 還記得嗎?),其中包含 JVM -between(JVM:模擬真實(shí)機(jī)器所做的軟件機(jī)器)。

在容器時(shí)代(“Docker 時(shí)代”)Java 仍然處于領(lǐng)先地位,但哪個(gè)更好?Spring Boot 還是 Quarkus?

誰(shuí)會(huì)最先進(jìn)的?Spring Boot 或 Quarkus。

在容器時(shí)代(“ Docker 時(shí)代”),無(wú)論您是否在使用它,都不可否定java的活力。Java 在性能方面一直比較有優(yōu)勢(shì),主要是因?yàn)榇a和真實(shí)機(jī)器之間的抽象層,多平臺(tái)的成本(一次編寫,隨處運(yùn)行 - 還記得嗎?),其中包含 JVM -between(JVM:模擬真實(shí)機(jī)器所做的軟件機(jī)器)。

如今,使用微服務(wù)架構(gòu),也沒有任何優(yōu)勢(shì),為總是在同一個(gè)地方和平臺(tái)上運(yùn)行的東西(Docker 容器 - Linux) 環(huán)境構(gòu)建多平臺(tái)(解釋)的東西。可移植性現(xiàn)在不那么重要了(可能比以往任何時(shí)候都重要),那些額外的抽象級(jí)別并不重要。

話雖如此,讓我們對(duì)在Java中生成微服務(wù)的兩種替代方案進(jìn)行簡(jiǎn)單而原始的比較:非常知名的Spring Boot和不太知名的(尚未)Quarkus。

反對(duì)者

Quarkus是什么?

一套適用于GraalVM和 HotSpot的開源技術(shù) ,用于編寫 Java 應(yīng)用程序。它提供(承諾)超快的啟動(dòng)時(shí)間和更低的內(nèi)存占用。這使其成為容器和無(wú)服務(wù)器工作負(fù)載的理想選擇。它使用 Eclipse 微配置文件(JAX-RS、CDI、JSON-P),這是 Java EE 的一個(gè)子集來(lái)構(gòu)建微服務(wù)。

GraalVM 是一個(gè)通用的多語(yǔ)言虛擬機(jī)(JavaScript、Python、Ruby、R、Java、Scala、Kotlin)。 GraalVM (特別是 Substrate VM)使提前(AOT)編譯成為可能,將字節(jié)碼轉(zhuǎn)換為本地機(jī)器碼,從而生成可以本地執(zhí)行的二進(jìn)制文件。

請(qǐng)記住,并非所有功能都可以在本機(jī)執(zhí)行中使用,AOT 編譯有其局限性。注意這句話(引用 GraalVM 團(tuán)隊(duì)):

我們運(yùn)行需要一個(gè)封閉世界假設(shè)的激進(jìn)靜態(tài)分析,這意味著在運(yùn)行時(shí)可訪問(wèn)的所有類和所有字節(jié)碼必須在構(gòu)建時(shí)已知。

因此,例如,反射和 Java 本機(jī)接口 (JNI) 將不起作用,至少是開箱即用的(需要一些額外的工作)。您可以在本機(jī)圖像 Java 限制文檔中找到限制列表。

Spring Boot是什么?

這是真的嗎?好吧,我只想說(shuō)一句(請(qǐng)隨意跳過(guò)),一句話:Spring Boot構(gòu)建在 Spring Framework 事實(shí)上,是一個(gè)開源框架,它提供了一種更簡(jiǎn)單的方式來(lái)構(gòu)建、配置和運(yùn)行基于 Web 的 Java 應(yīng)用程序. 使其成為微服務(wù)的良好候選者。

戰(zhàn)斗準(zhǔn)備——?jiǎng)?chuàng)建 Docker 鏡像

Quarkus鏡像

讓我們創(chuàng)建 Quarkus 應(yīng)用程序,以便稍后將其包裝在 Docker 映像中。基本上,我們將做與 Quarkus入門教程相同的事情。

使用 Quarkus maven 原型創(chuàng)建項(xiàng)目:

mvn io.quarkus:quarkus-maven-plugin:1.0.0.CR2:create
-DprojectGroupId=ujr.combat.quarkus
-DprojectArtifactId=quarkus-echo
-DclassName="ujr.combat.quarkus.EchoResource"
-Dpath="/echo"

這將導(dǎo)致我們項(xiàng)目的結(jié)構(gòu),如下所示:

請(qǐng)注意,還創(chuàng)建了兩個(gè)示例Dockerfile (src/main/docker):一個(gè)用于普通JVM App Image,另一個(gè)用于Native App Image。

在生成的代碼中,我們只需要更改一件事,添加下面的依賴項(xiàng),因?yàn)槲覀円?JSON 內(nèi)容。

<dependency> 
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>

Quarkus 在整個(gè) RESTEasy 項(xiàng)目實(shí)現(xiàn)中使用 JAX-RS 規(guī)范。

這是我們的“整個(gè)”應(yīng)用程序:

這就是全部,使用下一個(gè)命令我們可以看到應(yīng)用程序正在運(yùn)行:

mvn clean compile quarkus:dev

在這種模式下,我們也開啟了熱部署,后臺(tái)編譯。讓我們做一個(gè)簡(jiǎn)單的測(cè)試來(lái)看看:

curl -sw "\n\n" http://localhost:8080/echo/ualter | jq .

現(xiàn)在我們看到它正在工作,讓我們創(chuàng)建 Docker 映像。從這里下載 GraalVM:https://github.com/graalvm/graalvm-ce-builds/releases 。

重要的! 不要下載最新版本 19.3.0,它與Quarkus 1.0不兼容,也許 Quarkus 1.1 會(huì)。現(xiàn)在應(yīng)該工作的版本是 GraalVM 19.2.1,得到這個(gè)。

配置其環(huán)境變量的主路徑:

## At macOS will be: export 
GRAALVM_HOME=/Users/ualter/Developer/quarkus/graalvm-ce-java8-19.2.1/Contents/Home/

然后在你的環(huán)境中安裝 GraalVM 的 Native Image:

$GRAALVM_HOME/bin/gu install native-image

讓我們?yōu)楫?dāng)前平臺(tái)生成本機(jī)版本(在這種情況下,將為 macOS 生成本機(jī)可執(zhí)行文件)。

mvn package -Pnative

quarkus-echo-1.0-SNAPSHOT-runner如果一切正常,我們可以在 ./target 文件夾中找到一個(gè)名為的文件。這是您的應(yīng)用程序的可執(zhí)行二進(jìn)制文件,您只需運(yùn)行以下命令即可啟動(dòng)它

./target/quarkus-echo-1.0-SNAPSHOT-runner:無(wú)需使用JVM(普通:java -cp app:lib/:etc App.jar*),它是一個(gè)本機(jī)可執(zhí)行二進(jìn)制文件。

讓我們?yōu)槲覀兊膽?yīng)用程序生成一個(gè) Native Docker Image。該命令將創(chuàng)建一個(gè) Native 鏡像,即帶有 Linux 原生可執(zhí)行應(yīng)用程序的 Docker 鏡像。默認(rèn)情況下,本機(jī)可執(zhí)行的文件是基于當(dāng)前平臺(tái) (macOS) 創(chuàng)建的,因?yàn)槲覀冎郎傻目蓤?zhí)行文件與容器 (Linux) 的平臺(tái)不同,我們將指示 Maven 構(gòu)建從在容器內(nèi),生成原生 docker 鏡像:

mvn package -Pnative -Dquarkus.native.container-build=true

此時(shí),一定要有一個(gè)Docker容器運(yùn)行時(shí),一個(gè)工作環(huán)境。

該文件將是一個(gè) 64 位 Linux 可執(zhí)行文件,因此很自然,這個(gè)二進(jìn)制文件無(wú)法在我們的 macOS 上運(yùn)行,它是為我們的 docker 容器映像構(gòu)建的。所以,繼續(xù)前進(jìn)......讓我們?nèi)ド?docker 圖像......

docker build -t ujr/quarkus-echo -f src/main/docker/Dockerfile.native . 
## Testing it...
docker run -i --name quarkus-echo --rm -p 8081:8081 ujr/quarkus-echo

附帶說(shuō)明,關(guān)于 Docker 映像大小:

最終的 docker 鏡像是115MB,但是你可以使用distroless 鏡像版本來(lái)制作一個(gè)很小的 Docker 鏡像。Distroless 映像僅包含您的應(yīng)用程序及其運(yùn)行時(shí)依賴項(xiàng),其他所有內(nèi)容(包管理器、shell 或標(biāo)準(zhǔn) Linux 發(fā)行版中常見的普通程序)都將被刪除。我們應(yīng)用程序的 Distroless 映像大小為42.3MB。該文件

./src/main/docker/Dockerfile.native-distroless有生成它的收據(jù)。

關(guān)于 Distroless Images: “*將運(yùn)行時(shí)容器中的內(nèi)容嚴(yán)格限制為應(yīng)用程序所需的內(nèi)容是Google和其他在生產(chǎn)環(huán)境中使用容器多年的科技巨頭采用的最佳實(shí)踐*”

spring boot鏡像

到此,想必大家都知道如何制作一個(gè)普通的Spring Boot Docker鏡像了,我們就略過(guò)細(xì)節(jié)吧?只是一個(gè)重要的觀察,代碼是完全相同的。更好的說(shuō)法是,幾乎相同,因?yàn)槲覀兪褂玫氖?Spring 框架注解,當(dāng)然。這是唯一的區(qū)別。您可以檢查提供的源代碼中的每個(gè)細(xì)節(jié)(下面的鏈接)。

mvn install dockerfile:build 
## Testing it...
docker run --name springboot-echo --rm -p 8082:8082 ujr/springboot-echo

戰(zhàn)爭(zhēng)

讓我們啟動(dòng)兩個(gè)容器,讓它們啟動(dòng)并運(yùn)行幾次,然后比較Startup Time和Memory Footprint。

在這個(gè)過(guò)程中,每個(gè)容器都被創(chuàng)建和銷毀 10 次。后來(lái),分析了它們的啟動(dòng)時(shí)間及其內(nèi)存占用。下面顯示的數(shù)字是基于所有這些測(cè)試的平均結(jié)果。

啟動(dòng)時(shí)間

顯然,當(dāng)涉及到可擴(kuò)展性和無(wú)服務(wù)器架構(gòu)時(shí),這方面可能會(huì)發(fā)揮重要作用。

關(guān)于 Serverless 架構(gòu),在此模型中,通常一個(gè)臨時(shí)容器將由事件觸發(fā)以執(zhí)行任務(wù)/功能。在云環(huán)境中,價(jià)格通常基于執(zhí)行次數(shù),而不是之前購(gòu)買的一些計(jì)算容量。因此,這里的 冷啟動(dòng)可能會(huì)影響這種類型的解決方案,因?yàn)槿萜?通常)只會(huì)在執(zhí)行其任務(wù)時(shí)才處于活動(dòng)狀態(tài)。

在可擴(kuò)展性中,很明顯,如果需要突然向外擴(kuò)展,啟動(dòng)時(shí)間將定義容器完全準(zhǔn)備好(啟動(dòng)并運(yùn)行)以響應(yīng)呈現(xiàn)的加載場(chǎng)景所需的時(shí)間。

場(chǎng)景有多突然(需要和快速),長(zhǎng)時(shí)間冷啟動(dòng)的情況可能更糟。

讓我們看看它們?cè)趩?dòng)時(shí)間方面的表現(xiàn):

好吧,您可能已經(jīng)注意到它是在啟動(dòng)時(shí)間圖中插入的另一個(gè)測(cè)試選項(xiàng)。實(shí)際上,它與 Quarkus 應(yīng)用程序完全相同,但使用 JVM Docker 映像(使用 Dockerfile.jvm)生成。正如我們所看到的,即使是使用 Docker Image 和 JVM Quarkus 應(yīng)用程序的應(yīng)用程序也比 Spring Boot 具有更快的啟動(dòng)時(shí)間。

毋庸置疑,Quarkus Native 應(yīng)用程序顯然是贏家,它是迄今為止啟動(dòng)速度最快的應(yīng)用程序。

內(nèi)存占用

現(xiàn)在,讓我們檢查一下內(nèi)存的情況。檢查每個(gè)容器應(yīng)用程序在啟動(dòng)時(shí)需要消耗多少內(nèi)存,以使自己?jiǎn)?dòng)并運(yùn)行,準(zhǔn)備好接收請(qǐng)求。

結(jié)論

總之,這就是我們?cè)贚inux Ubuntu中看到的結(jié)果:

看起來(lái) Quarkus 贏得了這兩輪比賽(啟動(dòng)時(shí)間和內(nèi)存足跡),以明顯的優(yōu)勢(shì)戰(zhàn)勝了對(duì)手 SpringBoot。

這可能會(huì)讓我們感到疑惑……也許是時(shí)候考慮一些真正的測(cè)試、經(jīng)驗(yàn),并嘗試使用 Quarkus。我們應(yīng)該看看它在現(xiàn)實(shí)生活中的表現(xiàn)如何,它如何適合我們的業(yè)務(wù)場(chǎng)景,以及最有用的地方。

但是,我們不要忘記缺點(diǎn),正如我們?cè)谏厦婵吹降模琂VM 的某些功能在本機(jī)可執(zhí)行二進(jìn)制文件中(還/很容易)無(wú)法工作。無(wú)論如何,也許是時(shí)候給 Quarkus 一個(gè)證明自己的機(jī)會(huì)了,特別是如果冷啟動(dòng)問(wèn)題一直困擾著你。在環(huán)境中使用一兩個(gè)配備 Quarkus 的 Pod (K8s) 怎么樣,一段時(shí)間后看看它的表現(xiàn)會(huì)很有趣,不是嗎?


責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2011-09-06 14:16:09

VMware微軟

2022-10-21 14:28:17

商家平臺(tái)消費(fèi)者

2013-01-28 14:16:59

2020-03-23 13:39:56

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)技術(shù)

2023-10-31 07:48:22

QuarkusJava

2015-10-19 11:28:49

WebAPP未來(lái)

2021-08-31 22:54:20

手機(jī)OPPO小米

2019-06-12 14:55:12

CentOSUbuntuWeb服務(wù)器

2016-05-13 14:42:44

冠軍人生贏家蘋果

2022-10-10 08:00:00

微服務(wù)Spring Boo容器

2021-01-14 09:55:21

Java微服務(wù)Go

2025-05-20 03:00:00

2020-06-30 07:58:39

微服務(wù)Spring BootCloud

2019-06-10 18:00:18

微服務(wù)架構(gòu)spring boot

2018-10-16 11:15:17

2013-08-28 13:57:40

2018-05-04 15:27:22

Spring Boo Web開發(fā)

2022-07-28 06:50:52

微服務(wù)業(yè)務(wù)系統(tǒng)

2021-02-22 10:54:28

AI 數(shù)據(jù)人工智能

2024-10-07 08:18:05

SpringBOM管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久人人网 | 欧美精品二区 | 蜜桃视频一区二区三区 | 亚洲精品久久久久久久久久久 | 国产日韩欧美在线观看 | 噜噜噜噜狠狠狠7777视频 | 少妇av片| 91精品国产91久久综合桃花 | 国产精品久久久久9999鸭 | 97视频在线免费 | 性视频一区| 久久av一区二区三区 | 亚洲顶级毛片 | 真人一级毛片 | 成人精品久久日伦片大全免费 | 亚洲精品性视频 | 一区二区精品电影 | 国产精品18hdxxxⅹ在线 | 天天拍天天色 | 国产精品99久久久久久大便 | 国产在线高清 | 久久久久久www | 韩日一区二区三区 | 亚洲精品成人在线 | 欧美一级免费黄色片 | 国内精品久久久久 | 国产精品成人av | 特级做a爰片毛片免费看108 | 国产精品久久亚洲 | 精品粉嫩aⅴ一区二区三区四区 | 久久国产精品-国产精品 | 国产精品99久久久久久久vr | 国产激情视频在线观看 | 涩涩操 | 国产日日操 | 亚洲精品国产电影 | av中文在线 | 亚洲成人自拍 | 成人av电影网| 久久精品毛片 | 成年人国产在线观看 |