七個(gè)用于云原生世界的Java框架
譯文譯者 | 李睿
審校 | 孫淑娟
Java編程語言自誕生以來已有將近30年的歷史,該語言及其字節(jié)碼已經(jīng)廣泛應(yīng)用在從嵌入式芯片到大型服務(wù)器群的所有領(lǐng)域。Java結(jié)合了堅(jiān)不可摧的虛擬機(jī)和大量的庫,為編寫隨處運(yùn)行的代碼提供了一個(gè)肥沃的生態(tài)系統(tǒng)。
然而,Java一直在努力的一個(gè)領(lǐng)域是服務(wù)器領(lǐng)域,它通常必須處理來自數(shù)千甚至數(shù)百萬個(gè)用戶的連接。早些年,Java工具是創(chuàng)建為所有用戶強(qiáng)制執(zhí)行業(yè)務(wù)邏輯的服務(wù)器端應(yīng)用程序的最佳工具之一。J2EE、Hibernate、Spring等Java框架和基本的Javaservlet模型使得創(chuàng)建強(qiáng)大的Web應(yīng)用程序變得相對(duì)容易。
在JavaScript和Node.js出現(xiàn)之前,Java技術(shù)得以蓬勃發(fā)展。在Node.js引起廣泛關(guān)注之后,開發(fā)人員開始遷移到JavaScript運(yùn)行時(shí)環(huán)境。這里有兩個(gè)原因:首先,開發(fā)人員歡迎在服務(wù)器和瀏覽器客戶機(jī)上運(yùn)行相同的代碼。其次,Node.js服務(wù)器通??梢燥@著地提高吞吐量,這要?dú)w功于它們的響應(yīng)式模型。
Java生態(tài)系統(tǒng)如今適應(yīng)了競爭。一開始,一些開發(fā)人員采用了Google Web Toolkit等工具,該工具可以將Java轉(zhuǎn)換為JavaScript。接下來,他們致力于提高服務(wù)器上的Java運(yùn)行速度。而早期的服務(wù)器Java框架有一個(gè)限制:每個(gè)傳入的請(qǐng)求都有自己的線程。這是一種組織傳入和傳出數(shù)據(jù)的干凈方式,但也很費(fèi)事。創(chuàng)建線程需要數(shù)千字節(jié)的開銷,這可能會(huì)限制每臺(tái)服務(wù)器可以處理的用戶數(shù)量。Node.js使用了一個(gè)不同的模型,它允許在沒有這種開銷的情況下處理更多的用戶。
最近,Java開發(fā)人員將Node.js的創(chuàng)新引入Java堆棧,尤其是云原生Java框架。這些框架模仿Node.js的做法,支持輕量級(jí)的功能,運(yùn)行在云計(jì)算服務(wù)器上,可以快速啟動(dòng)和停止。它們無需額外的庫來支持在可用的服務(wù)器實(shí)例上的快速部署。云原生Java框架旨在支持可獨(dú)立安裝和重新啟動(dòng)的微服務(wù)群。它們通常在Docker或Podman等容器中發(fā)布,以實(shí)現(xiàn)最快的構(gòu)建和安裝。
尋求云原生體驗(yàn)的現(xiàn)代Java開發(fā)人員有多種選擇。理想的云原生Java框架利用在Java平臺(tái)及其第三方庫中投入的豐富經(jīng)驗(yàn),同時(shí)調(diào)整它們以在云平臺(tái)中更快、更輕地運(yùn)行。以下是為云原生開發(fā)和部署從頭開始構(gòu)建的7個(gè)Java框架。
1.Micronaut
Micronaut的創(chuàng)建者希望利用Spring和Grails等經(jīng)典Java框架的最佳部分,例如靈活的配置和依賴項(xiàng)注入,但要消除內(nèi)存占用過大和啟動(dòng)速度慢的缺點(diǎn),因?yàn)檫@些缺點(diǎn)使它們不太適合開發(fā)微服務(wù)。開發(fā)人員精心設(shè)計(jì)了注釋,為依賴注入提供了足夠的信息,而無需使用舊框架中的內(nèi)存填充反射。在編譯時(shí)完成更多Micronaut的配置意味著代碼運(yùn)行更快、更輕。
該框架旨在支持各種基于JVM的語言(目前是Java、Kotlin和Groovy)并在各種云平臺(tái)中運(yùn)行它們。預(yù)定義的配置文件簡化了在所有主要云平臺(tái)上部署服務(wù)器或無服務(wù)器功能,并且所有主要數(shù)據(jù)庫連接都有編寫良好的文檔頁面。
Micronaut的開發(fā)人員還希望該框架能夠支持良好的開發(fā)團(tuán)隊(duì)合作。HttpClient實(shí)現(xiàn)與項(xiàng)目捆綁在一起,以簡化編寫單元測試,而無需離開Micronaut或添加更多工作。這些測試通常比動(dòng)態(tài)框架所需的測試更簡單、更全面。這再次歸功于在編譯時(shí)完成的工作。
Micronaut不僅用于開發(fā)具有云計(jì)算功能的應(yīng)用程序。該框架足夠通用,可以支持傳統(tǒng)角色和一些桌面應(yīng)用程序。它與GraalVM的緊密集成使得使用Micronaut生成原生應(yīng)用程序成為可能。
2.Quarkus
想要使用易于理解的命令式和反應(yīng)式代碼組合的開發(fā)人員可以求助于Quarkus。Quarkus團(tuán)隊(duì)首先預(yù)測云原生開發(fā)的最常見用例,然后使用示例構(gòu)建框架,這些示例支持那些只需零配置的用例。其結(jié)果可以輕松地集成到容器中,并部署在Kubernetes集群中。
開發(fā)團(tuán)隊(duì)需要確??焖賳?dòng),以便Kubernetes集群可以快速擴(kuò)展。對(duì)于偶爾運(yùn)行的函數(shù)來說,這是一個(gè)理想的特性,因?yàn)樗鼈冊(cè)诒徽{(diào)用之前可以保持冷狀態(tài)。
該項(xiàng)目的目標(biāo)之一是接受和擴(kuò)展Java社區(qū)中常見的許多現(xiàn)有標(biāo)準(zhǔn)和庫。例如,JAX-RS注釋定義了REST端點(diǎn)。配置從Eclipse微文件開始。Quarkus的開發(fā)團(tuán)隊(duì)還集成了50多個(gè)標(biāo)準(zhǔn)庫,因此企業(yè)很有可能在某些情況下識(shí)別設(shè)計(jì)模式。
可以將基本的Quarkus框架用于各種服務(wù)。從Quarkus 2.8開始,Quarkus的開發(fā)人員正在鼓勵(lì)使用RESTeasy Reactive模型。如果正在開始一個(gè)新項(xiàng)目,這是標(biāo)準(zhǔn)選項(xiàng),但不必使用它。RESTeasy Reactive提供了一種更簡單、非阻塞的結(jié)構(gòu)和模式。不是為每個(gè)請(qǐng)求分配一個(gè)線程,而是一組非阻塞線程處理所有I/O,并在需要時(shí)調(diào)用代碼。
Quarkus還包含廣泛的部署選項(xiàng)。雖然它被稱為“容器優(yōu)先”,但它可以在裸機(jī)上運(yùn)行。此外,還有一個(gè)名為Funqy的內(nèi)置配置選項(xiàng),可以簡化創(chuàng)建AWS Lambda、Azure Functions、Knative和其他一些選項(xiàng)所接受的函數(shù)。
3.Spring Cloud Functions
Java開發(fā)人員非常熟悉Spring框架,因?yàn)樗谴蠹s20年來許多項(xiàng)目的基礎(chǔ)。Spring的開發(fā)人員決定創(chuàng)建一個(gè)更適合云部署以及其他一些角色的新版本。Spring Cloud Functions中的函數(shù)旨在輕松地重新部署到各種任務(wù),如Web服務(wù)、流處理或后臺(tái)工作。
Spring Cloud Functions框架延續(xù)了Spring開創(chuàng)的許多相同的傳統(tǒng)。此框架中的云功能支持反應(yīng)式或命令式風(fēng)格,以及兩者的混合。
支持多種選擇是該項(xiàng)目的一個(gè)重要目標(biāo)。有一些適配器將這些函數(shù)嵌入到AWS Lambda、Microsoft Azure、Apache OpenWhisk、谷歌云平臺(tái)和其他一些常見的云計(jì)算函數(shù)環(huán)境中。還有一些主要流式框架的適配器,如Apache Kafka、Solace和RabbitMQ,以及獨(dú)立選項(xiàng)Spring Cloud Stream。打包和部署高度自動(dòng)化,因此開發(fā)人員可以集中精力開發(fā)功能。
Spring Cloud Functions開發(fā)團(tuán)隊(duì)還努力處理云部署的許多常見陷阱和挑戰(zhàn)。Spring Cloud Skipper可用于跨多個(gè)云平臺(tái)進(jìn)行部署。Spring Cloud Sleuth通過跟蹤數(shù)據(jù)流來幫助調(diào)試。Spring Cloud Security管理許多用于保護(hù)應(yīng)用程序的瑣事,以便只有合適的人員才能執(zhí)行這些功能。光是子項(xiàng)目就有幾十個(gè)。
該項(xiàng)目為通過各種平臺(tái)分發(fā)業(yè)務(wù)應(yīng)用程序奠定了非常好的基礎(chǔ)。一旦應(yīng)用程序邏輯被封裝到一個(gè)云函數(shù)POJO中,它就可以找到一個(gè)在幾十個(gè)不同角色中工作的場所。
4.Vert.x
Vert.x的創(chuàng)建者希望通過簡化事件循環(huán)和優(yōu)化與數(shù)據(jù)庫的連接來創(chuàng)建一個(gè)非常快速的框架。Vert.x有一個(gè)像Node.js一樣的事件循環(huán),它允許在事件到達(dá)時(shí)處理多個(gè)連接。它還利用Java的線程模型來處理池中的多個(gè)線程的事件,如果可用,它們可以在多個(gè)內(nèi)核上運(yùn)行。
該結(jié)構(gòu)還計(jì)劃簡化創(chuàng)建管道以處理事件流。它借用了諸如promises和futures之類的結(jié)構(gòu)來避免帶有分層回調(diào)的混亂代碼。當(dāng)事件沿著事件總線移動(dòng)時(shí),異步選項(xiàng)有助于生成干凈、可讀的代碼,其中填充了簡單的方法調(diào)用鏈。
Vert.x開發(fā)團(tuán)隊(duì)對(duì)他們的發(fā)展愿景并不死板教條。他們認(rèn)為Vert.x是一個(gè)工具包而不是一個(gè)框架。該代碼是模塊化的,因此開發(fā)人員可以選擇使用一些功能集成到適合其應(yīng)用程序的架構(gòu)中。想要更多命令式結(jié)構(gòu)而不是響應(yīng)式結(jié)構(gòu)的開發(fā)人員可以找到對(duì)Kotlin協(xié)同程序的支持。
該項(xiàng)目是Eclipse生態(tài)系統(tǒng)的一部分。多種版本和選項(xiàng)提供了很大的自由度。例如,Vert.x應(yīng)用程序生成器將生成Java或Kotlin代碼,其中包含許多潛在的依賴項(xiàng),例如模板引擎或API支持。
5.Eclipse MicroProfile
Eclipse團(tuán)隊(duì)創(chuàng)建了Micro Profile項(xiàng)目,以此來調(diào)整Jakarta EE以運(yùn)行較小的微服務(wù)群。它消除了一些較大平臺(tái)的開銷,同時(shí)將許多微服務(wù)架構(gòu)的標(biāo)準(zhǔn)庫捆綁在一起。
對(duì)于可能從較大、較舊的JavaEE或Jakarta EE項(xiàng)目遷移代碼的開發(fā)人員來說,這種方法最有吸引力。大部分配置和架構(gòu)保持不變。在許多情況下調(diào)整很小。但是該設(shè)計(jì)鼓勵(lì)做出更簡單的決策來創(chuàng)建更輕量級(jí)、更快的代碼。一些開發(fā)人員使用MicroProfile作為通往更現(xiàn)代的云原生框架的墊腳石。
6.Dropwizard
一些開發(fā)人員對(duì)經(jīng)過良好測試的舊模塊有一種天然的感情,他們喜歡采用Dropwizard。Dropwizard的開發(fā)團(tuán)隊(duì)一直強(qiáng)調(diào)穩(wěn)定和成熟等特性。他們收集了Hibernate之類的數(shù)據(jù)庫連接模塊,并在表單和其他標(biāo)準(zhǔn)Web應(yīng)用程序組件的框架中進(jìn)行了混合。Dropwizard還簡化了依賴項(xiàng)注入和運(yùn)行時(shí)維護(hù)過程,如配置和日志記錄。
Dropwizard是致力于修改和擴(kuò)展現(xiàn)有應(yīng)用程序的團(tuán)隊(duì)的最愛。該結(jié)構(gòu)與原有成熟的方法兼容,因?yàn)樗窃谶@些方法的基礎(chǔ)上構(gòu)建的。
7.Starter frameworks for cloud platforms
所有的云平臺(tái)都保留了基本示例,這些示例是開始編寫簡單函數(shù)的好地方。它們主要用于支持非常簡單的決策,并幫助開發(fā)人員快速啟動(dòng)。
例如,谷歌云平臺(tái)的開發(fā)團(tuán)隊(duì)開源了他們?cè)谄涔δ芗捶?wù)(FaaS)中運(yùn)行的Java功能的基本框架。使用它構(gòu)建的代碼旨在與谷歌云平臺(tái)的標(biāo)準(zhǔn)觸發(fā)器快速集成,盡管它也可以在任何本地機(jī)器上成功運(yùn)行。
微軟公司還開源了它的Java框架。該模型包括幾個(gè)用于簡化數(shù)據(jù)傳輸?shù)睦?,例如用于將JSON數(shù)據(jù)轉(zhuǎn)換為Java POJO和從Java POJO轉(zhuǎn)換的庫。如果函數(shù)觸發(fā)器為調(diào)用提供元數(shù)據(jù),則框架可以直接處理它。
這兩個(gè)框架都可以讓開發(fā)人員通過編寫具有單個(gè)函數(shù)的單個(gè)類來完成許多簡單的工作。更復(fù)雜的項(xiàng)目可能希望將這一基本工具與其他一些框架合并。這些只是起點(diǎn),但有時(shí)這就足夠了。
原文標(biāo)題:??7 Java frameworks for a cloud-native world??,作者:Peter Wayner