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