1. 程式人生 > 實用技巧 >關於雲原生應用的思考

關於雲原生應用的思考

文中前半部分擷取、參照、截取了周志明《Graal VM 雲原生時代的Java》視訊講解公開的PPT的部分內容,特此宣告,在此對周志明精彩的分享表示感謝。




雲原生的核心是什麼?

技術人員談技術問題直接、要看本質,不能東拉西扯。現在很多廠商都在談雲原生應用,那麼雲原生應用的核心是什麼?

雲原生的應用開發框架。

提到開發框架。傳統的Java系的應用開發框架比較著名的是SSH(Spring框架、Hibernate框架、Struts框架)。

Spring MVC是基於 Servlet 的一個 MVC 框架 主要解決 WEB 開發的問題,因為 Spring 的配置非常複雜,各種XML、 JavaConfig、hin處理起來比較繁瑣。於是為了簡化開發者的使用,從而創造性地推出了Spring boot,約定優於配置,簡化了spring的配置流程。


現有的絕大多數企業級應用都是由Java開發的。Java的特點如下:

所以說,Java通過眾多的規範(JSR),讓應用開發人員遵從,這有助於提升應用的規模、穩定性。

在微服務時代,傳統Java的理念與時代產生了巨大的矛盾。

隨著Web應用的發展,微服務時代,應用的穩定性不再依賴於單個單體應用例項的穩定性,而是藉助於應用叢集、K8S等技術保證應用的高可用性。好比傳統應用是寵物,微服務是牛羊。微服務更關注與單個應用例項是否消耗資源,啟動速度是否快。

在微服務時代,如果我們只是將應用執行的“底座”由Linux換成容器,如下圖所示,那效果就會比較尷尬(例如在容器中執行weblogic,承載應用),這不是成不成的問題,而是效果好不好的問題。

那麼問題的根源是什麼呢?

還是由Java本身的特點決定的。Java的解釋型語言,解釋型語言就需要直譯器,JVM。而JVM是相當耗費記憶體的,並且啟動也慢。

此外,Java的程式碼域是動態的。常用到的Java動態特性主要是反射,在執行時查詢物件屬性、方法,修改作用域,通過方法名稱呼叫方法等。這樣做的好處是,Java 程式可以載入一個執行時才得知名稱的.class檔案,然後獲悉其完整構造,並生成其物件實體、或對其 fields(變數)設值、或呼叫其 methods(方法)。



解決Java問題的方法

Oracle當然也意識到Java在微服務時代的尷尬之處,因此在前兩年推出了新一代JVM:GraalVM。

GraalVM是一款高效能的可嵌入式多語言虛擬機器,它能執行不同的程式語言,包括:

  • 基於JVM的語言,比如Java, Scala, Kotlin和Groovy

  • 解釋型語言,比如JavaScript, Ruby, R和Python

  • LLVM支援的原生語言,比如C, C++, Rust和Swift

GraalVM中包含Graal Compiler編譯器。Graal Compiler是GraalVM與HotSpotVM(從JDK10起)共同擁有的服務端即時編譯器,是C2編譯器未來的替代者。

Graal Compiler支援提前編譯(AOT)和即時編譯(JIT)。

兩者的優缺點對比如下表所示:

總結起來,AOT編譯後,應用包更小、消耗記憶體更少、啟動速度更快。JIT編譯的應用,吞吐量更高、延遲更低。

此外,我們知道,HotSpotVM是JVM標準的技術實現。HotSpotVM是Sun JDK和OpenJDK中自帶的JCM,使用很廣。而Substrate VM是一個框架,可以將Java程式編譯為獨立的可執行檔案,它的架構如下圖所示。對於GraalVM而言,HotSpotVM是可選的:

接下來,我們再看一下GraalVM的版本。Oracle推出了社群版本(CE)和企業版(EE),兩者區別如下圖所示:

截止到目前,我們已經清楚了針對Java不適用於微服務,Oracle的做法,就是通過GraalVM實現本地編譯,從而甩來HotSpot。

那麼,針對Java不適用於微服務的現狀,讓我們跳出Java圈,IT圈的大佬們是想如何解決的呢?



解決問題的流派

解決問題的方法大致有如下幾種:

在上圖中,後兩種主要是更為靠譜的。

至於採取第二種還是第三種,那不同的廠商顯然會有自己的思路。

從技術角度看:傳統的Java應用改造成GraalVM Native還是有難度的。

Quarkus是紅帽主導釋出的新一代雲原生Java。Quarkus確實面臨重新書寫應用的問題。從紅帽的角度,傳統的應用與其向GraalVM Native遷移,不如向基於K8S的輕量級應用伺服器JBoss EAP遷移更為靠譜(後面也會給出介紹)。

Quarkus紅帽在2020年正式GA(開源專案去年釋出),目前github上有5000個Star,還算不錯。




Quarkus的框架

Quarkus的框架如下,

由於Quarkus依賴GraalVM CE,而GraalVM CE是由Oracle釋出的。因此紅帽釋出了GraalVM CE的下游社群:Mandrel。通過Mandrel紅帽將GraalVM特性整合在在Red Hat Enterprise Linux和OpenJDK 11發行版上,以便紅帽可以對此提供企業級支援。

Quarkus的一個特點是包含很多擴充套件。Quarkers 的擴充套件是一組依賴項,可以將它們新增到 Quarkus 專案中,從而獲得特定的功能,例如健康檢查等。擴充套件將配置或引導框架或技術整合到 Quarkus 應用程式中。通過命令列可以列出 Quarkers 可用和支援的擴充套件:

此外,Quarkus還有個優勢是:支援熱載入。即以開發模式啟動應用後,修改應用原始碼無需重新編譯和重新執行,應用而直接生效。如果是 web 應用,在前臺重新整理瀏覽器即可看到更新結果。Quarkus 的開發模式非常適合應用除錯階段、經常需要調整原始碼並驗證效果的需求。

Quarkus還可以和Kafka對接(後面其他文章會介紹)。

Quarkus具體的實戰內容,可以參照筆者在IBM官網發表的文章:

https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-quarkus-supersonic-subatomic-java-experience/index.html

根據IDC在2020年5月份釋出的資料,Quarkus Native比其他框架節約64%的雲資源。如果執行在JVM模式,可以節約37%的資源。

Quarkus Native執行只需要21M記憶體

在基於AWS部署的OpenShift4.2上執行10個pod,消耗記憶體的對比:

吞吐量對比:

例項擴容所需時間對比:

啟動時間對比:




GraalVM的限制

GraalVM的限制如下連結所示:有的需要配置才能實現,因此在開發時應注意這些限制。

https://www.javachenglei.com github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md

Dynamic Class Loading /www.yunzeyle.cn Unloading

Runtime Bytecode Generation *

InvokeDynamic Bytecode www.jintianxuesha.com and Method Handles

Finalizers

Serialization

Security Manager

JVMTI、JVMCI,www.lanboyulezc.cn other www.iceason.net native VM interfaces




傳統應用向JBoss EAP遷移的步驟

針對客戶現有的執行在傳統應用伺服器上(如WebLogic)的應用,如何遷移到JBossEAP上呢?我們可以藉助Red Hat Application MigrationToolkit(簡稱:RHAMT)

RHAMT是開放原始碼工具的組合,可實現大規模的應用程式遷移和現代化。該工具由多個單獨的元件組成,這些元件為遷移過程的每個階段提供支援。支援的遷移包括應用程式平臺升級、向雲原生部署環境的遷移、以及從幾種商業應用伺服器到JBoss EAP的遷移。

RHAMT提供三種軟體包下載:

COMMAND LINETOOLING:命令列介面提供了一個高階介面,用於以自動化方式對許多應用程式進行批處理分析。該介面可以提供詳細的評估報告,這些報告可以納入對應用程式的完整評估中,以便進行優先順序排序和規劃。

WEB CONSOLE:Web控制檯提供簡化的介面,用於管理大量應用程式以進行評估和分析。使用此工具,使用者可以管理大量應用程式,以便有效地確定優先順序並計劃要遷移的應用程式,並評估每次遷移所涉及的難度。

IDE TOOLING:IDE外掛為開發人員提供了互動式的實施時間幫助。通過提供內聯幫助以及使遷移和現代化過程中的複雜步驟自動化的全自動快速修復程式,這簡化了應用程式的遷移過程。

我們檢視工具下載介面(https://www.wanfeigw.cn developers.redhat.com/products/rhamt/download),

我們先下載CLI工具。安裝CLI工具的系統需要安裝JavaSE Development Kit(JDK)版本8,我們建議使用OpenJDK或OracleJDK。

安裝RHAMTCLI工具很簡單,直接解壓縮即可:

# unzipmigrationtoolkit-rhamt-cli-4.3.1-offline.zip

接下來,我們展示如何執行CLI來分析示例WebLogic應用程式,以識別將其遷移到JBossEAP 7所需的更改。示例程式為:simple-sample-app.ear(下載地址為:https://github.com/ocp-msa-devops/RHAMT.git)

執行如下命令:

# ./rhamt-cli-4.3.1.Final/bin/rhamt-cli--input .www.jintianxuesha.com /simple-sample-app.ear --output --source weblogic --target eap:7--packages com.acme

此命令使用以下選項:

--input:要分析的應用程式的路徑。

--output:生成的報告的輸出目錄。 --source:應用程式的源技術。

--target:用於應用程式遷移的目標技術。

--packages:要評估的軟體包列表。

命令執行結果如圖顯示的名為index.html的評估報告。