【Quarkus技術(shù)系列】「云原生架構(gòu)體系」打造基于Quarkus的云原生微服務(wù)框架實踐

前提說明:

Ok,大家好耳鸯,今天呢樱衷,我們的分享主題是“如何打造一個基于Quarkus的云原生微服務(wù)架構(gòu)”,無論你之前是否了解或者熟悉Quarkus店溢,希望通過今天的技術(shù)分享可以讓你認(rèn)識和知道Quarkus叁熔。

進(jìn)入前奏:

好了,我們廢話不多說床牧,進(jìn)入主題荣回,我覺得要是談到Quarkus,那么我們肯定需要先分析一下戈咳,目前Java和云原生服務(wù)的關(guān)系以及在行業(yè)中它們的風(fēng)向心软、行情。


Java和云原生在行業(yè)的行情和風(fēng)向

image

從Java角度而言:

雖然伴隨著時間的流逝和技術(shù)的日新月異著蛙,Java的地位慢慢這有所下滑糯累,但是“瑕不掩瑜”,Java陪伴我走過了很多的美好的時光册踩,而且它仍然是我們非常矚目的編程語言泳姐!但不得不說,對于微服務(wù)層面而言暂吉,Java無論是RPC胖秒、序列化、傳輸協(xié)議慕的、技術(shù)體系都有著其他語言無法比擬的實力阎肝,但是我們漸漸發(fā)現(xiàn),微服務(wù)2.0以及云原生的到來肮街,讓Java可能有點(diǎn)應(yīng)對不及风题,因為在Java的領(lǐng)域內(nèi),主要依靠兩個核心來源進(jìn)行技術(shù)推動,一沛硅、就是依靠Spring技術(shù)生態(tài)圈眼刃;二、就是Oracle官方進(jìn)行推動摇肌。而Oracle官方也推出了幾個微服務(wù)框架和技術(shù)框架擂红,比如說,Helidon 是由 Oracle 在 2018 年 9 月份推出的輕量級微服務(wù)框架围小、Micronaut昵骤,但是不都是很理想,還是有主流的Spring家族所掌控著肯适。而Spring的技術(shù)重心還未完全轉(zhuǎn)移到云原生上面变秦。

從云原生角度而言:

我們都知道Kubernetes已經(jīng)是我們目前技術(shù)領(lǐng)域、運(yùn)維部署領(lǐng)域框舔、容器化領(lǐng)域的行業(yè)標(biāo)準(zhǔn)蹦玫,而且更是在云原生領(lǐng)域大方光彩!那么如何讓Java應(yīng)用更加完美的轉(zhuǎn)化到Kubernetes層面就是一個很大的難題坝杲取钳垮!

別擔(dān)心惑淳,Quarkus幫助我們解決了這個難題额港!

進(jìn)入正題:

首先我們將Quarkus云原生框架的實踐流程分為6個部分,我們稱之為“夸克斯實踐6步歧焦!”移斩,它們都有什么呢。


進(jìn)入Quarkus的基本概念:

首先Quarkus绢馍,我們也可以叫它的中文名稱“夸克斯”向瓷,相信大家也知道阿里也有一款瀏覽器叫“夸克”,有點(diǎn)相似舰涌,差一個s猖任,大家別記混了,它是RedHat公司開源的一款Java云原生服務(wù)框架瓷耙,到這里朱躺,說一句題外話?kubernetes很牛搁痛!它們兩大“東家”长搀,一個就是眾所周知的谷歌,另一個就是RedHat公司鸡典,它是RedHat公司親自操刀開發(fā)的源请!這能不強(qiáng)大嗎!

Quarkus的特點(diǎn)有哪些:

我們來說說看它的特點(diǎn)都有那些!

  1. 專門用于創(chuàng)建適配于GraalVM和OpenJDK HotSpot的云原生框架谁尸。這說明它可以并肩與兩種虛擬機(jī)的存在舅踪!對HotSpot虛擬機(jī)而言(無論是Oracle JDK還是OpenJDK我們都不陌生!)症汹,我們就不多說了硫朦,這里特別說一下GraalVM虛擬機(jī),它是一個新時代的虛擬機(jī)(特別是它有一個強(qiáng)大的編譯器)背镇,可謂是Quarkus性能優(yōu)化的靈魂所在咬展!

  2. 專門用于針對容器優(yōu)化Java應(yīng)用程序,并使其成為無服務(wù)器架構(gòu)(甚至面向與Faas化瞒斩,這也是GraalVM的功勞之一)破婆、云上服務(wù)、還有就是我們重點(diǎn)關(guān)注的Kubernetes模式下的云原生服務(wù)胸囱!

  3. 主要的目的就是為了集成Kubernetes(特別是Kubernetes集群)而生的祷舀,非常的具有針對性和專業(yè)性!

Quarkus的優(yōu)點(diǎn)

我們在看看Quarkus的優(yōu)點(diǎn)吧烹笔!

  1. (JVM的升級)首先我們在回到GraalVM這個概念上來裳扯,剛剛說到了GraalVM的編譯器功能,那么我們就知道谤职,它是可以通過借助GraalVM的編譯器實現(xiàn)內(nèi)聯(lián)機(jī)制饰豺,逃逸分析以及獨(dú)特的優(yōu)化技術(shù),可以提升2至5倍的性能允蜈。此外特意多說一下冤吨,GraalVM就是為了代替JVM原有的C2編譯器,才誕生的饶套,C2編譯器是Ciff click 大神的精心之作漩蟆,但是過于龐大和復(fù)雜,甚至到大神自己都不想維護(hù)了妓蛮!所以JVM優(yōu)化的瓶頸已經(jīng)慢慢停留在了C2編譯器怠李,這對Java的發(fā)展是非常不利的!蛤克,所以才有了GraalVM捺癞,并且也是Java實現(xiàn)的,有興趣的小伙伴們咖耘,可以好好研究扒檀亍!

  2. (Spring層面的升級)我們都知道Spring框架不是性能為優(yōu)先儿倒,而是擴(kuò)展性聞名于世版保,而Quarkus的擴(kuò)展能力并不比spring差呜笑!和Spring一樣,完全可以集成Eclipse MicroProfile彻犁、Hibernate叫胁、Apache Camel和Eclipse Vert.x等開源庫、甚至還可以將SpringBoot遷移到Quarkus生態(tài)汞幢,這是不是非常方便呢驼鹅!解決了很多公司或者開發(fā)團(tuán)隊的遷移復(fù)雜的后顧之憂!

  3. (云原生的升級)森篷,之前我們開發(fā)Java項目而言输钩,如果想做成Docker鏡像或者Kubernetes鏡像,那么只能依靠于額外的第三發(fā)插件或者開發(fā)庫仲智,導(dǎo)致我們的項目過于臃腫了买乃,而且Spring對Docker或者K8s的支持也不太盡人意,但是有了Quarkus后钓辆,就可以與Docker和Kubernetes輕松集成剪验,不依靠額外插件,它可以打造Docker資源(包含JVM模式Dockerfile前联、云原生模式的Dockerfile)功戚、kubernete資源甚至是OpenShift資源。

  4. (服務(wù)啟動性能提升)這個可是重頭戲似嗤,在Quarkus服務(wù)中不只是單純擁有JVM這一種運(yùn)行模式啸臀。對于相同的應(yīng)用程序代碼,在原生模式下双谆,服務(wù)啟動速度非晨枪荆快(大約可以縮短3倍的時間席揽,可以減少我們很多的等待時間)顽馋、而且大多數(shù)的Spring項目會占用資源空間非常多,常常會造成很多OOM或者FGC幌羞,我相信大家都遇到過哈寸谜,之前的我們只能通過補(bǔ)救的方案,要不就是Spring的瘦身化属桦,或者去提升JVM GC的能力熊痴,快速回收,無論是采用回收算法聂宾、還是機(jī)器的配置來解決這個問題果善,個人認(rèn)為都只是補(bǔ)救的方面。但是有了Quarkus服務(wù)后系谐,它解決了Spring項目占用龐大內(nèi)存的問題巾陕,因為它本身很小且內(nèi)存消耗低(特別是在原生模式下讨跟,底層水很深!)鄙煤,可以大大提高性能和資源使用率晾匠,這是不是說明我們以后可以很可能跟“OOM”說拜拜了?這里打上一個問號梯刚。

補(bǔ)充一點(diǎn):借了GraalVM的光凉馆,Quarkus也解決了Java體系在跨語言層面來講的很多問題,比如說亡资,它可以支持更多種類的語言接入到Java的生態(tài)中(比如說澜共,組合Java、JavaScript锥腻、Ruby 和 R 語言 )形成多語言微服務(wù)生態(tài)咳胃,豈不美哉!

image

Quarkus的基本開發(fā)流程

我們簡稱為“夸克斯開發(fā)6部”旷太,讓我們來看看它們都是什么展懈?

  • 「搭建腳手架」第一步就是快速搭建屬于Quarkus的應(yīng)用云原生框架(這為構(gòu)建應(yīng)用服務(wù)奠定基礎(chǔ))

  • 「開發(fā)者模式」這個階段代表兩個含義:

  • 1:就是代表著我們需要進(jìn)入開發(fā)狀態(tài)了,當(dāng)然這個是開玩笑的供璧!

  • 2:重點(diǎn)要說的就是存崖,Quarkus微服務(wù)應(yīng)用的(開發(fā)模式)實現(xiàn)實時熱部署能力(改動實時生效),就有點(diǎn)類似于SpringBoot的devTools或者spring loader睡毒、甚至收費(fèi)的JRebel来惧,這種情況需要額外引入包或者插件才可以,而我們Quarkus則直接作為自身的運(yùn)行模式進(jìn)行控制演顾。進(jìn)步的不是一點(diǎn)點(diǎn)肮┎蟆!

  • 「進(jìn)行業(yè)務(wù)編碼」通過集成多個開源庫以及相關(guān)業(yè)務(wù)需求進(jìn)行開發(fā)相關(guān)的程序代碼

  • 「建立集成測試」當(dāng)開發(fā)編碼完成之后建立版本钠至,進(jìn)行開發(fā)層面集成化測試階段

  • 「生成鏡像打包」建立CLI程序以及創(chuàng)建云原生可執(zhí)行包文件葛虐,并建立對應(yīng)的容器服務(wù)

  • 「部署基礎(chǔ)K8S」將對應(yīng)的可執(zhí)行應(yīng)用文件、容器文件棉钧、云原生文件包直接集成部署到Kubernetes集群中


Quarkus的環(huán)境搭建流程

了解了總體的開發(fā)實踐流程之后屿脐,我覺得到這里才算是真正的開始實踐Quarkus了,我們就先看看官方指定的宪卿,環(huán)境搭建流程的诵,姑且稱之為“Quarkus搭建5步”

image

  1. 你需要一個開發(fā)者工具,例如:IDEA佑钾、Eclipse等

  2. 你需要JDK11+版本的JVM環(huán)境資源

  3. 選擇一個GraalVM虛擬機(jī)作為編譯器的基礎(chǔ)

  4. 最好選擇一個Maven(3.8.1版本)/Gradle工具

  5. 最后基于官方最新Quarkus版本(2.3.0.Final)進(jìn)行開發(fā)實現(xiàn)西疤。

Quarkus服務(wù)架構(gòu)的搭建

首先,框架的搭建方案大致有四種休溶,分別是:

Maven構(gòu)建Quarkus應(yīng)用服務(wù)骨架

首先我們來看看第一種構(gòu)建方式代赁,通過Maven構(gòu)建Quarkus應(yīng)用服務(wù)骨架

image
Maven項目框架結(jié)構(gòu)撒遣,包含了相關(guān)的內(nèi)容主要是:
  • Quarkus服務(wù)所需要的Maven環(huán)境pom.xml文件

  • 基礎(chǔ)的JAX-RS的資源服務(wù)類

  • 對應(yīng)的JAX-RS的資源服務(wù)的測試類

  • Quarkus原生模式的測試類

  • 用于創(chuàng)建Docker容器的Dockerfile文件

  • 空的配置文件( application.properties )

image

Gradle構(gòu)建Quarkus應(yīng)用服務(wù)骨架
Gradle項目框架結(jié)構(gòu),包含了相關(guān)的內(nèi)容主要是:
  • Quarkus服務(wù)所需要的Gradle環(huán)境build.gradle文件

  • 基礎(chǔ)的JAX-RS的資源服務(wù)類

  • 對應(yīng)的JAX-RS的資源服務(wù)的測試類

  • Quarkus原生模式的測試類

  • 用于創(chuàng)建Docker容器的Dockerfile文件

  • 空的配置文件( application.properties )

image

到這里管跺,我們可以看到一點(diǎn)义黎,為了讓大家熟悉Quarkus、快速開發(fā)Quarkus服務(wù)豁跑,它采用了和SpringBoot非常相似的架構(gòu)和參數(shù)配置廉涕,可以讓我們快速進(jìn)行迭代執(zhí)行開發(fā)機(jī)制!


Quarkus Start Coding搭建項目骨架

首先艇拍,我們打開瀏覽器直接訪問:http://code.quarkus.io

image

我們主要關(guān)注我紅線劃分出來的這三個區(qū)域即可狐蜕!

Quarkus Start Coding腳手架網(wǎng)站
image
  • Group:配置應(yīng)用的Maven groupId,一般我們采用域名反向即可卸夕。

  • Artifact:配置應(yīng)用的Maven artifactId层释,一般就是我們的應(yīng)用名

  • Build構(gòu)建方式: 這里可以選擇:Maven/Gradle

而下面的Web部分:

則需要我們選擇一個我們希望的Rest服務(wù)框架的實現(xiàn)方式:可以看到非常的多哈。

image

點(diǎn)擊-Genrate your application,直接進(jìn)行提交快集,就可以下載相關(guān)的代碼骨架贡羔!

image

這與我們的Spring Initializer非常之相像。


開發(fā)工具構(gòu)建Quarkus應(yīng)用服務(wù)骨架

創(chuàng)建一個新的Quarkus工程項目

  • IDEA主菜單選擇File -> New Project
image
image

[========] 翻頁

IDEA安裝Quarkus支持的插件

如果你的IDEA沒有支持Quarkus功能那么需要進(jìn)行安裝插件,因為低版本是沒有Quarkus項目的,我們可以選擇圖中的方式進(jìn)行安裝插件即可浪听。

image

Quarkus應(yīng)用程序的運(yùn)行模式

首先呢 ,大家可以看到楣嘁,Quarkus主要有三種運(yùn)行模式,分別是開發(fā)模式珍逸、測試模式逐虚、生產(chǎn)模式!

Quarkus具有3種不同的啟動模式:

  • Development(開發(fā)環(huán)境)

  • 直接運(yùn)行quarkus:dev maven命令谆膳,則模式為DEVELOPMENT叭爱,這個我后面會詳細(xì)介紹到的,特別方便我們的開發(fā)摹量,可以實現(xiàn)改動的實時生效涤伐。

  • Test(測試環(huán)境)

  • 如果正在運(yùn)行JUnit測試馒胆,則模式轉(zhuǎn)為Test缨称,例如:可以實現(xiàn)更加強(qiáng)大的Testcontainers或者原生可執(zhí)行文件的測試等。

  • Normal(生產(chǎn)環(huán)境)

  • 出了以上的兩種情況祝迂,都屬于Normal模式睦尽,就是我們正式發(fā)布的可執(zhí)行包文件。


Quarkus開發(fā)模式實現(xiàn)實時熱部署

開發(fā)模式就像我剛才說的型雳,它主要是對標(biāo)Spring loader当凡、Spring devtools山害、Jrebel等熱部署機(jī)制

Quarkus的dev(開發(fā)模式)

如果使用開發(fā)模式,則后臺編譯實現(xiàn)熱部署機(jī)制沿量。

  • 當(dāng)修改Java文件或者靜態(tài)資源文件后浪慌,只需要刷新瀏覽器就會自動變更,實時很方便朴则!
開啟dev模式的Quarkus應(yīng)用程序

如何啟動開發(fā)模式的機(jī)制呢权纤?

  • 在Maven項目根目錄執(zhí)行命令: mvnw quarkus:dev

  • Gradle項目根目錄命令: gradlew quarkusDev

  • 也可以通過IDEA的Maven插件進(jìn)行直接點(diǎn)擊運(yùn)行即可。

image
  • 注意:推薦使用Java11以上的JVM版本

Quarkus開發(fā)模式實現(xiàn)實時熱部署

在上面左邊的圖中乌妒,顯示了相關(guān)的汹想,Quarkus資源服務(wù)接口代碼:,返回的是一個Hello RESTEasy接口撤蚊!

image

右邊是我們執(zhí)行curl命令調(diào)用服務(wù)接口的到的結(jié)果

image

此時當(dāng)我們進(jìn)行修改代碼古掏,將返回參數(shù)改為“hello”

image

重新進(jìn)行調(diào)用后,可以看到結(jié)果是hello

image

可以說侦啸,真實非常的的方便槽唾!


Quarkus端點(diǎn)服務(wù)開發(fā)介紹

  • Quarkus框架對Restful Web服務(wù)的支持能力

  • Quarkus集成RestEasy框架,它是一個遵循Rest協(xié)議模式的JAX-RS光涂,也是其定義REST端點(diǎn)的基礎(chǔ)默認(rèn)框架夏漱。

  • Quarkus框架對Restful Web服務(wù)的開發(fā)方式

  • Quarkus使用,通過使用JAX-RS注解進(jìn)行修飾綁定顶捷,使用HTTP注解(@GET挂绰、@POST、@PUT服赎、@DELETE葵蒂、@PATCH等)聲明端點(diǎn)服務(wù)的請求類型,并且通過@Path注解定義公共Path部分重虑。

  • Quarkus框架對接收資源類型和輸出資源類型

  • @Consumes注解可以定義端點(diǎn)服務(wù)的接收資源類型践付,例如:@Consumes(MediaType.TEXT_PLAIN)

  • @Produces注解可以定義端點(diǎn)服務(wù)的接收資源類型,例如: @Produces(MediaType.TEXT_PLAIN)

Quarkus端點(diǎn)服務(wù)注解介紹

image
  • Quarkus框架實現(xiàn)端點(diǎn)服務(wù)的基礎(chǔ)開發(fā)結(jié)構(gòu)

  • 定義當(dāng)前資源的URI定位符路徑:@Path注解

  • 設(shè)計Http請求的方法類型 @GET注解

  • 定義返回類型的資源相應(yīng)類型 @Produces注解

  • 定義接收查詢Http相關(guān)的參數(shù)信息

  • @QueryParam注解可以定義端點(diǎn)請求參數(shù)

  • @HeaderParam注解可以定義端點(diǎn)服務(wù)的請求參數(shù)

  • @FormParam注解可以定義端點(diǎn)服務(wù)的表單參數(shù)

  • @CookieParam注解可以定義端點(diǎn)服務(wù)的cookie參數(shù)

  • @PathParam注解可以定義端點(diǎn)服務(wù)的路徑變量

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缺厉,一起剝皮案震驚了整個濱河市永高,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌提针,老刑警劉巖命爬,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辐脖,居然都是意外死亡饲宛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門嗜价,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艇抠,“玉大人幕庐,你說我怎么就攤上這事〖矣伲” “怎么了异剥?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長絮重。 經(jīng)常有香客問我届吁,道長,這世上最難降的妖魔是什么绿鸣? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任疚沐,我火速辦了婚禮,結(jié)果婚禮上潮模,老公的妹妹穿的比我還像新娘亮蛔。我一直安慰自己,他們只是感情好擎厢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著动遭,像睡著了一般芬探。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厘惦,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天偷仿,我揣著相機(jī)與錄音,去河邊找鬼宵蕉。 笑死酝静,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的羡玛。 我是一名探鬼主播别智,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稼稿!你這毒婦竟也來了薄榛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤让歼,失蹤者是張志新(化名)和其女友劉穎敞恋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體是越,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耳舅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倚评。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浦徊。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖天梧,靈堂內(nèi)的尸體忽然破棺而出盔性,到底是詐尸還是另有隱情,我是刑警寧澤呢岗,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布冕香,位于F島的核電站,受9級特大地震影響后豫,放射性物質(zhì)發(fā)生泄漏悉尾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一挫酿、第九天 我趴在偏房一處隱蔽的房頂上張望构眯。 院中可真熱鬧,春花似錦早龟、人聲如沸惫霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壹店。三九已至,卻和暖如春芝加,著一層夾襖步出監(jiān)牢的瞬間硅卢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工藏杖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留老赤,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓制市,卻偏偏與公主長得像抬旺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子祥楣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容