如何进行基于Anolis OS的企业级Java应用规模化实践?|龙蜥技术
簡(jiǎn)介:提供了7×24小時(shí)的專屬釘釘或者電話支持,響應(yīng)時(shí)間保證到在業(yè)務(wù)不可用情況下10分鐘響應(yīng),業(yè)務(wù)一般的問(wèn)題在一小時(shí)可以獲得響應(yīng),主要城市可以兩小時(shí)內(nèi)得到到達(dá)現(xiàn)場(chǎng)的服務(wù)。
本文作者郁磊,是Java語(yǔ)言與虛擬機(jī)SIG負(fù)責(zé)人。整理自云棲大會(huì)龍蜥專場(chǎng)論壇的技術(shù)分享,云棲系列視頻已經(jīng)上線,歡迎觀看:云棲大會(huì)龍蜥專場(chǎng)論壇
Alibaba Dragonwell 是一款 OpenJDK 的發(fā)行版。OpenAnolis 是企業(yè)級(jí)的操作系統(tǒng),企業(yè)級(jí)操作系統(tǒng)必然包含企業(yè)級(jí)應(yīng)用的運(yùn)行時(shí)。眾所周知,紅帽的 CentOS 發(fā)行版里面其實(shí)有紅帽自己做的 JDK 發(fā)行版,這既是他們對(duì)自己運(yùn)行時(shí)技術(shù)可控的自信,也是對(duì)用戶負(fù)責(zé),比如說(shuō) OpenJDK 出現(xiàn)任何問(wèn)題,他們可以在發(fā)行版上做改動(dòng),去幫助用戶解決問(wèn)題。
Java企業(yè)應(yīng)用
Java 一直是企業(yè)級(jí)最佳的選擇,其中有很多原因,目前云原生環(huán)境下,它有非常成熟的容器化方案,有 Spring boot 這樣的框架來(lái)幫助我們把應(yīng)用打包成一個(gè)非常適合容器運(yùn)行的模式。也有很多分布式的中間件,比如說(shuō) Spring cloud,可以幫助我們構(gòu)造分布式應(yīng)用。Java也有非常好的規(guī)范以及開(kāi)源生態(tài),但 Oracle 雖然控制著 Java,同時(shí)也推進(jìn)著Java標(biāo)準(zhǔn)往前演進(jìn),標(biāo)準(zhǔn)使得語(yǔ)言一直是可以控制的方向發(fā)展,非常適合開(kāi)發(fā)企業(yè)級(jí)應(yīng)用。里面有非常繁榮的生態(tài),比如 Maven 可以幫助開(kāi)發(fā)者快速獲得開(kāi)發(fā)依賴,還有Netty、Tomcat、Spring。雖然 Spring 可以看做是挑戰(zhàn) Jakarta EE的角色,但是它本身也受到 Java 的很多影響,因此可以說(shuō)是Jakarta EE也在幫助Spring發(fā)展。
高效,運(yùn)行時(shí)的高效和開(kāi)發(fā)時(shí)的高效。運(yùn)行時(shí)的高效體現(xiàn)在 Java 的執(zhí)行速度,一個(gè)數(shù)據(jù)是 Java 的運(yùn)行效率可以排在各大編程語(yǔ)言第四,效率可以達(dá)到 C 語(yǔ)言的二分之一,這在高級(jí)語(yǔ)言里非常難得的。
最后是行業(yè)實(shí)踐,在互聯(lián)網(wǎng)金融等行業(yè)里大規(guī)模使用 Java。
大家認(rèn)為硬件+操作系統(tǒng)+應(yīng)用就構(gòu)成整個(gè)應(yīng)用,其實(shí)運(yùn)行時(shí)對(duì)于應(yīng)用的運(yùn)行影響是非常大的,通過(guò)一個(gè)例子解釋。
這是我們?cè)谄髽I(yè)客戶里遇到的一個(gè)問(wèn)題,在 Java 運(yùn)行時(shí)開(kāi)始很好,經(jīng)過(guò)一天以后性能就變成 1/2,越來(lái)越慢,只能選取變慢的實(shí)例重啟,他能做的就是把變慢的實(shí)例直接重啟或者是擴(kuò)容,因?yàn)樽兟笮枰嗟臋C(jī)器支撐容量。但這并不解決問(wèn)題,因?yàn)樽兟@個(gè)行為持續(xù)在發(fā)生。
最后排查出是 JIT 相關(guān)問(wèn)題, Java應(yīng)用有 JIT 編譯器,也有解釋模式,我可以給大家一個(gè)數(shù)字,編譯模式要比解釋模式快 50 倍左右,所以有部分代碼執(zhí)行在解釋模式的話,影響非常大,假如有 2% 的代碼在解釋器模式,則整個(gè)應(yīng)用一半的時(shí)間在執(zhí)行解釋器,一半的時(shí)間在執(zhí)行編譯器,性能下降一倍。假如說(shuō)一半的代碼退到解釋器,那應(yīng)用就會(huì)慢 25 倍左右,所以運(yùn)行時(shí)對(duì)應(yīng)用有深遠(yuǎn)影響。
阿里巴巴 Dragonwell 和 Eclipse Temurin 都是 OpenJDK 的開(kāi)源發(fā)行版本,為什么近年來(lái)除了谷歌以外所有的頭部云廠商都推出了自己的發(fā)行版。自 OpenJDK9 開(kāi)始,每半年發(fā)布一個(gè)版本,這個(gè)版本只會(huì)維護(hù)一年,比如說(shuō) OpenJDK 從 2018 年 3 月開(kāi)始維護(hù)到 2019 年 3 月,中間只有一年的維護(hù)時(shí)間,選取這樣的策略是因?yàn)?OpenJDK9 引入了很多新的特性,比如說(shuō)模塊化,對(duì)開(kāi)發(fā)進(jìn)程影響非常大,所以選取了這樣一種滾動(dòng)升級(jí)策略。
假如我們的用戶想去使用最新的JDK,那他必須接受滾動(dòng)升級(jí)。比如說(shuō)現(xiàn)在Java已經(jīng)到了17了,五年后Java會(huì)到達(dá)27的版本,這樣的升級(jí)頻率肯定是接受不了的。假設(shè)Java用戶停留在老版本是不是可以避免這種滾動(dòng)升級(jí)?實(shí)際也不行, Java遠(yuǎn)程執(zhí)行漏洞非常多,我們可以通過(guò)序列化構(gòu)造一些遠(yuǎn)程代碼執(zhí)行的例子,這是非常可怕的。各個(gè)云廠商都提供了自己的OpenJDK發(fā)行版,想獲得Oracle也是可以的,是收費(fèi)的。
阿里巴巴Dragonwell就是在這種背景下產(chǎn)生出了Java運(yùn)行時(shí),我們完全依托開(kāi)源社區(qū)建設(shè),我們參與了非常多國(guó)際上的高質(zhì)量社區(qū),現(xiàn)在也加入了龍蜥社區(qū),其中包括Java的JCP-EC,阿里巴巴是國(guó)內(nèi)唯一一個(gè)加入EC席位的企業(yè)(EC的全稱是執(zhí)行委員會(huì))。
Alibaba Dragonwell是在OpenJDK的基礎(chǔ)上增加了一些自己的功能,構(gòu)成了阿里巴巴Dragonwell發(fā)行版本。我們會(huì)發(fā)布穩(wěn)定的發(fā)行版本,并且提供定期的安全補(bǔ)丁,質(zhì)量體系接軌國(guó)際,基于Adoptium的CI,Adoptium組織由各個(gè)JDK的頭部廠商維護(hù),包括微軟、IBM都參與其中。經(jīng)過(guò)測(cè)試以后,我們會(huì)在阿里巴巴線上驗(yàn)證;SVT系統(tǒng)驗(yàn)證,會(huì)用spring等常用框架進(jìn)行驗(yàn)證我們的JDK。我們也支持多平臺(tái),比如Linux、windows;RISC-V架構(gòu)的支持也已經(jīng)提上日程。
和Java企業(yè)計(jì)算相關(guān)的另外一個(gè)發(fā)行版是Eclipse Temurin,它源自AdoptOpenJDK。AdoptOpenJDK是怎么來(lái)的?可以看到前面的Oracle發(fā)布策略,大家使用OpenJDK會(huì)越來(lái)越困難,所以倫敦的Java User Group創(chuàng)建AdoptOpenJDK項(xiàng)目,讓OpenJDK可以方便地被用戶使用。該項(xiàng)目編譯OpenJDK的source code,經(jīng)過(guò)aqa-tests才會(huì)release出來(lái),可以說(shuō)是原汁原味的OpenJDK。和Alibaba Dragonwell的差異是:上一頁(yè)有一塊Dragonwell補(bǔ)丁,而Temurin是原汁原味的OpenJDK。
Aqa-tests包括性能測(cè)試,OpenJDK自帶測(cè)試。其中的system測(cè)試會(huì)驗(yàn)證Java的模塊化系統(tǒng),Java的自帶工具等。后面是external,包括Java生態(tài)里面常見(jiàn)的一些軟件,像scala、kafka。最后是標(biāo)準(zhǔn)的JCK,Oracle所頒布的一個(gè)標(biāo)準(zhǔn),只要JDK發(fā)行版跑過(guò)驗(yàn)證就是標(biāo)準(zhǔn)的JDK。
很多傳統(tǒng)企業(yè)用戶不需要阿里巴巴Dragonwell里面為云或者互聯(lián)網(wǎng)設(shè)計(jì)的功能,他可以選擇Eclipse Temurin發(fā)行版。
讓我們看看使用這兩個(gè)發(fā)行版企業(yè)可以獲得什么。
Alibaba Dragonwell上有很多阿里巴巴自己擴(kuò)展的云原生特性,通過(guò)這些特性我們可以輕易的排查問(wèn)題或者輕易的減少資源使用,或者是降低總體成本,這是Eclipse Temurin和OracleJDK所沒(méi)有的。
基于這兩個(gè)JDK發(fā)行版本我們提供了企業(yè)服務(wù)體系。如果企業(yè)用戶從OracleJDK某個(gè)版本遷移過(guò)來(lái),首先面臨的問(wèn)題是遷移。Java的版本遷移不像GO或者其他語(yǔ)言那樣輕松,比如JDK8遷移到11或者17,都有很大的遷移工作量。我們提供遷移了工具,并積累了許多遷移經(jīng)驗(yàn)文檔給到企業(yè)去遷移到Eclipse Temurin或者Alibaba Dragonwell。
Java由于龐大的類庫(kù)會(huì)隱含很多的安全問(wèn)題。如果選擇訂閱了Alibaba Dragonwell企業(yè)支持服務(wù),會(huì)獲得每三個(gè)月的推送,對(duì)于一些重大更新我們會(huì)進(jìn)行評(píng)估,是否是重要更新,是否要升級(jí),升級(jí)計(jì)劃是什么。
應(yīng)急支撐體系是IT企業(yè)的日常需求,在Java使用中只要上了規(guī)模都會(huì)有無(wú)法預(yù)期的問(wèn)題。這里我們提供了7×24小時(shí)的專屬釘釘或者電話支持,響應(yīng)時(shí)間保證到在業(yè)務(wù)不可用情況下10分鐘響應(yīng),業(yè)務(wù)一般的問(wèn)題在一小時(shí)可以獲得響應(yīng),主要城市可以兩小時(shí)內(nèi)得到到達(dá)現(xiàn)場(chǎng)的服務(wù)。
我們結(jié)合之前的案例來(lái)看,用戶通過(guò)我們的服務(wù)能獲得怎樣的體驗(yàn)。首先用戶發(fā)現(xiàn)并報(bào)告了問(wèn)題,由于北京是主要城市,兩小時(shí)內(nèi)可以到達(dá)現(xiàn)場(chǎng)。隨后我們幫助用戶保存現(xiàn)場(chǎng),分析問(wèn)題,定位問(wèn)題,最后交付服務(wù)。
代碼空間滿導(dǎo)致代碼部分解釋執(zhí)行,從而性能變差,但代碼空間滿依舊不是根因。一步步深入定位,分析出原因: 因?yàn)橛脩魪牡桶姹綣DK升上來(lái),低版本JDK的代碼回收功能是有問(wèn)題的,因此用戶禁用了代碼空間的回收功能。隨著應(yīng)用持續(xù)運(yùn)行,編譯代碼越來(lái)越多,如果開(kāi)啟了代碼空間的回收,失效代碼是可以被Java虛擬機(jī)回收的。但是用戶關(guān)閉了代碼空間回收,最終導(dǎo)致代碼空間滿。Hotspot虛擬機(jī)在代碼空間滿時(shí)策略是禁止JIT編譯。
確認(rèn)問(wèn)題后幫助用戶在少量機(jī)器上驗(yàn)證,確認(rèn)修復(fù)完成后交付服務(wù),書(shū)面給與用戶確認(rèn)。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
總結(jié)
以上是生活随笔為你收集整理的如何进行基于Anolis OS的企业级Java应用规模化实践?|龙蜥技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IoT Studio可视化搭建平台编辑历
- 下一篇: “CV_RGB2BGR”: 未声明的标识