新聞中心
譯者 | 李睿

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


咨詢
建站咨詢
