新聞中心
由于運(yùn)行上千個(gè)應(yīng)用程序容器莢Pod所耗費(fèi)的資源多,令它實(shí)現(xiàn)較少工作節(jié)點(diǎn)和資源占用所需成本也較高,所以在使用 ??Kubernetes?? 時(shí),快速啟動(dòng)和較少的內(nèi)存占用是至關(guān)重要的。在 Kubernetes 平臺(tái)運(yùn)行容器化微服務(wù)時(shí),內(nèi)存占用是比吞吐量更重要的考量因素,這是因?yàn)椋?/p>

創(chuàng)新互聯(lián)公司是專業(yè)的平陰網(wǎng)站建設(shè)公司,平陰接單;提供做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行平陰網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
- 由于需要持續(xù)運(yùn)行,所以耗費(fèi)資源更多(不同于 CPU 占用)
- 微服務(wù)令開(kāi)銷成本成倍增加
- 一個(gè)單體應(yīng)用程序變?yōu)槿舾蓚€(gè)微服務(wù)的情況(例如 20 個(gè)微服務(wù)占用的存儲(chǔ)空間約有 20GB)
這些情況極大影響了無(wú)服務(wù)器函數(shù)的發(fā)展和 Java 部署模型。到目前為止,許多企業(yè)開(kāi)發(fā)人員選擇 Go、Python 或 Node.js 這些替代方案來(lái)解決性能瓶頸,直到出現(xiàn)了 ??Quarkus?? 這種基于 kubernetes 的原生 Java 堆棧,才有所改觀。本文介紹如何在使用了 Quarkus 的 kubernetes 平臺(tái)上進(jìn)行性能優(yōu)化,以便運(yùn)行無(wú)服務(wù)器函數(shù)。
容器優(yōu)先的設(shè)計(jì)理念
由于 Java 生態(tài)系統(tǒng)中傳統(tǒng)的框架都要進(jìn)行框架的初始化,包括配置文件的處理、??classpath?? 的掃描、類加載、注解的處理以及構(gòu)建元模型,這些過(guò)程都是必不可少的,所以它們都比較耗費(fèi)資源。如果使用了幾種不同的框架,所耗費(fèi)的資源也是成倍增加。
Quarkus 通過(guò)“左移shifting left”,把所有的資源開(kāi)銷大的操作都轉(zhuǎn)移到構(gòu)建階段,解決了這些 Java 性能問(wèn)題。在構(gòu)建階段進(jìn)行代碼和框架分析、字節(jié)碼轉(zhuǎn)換和動(dòng)態(tài)元模型生成,而且只有一次,結(jié)果是:運(yùn)行時(shí)可執(zhí)行文件經(jīng)過(guò)高度優(yōu)化,啟動(dòng)非常快,不需要經(jīng)過(guò)那些傳統(tǒng)的啟動(dòng)過(guò)程,全過(guò)程只在構(gòu)建階段執(zhí)行一次。
Quarkus Build phase
更重要的是:Quarkus 支持構(gòu)建原生可執(zhí)行文件,它具有良好性能,包括快速啟動(dòng)和極小的駐留集大小resident set size(RSS)內(nèi)存占用,跟傳統(tǒng)的云原生 Java 棧相比,具備即時(shí)擴(kuò)展的能力和高密度的內(nèi)存利用。
Quarkus RSS and Boot Time Metrics
這里有個(gè)例子,展示如何使用 Quarkus 將一個(gè) ??Java 無(wú)服務(wù)器?? 項(xiàng)目構(gòu)建為本地可執(zhí)行文件。
1、使用 Quarkus 創(chuàng)建無(wú)服務(wù)器 Maven 項(xiàng)目
以下命令生成一個(gè) Quarkus 項(xiàng)目,(例如 ??quarkus-serverless-native??)以此創(chuàng)建一個(gè)簡(jiǎn)單的函數(shù):
$ mvn io.quarkus:quarkus-maven-plugin:1.13.4.Final:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=quarkus-serverless-native \ -DclassName="org.acme.getting.started.GreetingResource"
2、構(gòu)建一個(gè)本地可執(zhí)行文件
你需要使用 GraalVM 為 Java 程序構(gòu)建一個(gè)本地可執(zhí)行文件。你可以選擇 GraalVM 的任何發(fā)行版,例如 ??Oracle GraalVM Community Edition (CE)??? 或 ??Mandrel??(Oracle GraalVM CE 的下游發(fā)行版)。Mandrel 是為支持 OpenJDK 11 上的 Quarkus-native 可執(zhí)行文件的構(gòu)建而設(shè)計(jì)的。
打開(kāi) ??pom.xml???,你將發(fā)現(xiàn)其中的 ??native?? 設(shè)置。你將使用它來(lái)構(gòu)建本地可執(zhí)行文件。
native native
注意: 你可以在本地安裝 GraalVM 或 Mandrel 發(fā)行版。你也可以下載 Mandrel 容器映像來(lái)構(gòu)建它(像我那樣),因此你還需要在本地運(yùn)行一個(gè)容器引擎(例如 Docker)。
假設(shè)你已經(jīng)打開(kāi)了容器運(yùn)行時(shí),此時(shí)需要運(yùn)行一下 Maven 命令:
使用 ??Docker?? 作為容器引擎:
$ ./mvnw package -Pnative \ -Dquarkus.native.container-build=true \ -Dquarkus.native.container-runtime=docker
使用 ??Podman?? 作為容器引擎:
$ ./mvnw package -Pnative \ -Dquarkus.native.container-build=true \ -Dquarkus.native.container-runtime=podman
輸出信息結(jié)尾應(yīng)當(dāng)是 ??BUILD SUCCESS??。
Native Build Logs
不借助 JVM 直接運(yùn)行本地可執(zhí)行文件:
$ target/quarkus-serverless-native-1.0.0-SNAPSHOT-runner
輸出信息類似于:
__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ INFO [io.quarkus] (main) quarkus-serverless-native 1.0.0-SNAPSHOT native(powered by Quarkus xx.xx.xx.) Started in 0.019s. Listening on: http://0.0.0.0:8080INFO [io.quarkus] (main) Profile prod activated.INFO [io.quarkus] (main) Installed features: [cdi, kubernetes, resteasy]
簡(jiǎn)直是超音速!啟動(dòng)只花了 19 毫秒。你的運(yùn)行時(shí)間可能稍有不同。
使用 Linux 的 ??ps?? 工具檢測(cè)一下,結(jié)果內(nèi)存占用還是很低。檢測(cè)的方法是:在應(yīng)用程序運(yùn)行期間,另外打開(kāi)一個(gè)終端,運(yùn)行如下命令:
$ ps -o pid,rss,command -p $(pgrep -f runner)
輸出結(jié)果類似于:
PID RSS COMMAND10246 11360 target/quarkus-serverless-native-1.0.0-SNAPSHOT-runner
該進(jìn)程只占 11MB 內(nèi)存。非常?。?/p>
注意: 各種應(yīng)用程序(包括 Quarkus)的駐留集大小和內(nèi)存占用,都因運(yùn)行環(huán)境而異,并隨著應(yīng)用程序載入而上升。
你也可以使用 REST API 訪問(wèn)這個(gè)函數(shù)。輸出結(jié)果應(yīng)該是 ??Hello RESTEasy??:
$ curl localhost:8080/helloHello RESTEasy
3、把函數(shù)部署到 Knative 服務(wù)
如果你還沒(méi)有創(chuàng)建命名空間,現(xiàn)在就在 ??OKD???(OpenShift Kubernetes 發(fā)行版)??創(chuàng)建一個(gè)命名空間???(例如 ??quarkus-serverless-native???),進(jìn)而把這個(gè)本地可執(zhí)行文件部署為無(wú)服務(wù)器函數(shù)。然后添加 ??quarkus-openshift?? 擴(kuò)展:
$ ./mvnw -q quarkus:add-extension -Dextensions="openshift"
向 ??src/main/resources/application.properties?? 文件中添加以下內(nèi)容,配置 Knative 和 Kubernetes 的相關(guān)資源:
quarkus.container-image.group=quarkus-serverless-nativequarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000quarkus.native.container-build=truequarkus.kubernetes-client.trust-certs=truequarkus.kubernetes.deployment-target=knativequarkus.kubernetes.deploy=truequarkus.openshift.build-strategy=docker
構(gòu)建本地可執(zhí)行文件,并把它直接部署到 OKD 集群:
$ ./mvnw clean package -Pnative
注意: 提前使用 ?
?oc login??? 命令,確保登錄的是正確的項(xiàng)目(例如 ??quarkus-serverless-native??)。
輸出信息結(jié)尾應(yīng)當(dāng)是 ??BUILD SUCCESS???。完成一個(gè)本地二進(jìn)制文件的構(gòu)建并部署為 Knative 服務(wù)需要花費(fèi)幾分鐘。成功創(chuàng)建服務(wù)后,使用 ??kubectl??? 或 ??oc?? 命令工具,可以查看 Knative 服務(wù)和版本信息:
$ kubectl get ksvcNAME URL [...]quarkus-serverless-native http://quarkus-serverless-native-[...].SUBDOMAIN True$ kubectl get revNAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASONquarkus-serverless-native-00001 quarkus-serverless-native quarkus-serverless-native-00001 1 True
4、訪問(wèn)本地可執(zhí)行函數(shù)
運(yùn)行 ??kubectl?? 命令,搜索無(wú)服務(wù)器函數(shù)的節(jié)點(diǎn):
$ kubectl get rt/quarkus-serverless-native
輸出信息類似于:
NAME URL READY REASONquarkus-serverless-native http://quarkus-serverless-restapi-quarkus-serverless-native.SUBDOMAIN True
用 ??curl??? 命令訪問(wèn)上述信息中的 ??URL?? 字段:
$ curl http://quarkus-serverless-restapi-quarkus-serverless-native.SUBDOMAIN/hello
過(guò)了不超過(guò)一秒鐘,你也會(huì)得到跟本地操作一樣的結(jié)果:
Hello RESTEasy
當(dāng)你在 OKD 群集中訪問(wèn) Quarkus 運(yùn)行中的節(jié)點(diǎn)的日志,你會(huì)發(fā)現(xiàn)本地可執(zhí)行文件正在以 Knative 服務(wù)的形式運(yùn)行。
Native Quarkus Log
下一步呢?
你可以借助 GraalVM 發(fā)行版優(yōu)化 Java 無(wú)服務(wù)器函數(shù),從而在 Knative 中使用 Kubernetes 將它們部署為無(wú)服務(wù)器函數(shù)。Quarkus 支持在普通的微服務(wù)中使用簡(jiǎn)易配置進(jìn)行性能優(yōu)化。
本系列的下一篇文章將指導(dǎo)你在不更改代碼的情況下跨多個(gè)無(wú)服務(wù)器平臺(tái)實(shí)現(xiàn)可移植函數(shù)。
(Daniel Oh, ??CC BY-SA 4.0??)
分享標(biāo)題:優(yōu)化Kubernetes中的Java無(wú)服務(wù)器函數(shù)
本文地址:http://www.dlmjj.cn/article/djojois.html


咨詢
建站咨詢
