java 秒变成时间_使用Quarkus开发Java云原生应用
Java應(yīng)用的云原生化痛點(diǎn)
Java技術(shù)棧作為企業(yè)級(jí)開發(fā)的利器已經(jīng)發(fā)展了快二十多年,大家基于Java技術(shù)棧開發(fā)了大量的應(yīng)用。隨著云原生架構(gòu)的普及,越來越多的用戶開始使用容器技術(shù)來運(yùn)行微服務(wù)應(yīng)用程序。借助容器技術(shù)構(gòu)建的通用輕量級(jí)虛擬機(jī)已經(jīng)幫助我們屏蔽了底層操作系統(tǒng)的差別,JVM的加載Java字節(jié)碼解釋執(zhí)行所帶來的一次編譯到處運(yùn)行優(yōu)勢(shì)逐漸變成了劣勢(shì)。微服務(wù)架構(gòu)的引入,將我們的服務(wù)顆粒度變得越來越小,輕量且能快速啟動(dòng)的應(yīng)用能夠更好的適應(yīng)容器化環(huán)境。 以我們目前常規(guī)的Spring Boot Java應(yīng)用來說,一般Restful服務(wù)的jar包大概是30M左右, 如果我們將JDK運(yùn)行時(shí)以及相關(guān)應(yīng)用打包成docker鏡像文件大概是140M左右。而常規(guī)的Go 語言的可執(zhí)行程序生成鏡像包一般不會(huì)超過50M。 如何讓原有臃腫的Java應(yīng)用瘦身,易于容器化成為Java應(yīng)用云原生化需要解決的問題。
上圖展示的是一個(gè)典型的Java應(yīng)用各模塊執(zhí)行時(shí)間的分布情況,大家可以看到,從JVM啟動(dòng)到真的應(yīng)用程序執(zhí)行需要經(jīng)歷VM加載,字節(jié)碼文件加載,以及JVM為了提升效率,借助JIT(just in time)及時(shí)編譯技術(shù)對(duì)解釋執(zhí)行的字節(jié)碼進(jìn)行局部?jī)?yōu)化,通過編譯器生成本地執(zhí)行代碼的過程,同時(shí)還需要加上了JVM內(nèi)部垃圾回收所耗費(fèi)的時(shí)間。 這樣一來典型的Java應(yīng)用加載時(shí)間一般都是秒級(jí)起步,如果遇到比較大的應(yīng)用初始花費(fèi)幾分鐘都是正常的。 以往由于我們很少重新啟動(dòng)Java應(yīng)用,Java應(yīng)用啟動(dòng)時(shí)間長的問題一般很少暴露出來。但是在云原生應(yīng)用場(chǎng)景下,我們會(huì)經(jīng)常不斷重啟應(yīng)用來實(shí)現(xiàn)滾動(dòng)升級(jí)或者無服務(wù)應(yīng)用場(chǎng)景。 Java應(yīng)用啟動(dòng)時(shí)間長的問題就變成了Java應(yīng)用云原生化亟待解決的問題。
通過GraalVM 提升Java應(yīng)用執(zhí)行效率
之前JVM為了提升效率,借助JIT(just in time)及時(shí)編譯技術(shù)對(duì)解釋執(zhí)行的字節(jié)碼進(jìn)行局部?jī)?yōu)化,通過編譯器生成本地執(zhí)行代碼提升應(yīng)用執(zhí)行效率。GraalVM是Oracle實(shí)驗(yàn)室開發(fā)的新一代的面向多種語言的JVM即時(shí)編譯器,在性能以及多語言互操作性上有比較好的表現(xiàn)。與Java HotSpot VM相比,Graal借助內(nèi)聯(lián),逃逸分析以及推出優(yōu)化技術(shù)可以提升2至5倍的性能提升。
如果我們能夠直接將Java應(yīng)用編譯成本地執(zhí)行文件,可以極大提升Java應(yīng)用啟動(dòng)速度同時(shí)降低為了支持動(dòng)態(tài)特性而帶來的內(nèi)存消耗。GraalVM項(xiàng)目借助AOT技術(shù)為我們提供了native-image工具,能夠?qū)⒋蠖鄶?shù)的Java代碼在不做修改的情況下轉(zhuǎn)換成本地可執(zhí)行程序。
不幸的是GraalVM提供的靜態(tài)編譯功能,只能針對(duì)其編譯時(shí)能夠看得的封閉世界進(jìn)行優(yōu)化,對(duì)于那些使用了反射、動(dòng)態(tài)加載、以及動(dòng)態(tài)代理的代碼是無能為力的。為了能讓我們?nèi)粘5腏ava應(yīng)用能夠正常運(yùn)行起來,需要我們對(duì)應(yīng)用所使用到的框架和類庫進(jìn)行相關(guān)修改適配。由于Java代碼所使用的類庫很多,這部分的工作量還是相當(dāng)巨大的,雖然GraalVM已經(jīng)推出超過一年多的時(shí)間,但是還是很少見到大規(guī)模Java應(yīng)用轉(zhuǎn)移到這個(gè)平臺(tái)之上。
Quarkus介紹
紅帽最近開源的Quarkus項(xiàng)目,借助開源社區(qū)的力量,通過對(duì)業(yè)界廣泛使用的框架進(jìn)行了適配工作,并結(jié)合云原生應(yīng)用的特點(diǎn),提供了一套端到端的Java云原生應(yīng)用解決方案。
Quarkus
的方式接入第三方的Java庫,以最近剛剛release了
1.0.0-M2?github.comapache/camel-quarkus?github.com為例,針對(duì)Apache Camel core 有關(guān)加載Camel組件的部分進(jìn)行
比較大量擴(kuò)展?github.com,同時(shí)Apache Camel 3.0 也針對(duì)組件的動(dòng)態(tài)加載進(jìn)行了優(yōu)化。
如何安裝使用Quarkus
- 選擇一個(gè)適合的IDE
- 安裝JDK 1.8+, 設(shè)置 JAVA_HOME
- 安裝GraalVM,設(shè)置GRAALVM_HOME
- 配置C語言開發(fā)環(huán)境
- Linux 安裝GCC
- macOS 執(zhí)行 xcode-select —install
- windows GraalVM本地編譯版本剛剛提供支持,需要按照Windows SDK。
- 安裝Docker
- 可以編譯docker native image
筆者最近基于Quarkus寫了兩個(gè)簡(jiǎn)單的Web應(yīng)用 notification-service 和 visitor-service ,后續(xù)我會(huì)再寫一篇文章,把相關(guān)的開發(fā)細(xì)節(jié)介紹給大家。值得一提是通過這個(gè)docker文件構(gòu)建的基于alpine構(gòu)建Linux X86本地鏡像不到30M,這應(yīng)該是我見到過的最小的Java應(yīng)用的鏡像了。
最后附上有關(guān)Quarkus的相關(guān)資源,希望能夠?qū)Υ蠹矣兴鶐椭?/p>Quarkus Github?github.comQuarkus - Get Started?quarkus.ioQuarkus - Guides?quarkus.ioquarkusio/quarkus-quickstarts?github.com
總結(jié)
以上是生活随笔為你收集整理的java 秒变成时间_使用Quarkus开发Java云原生应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python:高阶错误
- 下一篇: 手把手实现YOLOv3(一)