什么是 Java 的無服務器化?
幾十年來,企業(yè)已經(jīng)在各類平臺上開發(fā)了關(guān)鍵業(yè)務應用程序,包括物理服務器、虛擬機和云環(huán)境。這些應用程序在各行各業(yè)都有一個共同點,那就是無論需求如何,它們都需要持續(xù)可用(24x7x365),保證穩(wěn)定性、可靠性和性能。因此,即使實際資源利用率低于 50%,每個企業(yè)都必須付出高額成本維護基礎架構(gòu)(如 CPU、內(nèi)存、磁盤、網(wǎng)絡等)。
無服務器架構(gòu)是為了幫助解決這些問題而產(chǎn)生的。無服務器允許開發(fā)人員按需構(gòu)建和運行應用程序,保證高可用性,不必在多云和混合云環(huán)境中管理服務器。在幕后,無服務器拓撲中仍有很多服務器,但它們是從應用程序開發(fā)中抽象出來的。相反,云提供商使用無服務器進行資源管理,例如配置、維護、聯(lián)網(wǎng)和擴展服務器實例。
由于其高效性,無服務器開發(fā)模式現(xiàn)在是一些企業(yè)的需求,這些企業(yè)希望按需啟動服務,而不是一直運行服務。
許多新建的開源項目用來在 Kubernetes 集群上通過 Linux 容器包來管理無服務器應用程序。CNCF 的《交互式無服務器全景》 是一份關(guān)于開源項目、工具、框架和公共云平臺的指南,幫助 DevOps 團隊處理無服務器應用程序。
CNCF Serverless Landscape開發(fā)人員可以編寫代碼,然后將其快速部署到各種無服務器環(huán)境中。然后,無服務器應用程序響應需求,并根據(jù)需要自動伸縮擴展。
你可能想知道什么編程語言和運行環(huán)境最適合無服務器應用程序開發(fā),以便與上圖中的技術(shù)集成。這個問題不只一個答案,但是讓我們退一步來討論在企業(yè)生產(chǎn)環(huán)境中開發(fā)業(yè)務應用程序最流行的應用程序運行環(huán)境:Java。
據(jù) Developer Economics 稱,截至 2020 年第三季度,仍有 800 多萬家企業(yè)開發(fā)人員在使用 Java 來實現(xiàn)其業(yè)務需求。然而,根據(jù) 2020 年的一項調(diào)查,Java(占比 6%)顯然不是有前瞻意識的開發(fā)人員的首選,他們使用當前云服務做開發(fā)。
來自 NewRelic 無服務器基準報告的數(shù)據(jù)(Daniel Oh, CC BY-SA 4.0)資源使用、響應時間和延遲在無服務器開發(fā)中至關(guān)重要。公有云提供商提供的無服務器產(chǎn)品通常是按需計量的,只有在無服務器應用程序啟動時,才會通過事件驅(qū)動的執(zhí)行模式收費。因此,當無服務器應用程序閑置或縮減為零時,企業(yè)無需支付任何費用。
帶有容器的 Java 狀態(tài)
在這種背景下,你可能會問:“既然現(xiàn)有業(yè)務應用程序很可能是在 Java 技術(shù)上開發(fā)的,那么開發(fā)人員為什么不嘗試使用 Java 棧進行無服務器應用程序開發(fā)呢?”
隱藏的真相是:很難在新的不可變更的基礎設施(例如 Kubernetes 這樣的容器平臺)中優(yōu)化 Java 應用程序。
Differences in memory resource usage該圖描述了 Java 進程與競爭的語言、框架(如 Node.js 和 Go)之間內(nèi)存資源使用的差異。Java HotSpot 占用資源最大,其中包括每個Java 虛擬機(Java Virtual Machine)(JVM)實例分配的堆內(nèi)存。中間顯示了 Node.js 每個進程要比 Java 小得多。最后,Go 是一種流行的云服務編程語言,因為它的內(nèi)存消耗最低。
如你所見,當你在這張圖從左到右走,你會看到更密的節(jié)點。這就是開發(fā)人員在云、容器和 Kubernetes 上編寫無服務器應用程序時回避 Java(包括 Spring Boot,一種頑固的微服務 Java 框架)的原因。
下一步是什么?
企業(yè)可以通過實現(xiàn)無服務器應用程序獲得明顯的好處,但是資源密度問題導致他們避免使用 Java 堆棧在 Kubernetes 上開發(fā)無服務器應用程序開發(fā)。但是選擇其他語言會給全球數(shù)百萬 Java 開發(fā)人員帶來學習負擔。因此,在本系列的下一篇文章中,我將指導你如何開始使用 Java 無服務器函數(shù),而不是使用其他語言。