前提說明:
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)向
從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)都有那些!
專門用于創(chuàng)建適配于GraalVM和OpenJDK HotSpot的云原生框架谁尸。這說明它可以并肩與兩種虛擬機(jī)的存在舅踪!對HotSpot虛擬機(jī)而言(無論是Oracle JDK還是OpenJDK我們都不陌生!)症汹,我們就不多說了硫朦,這里特別說一下GraalVM虛擬機(jī),它是一個新時代的虛擬機(jī)(特別是它有一個強(qiáng)大的編譯器)背镇,可謂是Quarkus性能優(yōu)化的靈魂所在咬展!
專門用于針對容器優(yōu)化Java應(yīng)用程序,并使其成為無服務(wù)器架構(gòu)(甚至面向與Faas化瞒斩,這也是GraalVM的功勞之一)破婆、云上服務(wù)、還有就是我們重點(diǎn)關(guān)注的Kubernetes模式下的云原生服務(wù)胸囱!
主要的目的就是為了集成Kubernetes(特別是Kubernetes集群)而生的祷舀,非常的具有針對性和專業(yè)性!
Quarkus的優(yōu)點(diǎn)
我們在看看Quarkus的優(yōu)點(diǎn)吧烹笔!
(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)的,有興趣的小伙伴們咖耘,可以好好研究扒檀亍!
(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ù)雜的后顧之憂!
(云原生的升級)森篷,之前我們開發(fā)Java項目而言输钩,如果想做成Docker鏡像或者Kubernetes鏡像,那么只能依靠于額外的第三發(fā)插件或者開發(fā)庫仲智,導(dǎo)致我們的項目過于臃腫了买乃,而且Spring對Docker或者K8s的支持也不太盡人意,但是有了Quarkus后钓辆,就可以與Docker和Kubernetes輕松集成剪验,不依靠額外插件,它可以打造Docker資源(包含JVM模式Dockerfile前联、云原生模式的Dockerfile)功戚、kubernete資源甚至是OpenShift資源。
(服務(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)咳胃,豈不美哉!
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步”
你需要一個開發(fā)者工具,例如:IDEA佑钾、Eclipse等
你需要JDK11+版本的JVM環(huán)境資源
選擇一個GraalVM虛擬機(jī)作為編譯器的基礎(chǔ)
最好選擇一個Maven(3.8.1版本)/Gradle工具
最后基于官方最新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ù)骨架
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 )
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 )
到這里管跺,我們可以看到一點(diǎn)义黎,為了讓大家熟悉Quarkus、快速開發(fā)Quarkus服務(wù)豁跑,它采用了和SpringBoot非常相似的架構(gòu)和參數(shù)配置廉涕,可以讓我們快速進(jìn)行迭代執(zhí)行開發(fā)機(jī)制!
Quarkus Start Coding搭建項目骨架
首先艇拍,我們打開瀏覽器直接訪問:http://code.quarkus.io
我們主要關(guān)注我紅線劃分出來的這三個區(qū)域即可狐蜕!
Quarkus Start Coding腳手架網(wǎng)站
Group:配置應(yīng)用的Maven groupId,一般我們采用域名反向即可卸夕。
Artifact:配置應(yīng)用的Maven artifactId层释,一般就是我們的應(yīng)用名
Build構(gòu)建方式: 這里可以選擇:Maven/Gradle
而下面的Web部分:
則需要我們選擇一個我們希望的Rest服務(wù)框架的實現(xiàn)方式:可以看到非常的多哈。
點(diǎn)擊-Genrate your application,直接進(jìn)行提交快集,就可以下載相關(guān)的代碼骨架贡羔!
這與我們的Spring Initializer非常之相像。
開發(fā)工具構(gòu)建Quarkus應(yīng)用服務(wù)骨架
創(chuàng)建一個新的Quarkus工程項目
- IDEA主菜單選擇File -> New Project
選擇創(chuàng)建Quarkus應(yīng)用程序
選擇default Server URL: https://code.quarkus.io.
[========] 翻頁
IDEA安裝Quarkus支持的插件
如果你的IDEA沒有支持Quarkus功能那么需要進(jìn)行安裝插件,因為低版本是沒有Quarkus項目的,我們可以選擇圖中的方式進(jìn)行安裝插件即可浪听。
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)行即可。
- 注意:推薦使用Java11以上的JVM版本
Quarkus開發(fā)模式實現(xiàn)實時熱部署
在上面左邊的圖中乌妒,顯示了相關(guān)的汹想,Quarkus資源服務(wù)接口代碼:,返回的是一個Hello RESTEasy接口撤蚊!
右邊是我們執(zhí)行curl命令調(diào)用服務(wù)接口的到的結(jié)果:
此時當(dāng)我們進(jìn)行修改代碼古掏,將返回參數(shù)改為“hello”
重新進(jìn)行調(diào)用后,可以看到結(jié)果是
hello
可以說侦啸,真實非常的的方便槽唾!
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ù)注解介紹
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ù)的路徑變量