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