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