【Quarkus技術系列】打造基于Quarkus的云原生微服務框架實踐(1)

前提介紹

本系列文章主要講解如何基于Quarkus技術搭建和開發"專為Kubernetes而優化的Java微服務框架"的入門和實踐,你將會學習到如何搭建Quarkus微服務腳環境及腳手架,開發Quarkus的端點服務,系統和應用層級的配置介紹與Quarkus的編程模型分析,創建Quarkus的應用Uber-jar文件以及集成到Kubernetes的環境中。

  1. 學習Quarkus的云原生微服務的零基礎搭建和開發實踐
  2. 分析Quarkus的編程模型以及與Kubernetes環境進行集成

面向的人群

Java軟件開發人員、系統架構師、微服務開發愛好者、運維部署人員等。

目前的狀況

近幾年由于云原生技術的普及,越來越多的用戶開始使用容器來運行微服務應用,隨著微服務的快速發展,spring全家桶已然成為了java框架的事實標準,包括單體應用使用的spring Framework和springboot,微服務間服務治理框架spring cloud,生態系統完善,各種組件層出不窮。

Java云原生化痛點

  • 輕量化容器技術的誕生促使JVM服務變得更加臃腫
    • 微服務架構的引入,使我們的服務顆粒度變得越來越小,輕量且能快速啟動的應用能夠更好的適應容器化環境。 以我們目前常規的Spring Boot應用來說,一般Restful服務的jar包大概是30M左右,如果我們將JDK以及相關應用打包成docker鏡像文件大概是140M左右。
    • 常規的Go語言的可執行程序生成鏡像包一般不會超過50M。如何讓臃腫的Java應用瘦身使他易于容器化,成為Java應用云原生化需要解決的問題。
  • 輕量化容器技術的誕生促使JVM服務內容使用量變得過大
    • JVM對于內存的使用量變的越來越大,會促使FullGC的過多甚至OOM。
  • SpringBoot的微服務應用啟動的速度越來越慢(JVM啟動速度)
    • 從JVM啟動到真的應用程序執行需要經歷VM加載,字節碼文件加載,以及JVM為了提升效率,借助JIT(just in time)及時編譯技術對解釋執行的字節碼進行局部優化,通過編譯器生成本地執行代碼的過程,同時還需要加上了JVM內部垃圾回收所耗費的時間。

典型的Java應用加載時間一般都是秒級起步,如果遇到比較大的應用初始花費幾分鐘都是正常的。 以往由于我們很少重新啟動Java應用,Java應用啟動時間長的問題一般很少暴露出來。

  • 但是在云原生應用場景下,隨著粒度變的非常細,所以導致部署頻率過于頻繁
    • 我們會經常不斷重啟應用來實現滾動升級或者無服務應用場景。 Java應用啟動時間長的問題就變成了Java應用云原生化亟待解決的問題。

Quarkus的介紹

  • Quarkus定位為GraalVM和OpenJDK HotSpot量身定制的Kubernetes Native Java框架。
  • Quarkus是紅帽開源的項目,借助開源社區的力量,通過對業界廣泛使用的框架進行了適配,并結合云原生應用的特點,提供了一套端到端的Java云原生應用解決方案。
  • 雖然開源時間較短,但是生態方面也已經達到可用的狀態,自身包含擴展框架,已經支持像Netty、Undertow、Hibernate、JWT等框架,足以用于開發企業級應用,用戶也可以基于擴展框架自行擴展。

向原生邁進

對需要長時間運行的應用來說,由于經過充分預熱,熱點代碼會被HotSpot的探測機制準確定位捕獲,并將其編譯為物理硬件可直接執行的機器碼,在這類應用中Java的運行效率很大程度上是取決于即時編譯器所輸出的代碼質量。

HotSpot虛擬機中包含有兩個即時編譯器,分別是編譯時間較短但輸出代碼優化程度較低的客戶端編譯器(簡稱為C1)以及編譯耗時長但輸出代碼優化質量也更高的服務端編譯器(簡稱為C2),通常它們會在分層編譯機制下與解釋器互相配合來共同構成HotSpot虛擬機的執行子系統的。

新一代即時編譯器(Graal VM)

自JDK 10起,HotSpot中又加入了一個全新的即時編譯器:Graal編譯器,看名字就可以聯想到它是來自于前一節提到的Graal VM,Graal編譯器是作為C2編譯器替代者的角色登場的。

C2編譯器的問題

C2的歷史已經非常長了,可以追溯到Cliff Click大神讀博士期間的作品,這個由C++寫成的編譯器盡管目前依然效果拔群,但已經復雜到連Cliff Click本人都不愿意繼續維護的程度。

Graal編譯器本身就是由Java語言寫成,實現時又刻意與C2采用了同一種名為"Sea-of-Nodes"的高級中間表示(High IR)形式,使其能夠更容易借鑒C2的優點。

Graal編譯器比C2編譯器晚了足足二十年面世,有著極其充沛的后發優勢,在保持能輸出相近質量的編譯代碼的同時,開發效率和擴展性上都要顯著優于C2編譯器,這決定了C2編譯器中優秀的代碼優化技術可以輕易地移植到Graal編譯器上,但是反過來Graal編譯器中行之有效的優化在C2編譯器里實現起來則異常艱難。

Graal編譯器

Graal的編譯效果短短幾年間迅速追平了C2,甚至某些測試項中開始逐漸反超C2編譯器。

Graal能夠做比C2更加復雜的優化,如"部分逃逸分析"(Partial Escape Analysis),也擁有比C2更容易使用"激進預測性優化"(Aggressive Speculative Optimization)的策略,支持自定義的預測性假設等等。

Graal編譯器尚且年幼,還未經過足夠多的實踐驗證,所以仍然帶著"實驗狀態"的標簽,需要用開關參數去激活,這讓筆者不禁聯想起JDK 1.3時代,HotSpot虛擬機剛剛橫空出世時的場景,同樣也是需要用開關激活,也是作為Classic虛擬機的替代品的一段歷史。

Graal編譯器未來的前途可期,作為Java虛擬機執行代碼的最新引擎,它的持續改進,會同時為HotSpot與Graal VM注入更快更強的驅動力。

GraalVM的總結分析

GraalVM:JVM為了提升效率,借助JIT及時編譯技術對解釋執行的字節碼進行局部優化,通過編譯器生成本地執行代碼提升應用執行效率。

GraalVM是Oracle實驗室開發的新一代的面向多種語言的JVM即時編譯器,在性能以及多語言互操作性上有比較好的表現。與Java HotSpot VM相比,Graal借助內聯,逃逸分析以及推出優化技術可以提升2至5倍的性能提升。

GraalVM提供的靜態編譯功能,只能針對其編譯時能夠看得的封閉世界進行優化,對于那些使用了反射、動態加載、以及動態代理的代碼是無能為力的。

  • 為了能讓我們日常的Java應用能夠正常運行起來,需要我們對應用所使用到的框架和類庫進行相關修改適配。
  • 由于Java代碼所使用的類庫很多,這部分的工作量還是相當巨大的,雖然GraalVM已經推出超過一年多的時間,但是還是很少見到大規模Java應用轉移到這個平臺之上。

分享資源

資源分享
獲取以上資源請訪問開源項目 點擊跳轉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35523.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35523.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35523.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單芯片3路CC管理的VR轉接器解決方案

VR眼鏡即VR頭顯,也稱虛擬現實頭戴式顯示設備,隨著元宇宙概念的傳播,VR眼鏡的熱度一直只增不減,但是頭戴設備的續航一直被人詬病,如果增大電池就會讓頭顯變得笨重影響體驗,所以目前最佳的解決方案還是使用VR…

C# BeginInvoke 加 EndInvoke實現異步操作

1、定義一個委托 delegate long MyDel(int first, int second); 2、 需異步操作的函數 static int sum(int x,int y) {Console.WriteLine("InSide Sum1");Thread.Sleep(1000);Console.WriteLine("InSide Sum2");return x y;} 3、回調方法…

[HDLBits] Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. //empty

gitui 解決 git error:Bad credentials.

問題描述 cat .git/config """ [remote "origin"]url gitgitcode.net:xxx.gitfetch refs/heads/*:refs/remotes/origin/* """ls -lh ~/.ssh/ """ -rw------- 1 z z 2.6K 8月 12 15:04 id_rsa -rw-r--r-- 1 z z 56…

學習左耳聽風欄目90天——第六天 6/90(學習左耳朵耗子的工匠精神,對技術的熱愛)【如何擁有技術領導力】

學習左耳聽風欄目90天——第六天 6/90(學習左耳朵耗子的工匠精神,對技術的熱愛)【如何擁有技術領導力】

【第358場周賽】限制條件下元素之間的最小絕對差,Java解密。

LeetCode 第358場周賽 恒生專場。 文章目錄 劍指Offer:限制條件下元素之間的最小絕對差示例:限制:解題思路:劍指Offer:限制條件下元素之間的最小絕對差 【題目描述】 給你一個下標從 0 開始的整數數組 nums 和一個整數 x 。 請你找到數組中下標距離至少為 x 的兩個元素的…

虛擬機內搭建CTFd平臺搭建及CTF題庫部署,局域網內機器可以訪問

一、虛擬機環境搭建 1、安裝docker、git、docker-compose ubuntu: sudo apt-get update #更新系統 sudo apt-get -y install docker.io #安裝docker sudo apt-get -y install git #安裝git sudo apt-get -y install python3-pip #安裝pip3 sudo pip install dock…

SQL筆記

最近的工作對SQL的應用程度較高,而且寫的sql類型基本沒怎么涉及過,把用到的幾個關鍵字記錄下。 使用環境:達夢數據庫 達夢數據庫有個特點,他有一個叫模式的說法,在圖形化工具里直接點擊創建查詢窗口,不用像…

Kubeadm安裝K8s集群

一、硬件環境 準備3臺Linux服務器&#xff0c;此處用Vmware虛擬機。 主機名CPU內存k8smaster2核4Gk8snode12核4Gk8snode22核4G 二、系統前置準備 配置三臺主機的hosts文件 cat << EOF > /etc/hosts 192.168.240.130 k8smaster 192.168.240.132 k8snode1 192.168.…

Sql奇技淫巧之ROWNUM偽列

ROWNUM偽列 ROWNUM是一個偽列&#xff0c;它是根據每次查詢的結果動態生成的一列遞增編號&#xff0c;表示 Oracle 從表中選擇該行的順序&#xff0c;選擇的第一行ROWNUM為1&#xff0c;第二行ROWNUM為2&#xff0c;以此類推。 注意1&#xff1a; ROWNUM偽列是在WHERE子句之…

torch.profiler

什么是torch.profiler PyTorch Profiler 是一個工具&#xff0c;它允許在訓練和推理期間收集性能指標。Profiler 的上下文管理器 API 可用于更好地了解哪些模型操作最昂貴&#xff0c;檢查它們的輸入形狀和調用堆棧&#xff0c;研究設備內核活動并可視化執行跟蹤。 性能指標&…

騰訊出品Pag動畫框架在Android端的使用-初級

Pag動畫框架作為一個第三方框架&#xff0c;它的優缺點與Lottie是相似&#xff0c;此處不過多贅述。如果你們的項目中打算用了&#xff0c;肯定是經過了一定的調研的。Pag動畫框架分幾個版本&#xff0c;有免費的有收費的。我們目前用的社區免費版&#xff0c;只用來展示Pag動畫…

項目實戰 — 消息隊列(8){網絡通信設計②}

目錄 一、客戶端設計 &#x1f345; 1、設計三個核心類 &#x1f345; 2、完善Connection類 &#x1f384; 讀取請求和響應、創建channel &#x1f384; 添加掃描線程 &#x1f384; 處理不同的響應 &#x1f384; 關閉連接 &#x1f345; 3、完善Channel類 &#x1f384; 編…

廣州華銳互動:VR3D課程在線教育平臺為職業院校提供沉浸式的虛擬現實學習體驗

隨著科技的飛速發展&#xff0c;虛擬現實(VR)和增強現實(AR)技術已經逐漸滲透到我們生活的各個領域。其中&#xff0c;VR3D課程在線教育平臺作為一種新興的教育方式&#xff0c;正在逐漸改變我們的學習方式和體驗。本文將詳細介紹VR3D課程在線教育平臺的應用前景及特點。 VR3D課…

VFP現代物流企業管理系統的設計與實現

摘要: 隨著計算機技術的廣泛應用,在現代流通企業管理中引入計算機管理技術,成為一個值得深入研究的問題。 本文首先概要的論述了數據庫的有關知識與現狀。之后,對當代計算機數據庫技術的現狀,尤其是對關系型數據庫作了系統的描述。在此基礎上,論文重點對數據庫的開發環境 …

【設計模式】工廠模式

工廠模式 工廠模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式。 工廠模式提供了一種將對象的實例化過程封裝在工廠類中的方式。通過使用工廠模式&#xff0c;可以…

Mysql整理二 - 常見查詢語句面試題(附原表)

表結構&#xff0c;創建原表的代碼在最后 -- cid課程id; tid老師id; sid學生id; select * from t_mysql_course; select * from t_mysql_score; select * from t_mysql_student; select * from t_mysql_teacher; 1. 查詢" 01 “課程比” 02 "課程成績高的學生的信息…

uniapp軟鍵盤談起遮住輸入框和頭部被頂起的問題解決

推薦&#xff1a; pages.json中配置如下可解決頭部被頂起和表單被遮住的問題。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

01.setup,reactive,ref,computed,watch學習---2023新版Vue3基礎入門到實戰項目

1.Vue3組合式 2.創建vue3項目 2.1認識create-vue create-vue是官方新的腳手架工具&#xff0c;vite下一代構建工具 node -v >16 npm init vuelatest 2.2 setup 原始寫法 <script> export default {//執行時機比beforeCreate早//獲取不到this//數據和函數必須ret…

Java實戰:高效提取PDF文件指定坐標的文本內容

前言 臨時接到一個緊急需要處理的事項。業務側一個同事有幾千個PDF文件需要整理&#xff1a;需要從文件中的指定位置獲取對應的編號和地址。 要的急&#xff0c;工作量大。所以就問到技術部有沒有好的解決方案。 問技術的話就只能寫個demo跑下了。 解決辦法 1. 研究下PDF文檔…