揭示應(yīng)用網(wǎng)絡(luò)的未來:趨勢和影響
讓我們在現(xiàn)代分布式架構(gòu)的背景下,審視透明、同步和異步網(wǎng)絡(luò)的遷移和轉(zhuǎn)型。
翻譯自 Unveiling the Future of Application Networking: Trends and Impacts 。

應(yīng)用網(wǎng)絡(luò)功能的發(fā)展方向在哪里,這將如何影響我們未來設(shè)計(jì)和處理分布式應(yīng)用程序的方式?揭示的內(nèi)容可能會讓您感到驚訝。讓我們探索應(yīng)用網(wǎng)絡(luò)的變革,重點(diǎn)關(guān)注應(yīng)用云的興起所帶來的網(wǎng)絡(luò)關(guān)注點(diǎn)的轉(zhuǎn)移。通過解開透明、同步和異步網(wǎng)絡(luò)的復(fù)雜性,我們來研究這些方面在現(xiàn)代分布式架構(gòu)中的遷移和轉(zhuǎn)型。
透明網(wǎng)絡(luò)下沉到平臺層面
分布式應(yīng)用由多個組件通過網(wǎng)絡(luò)相互交互。這些交互可以在運(yùn)行時通過服務(wù)網(wǎng)格和其他類似的技術(shù)透明地對應(yīng)用進(jìn)行控制,或者可以通過顯式實(shí)現(xiàn)的模式(如點(diǎn)對點(diǎn)集成、事件驅(qū)動或基于編排的交互)在應(yīng)用內(nèi)部進(jìn)行控制。
在這里,我將透明網(wǎng)絡(luò)定義為可以在應(yīng)用程序相互交互的行為中添加的控制和監(jiān)控機(jī)制,而不需要開發(fā)人員和應(yīng)用實(shí)現(xiàn)者知道。比如,想象一下由 Kubernetes 執(zhí)行的服務(wù)發(fā)現(xiàn)或負(fù)載均衡,而應(yīng)用程序無需了解其具體實(shí)現(xiàn)方式。再想象一下由 Istio 的 Sidecar 執(zhí)行的流量轉(zhuǎn)移、重試和斷路等魯棒性功能。再想象一下通過 Cillium 的基于 eBPF 實(shí)現(xiàn),從 Linux 內(nèi)核獲得的 mTLS 、身份驗(yàn)證和授權(quán),以及網(wǎng)絡(luò)追蹤和可觀測性。
所有這些功能可以在運(yùn)行時添加到分布式應(yīng)用中,而無需更改應(yīng)用代碼,也無需開發(fā)人員在應(yīng)用程序內(nèi)部實(shí)現(xiàn)一行代碼。

透明網(wǎng)絡(luò)功能與運(yùn)行時平臺融為一體。
過去,這些問題通常由開發(fā)人員在應(yīng)用層通過特定于語言的庫(如 Java 生態(tài)系統(tǒng)中的 Apache Camel 或 Spring Cloud Netflix )來解決,但如今這些問題越來越多地被委托給多語言運(yùn)行時(如 Dapr ),或通過透明的 Sidecar(如 Envoy)委托給平臺層,甚至在 eBPF 技術(shù)和封閉源網(wǎng)絡(luò)云服務(wù)的情況下與計(jì)算平臺深度嵌入。
同步網(wǎng)絡(luò)逐漸遠(yuǎn)離應(yīng)用程序
應(yīng)用程序之間的同步交互是指不需要任何中間持久狀態(tài)存儲(如消息代理)來將請求轉(zhuǎn)移到應(yīng)用程序之間的媒介的交互。因此,我在這里描述的同步交互通常是由客戶端應(yīng)用程序發(fā)起的阻塞交互,并在同一調(diào)用中到達(dá)目標(biāo)服務(wù)。在這里考慮的應(yīng)用程序責(zé)任包括與各種外部 API 的連接器、解決方案內(nèi)服務(wù)之間的調(diào)用以及協(xié)議轉(zhuǎn)換。這還包括基于內(nèi)容的路由、過濾和請求的輕量級轉(zhuǎn)換,多個消息的聚合或?qū)⒋笮拖⒉鸱譃槎鄠€消息。最后一組可以使用持久狀態(tài)存儲完成,但在這里我考慮的是在運(yùn)行時即時進(jìn)行,而無需持久化。廣義上講,這些應(yīng)用程序網(wǎng)絡(luò)關(guān)注點(diǎn)包括《企業(yè)集成模式》一書中列出的消息路由和消息轉(zhuǎn)換模式。
盡管這些關(guān)注點(diǎn)傳統(tǒng)上是由應(yīng)用程序內(nèi)部實(shí)現(xiàn)的,并且在 Java 生態(tài)系統(tǒng)中很受歡迎,例如通過 Apache Camel 和 Spring Integration 等項(xiàng)目,但今天我們可以看到這些功能正在向?qū)iT構(gòu)建的即插即用運(yùn)行時移動。這些運(yùn)行時可以與許多多語言應(yīng)用程序一起使用。其中的示例包括 Dapr Sidecar、Apache Kafka Connect、Knative Event Sources、NATS 以及各種托管的基于云的連接器和流量路由服務(wù),例如用于路由流量的 AWS API Gateway 或用于路由事件的 AWS EventBridge 等。
在所有這些示例中,應(yīng)用程序?qū)⑾鬟f給單獨(dú)的運(yùn)行時,其中執(zhí)行消息路由和轉(zhuǎn)換邏輯,然后將結(jié)果傳遞回應(yīng)用程序或轉(zhuǎn)發(fā)給另一個應(yīng)用程序。應(yīng)用的路由、過濾和轉(zhuǎn)換邏輯會影響數(shù)據(jù)的形狀和流向。

同步連接模式轉(zhuǎn)移到即插即用運(yùn)行時。
與透明功能可以在應(yīng)用實(shí)現(xiàn)后由運(yùn)維團(tuán)隊(duì)?wèi)?yīng)用不同,同步網(wǎng)絡(luò)功能由開發(fā)人員使用,并且應(yīng)用程序必須在設(shè)計(jì)和實(shí)現(xiàn)時考慮這一點(diǎn)。
因此,我們可以看到同步網(wǎng)絡(luò)功能不會透明地下沉到平臺中,而是從庫轉(zhuǎn)變?yōu)閷iT構(gòu)建的可重用運(yùn)行時和云服務(wù),可以在需要時插入任何應(yīng)用程序中,而不會影響應(yīng)用程序的實(shí)現(xiàn)。通過使用六邊形架構(gòu)的原則設(shè)計(jì)應(yīng)用程序,并通過采用通用的開放標(biāo)準(zhǔn)來將應(yīng)用程序與外部依賴解耦,可以實(shí)現(xiàn)這一點(diǎn)。
目前,在此領(lǐng)域沒有普遍采用的標(biāo)準(zhǔn)或?qū)崿F(xiàn),但有一些常用的消息模式(如過濾器、基于內(nèi)容的路由器、監(jiān)聽器、聚合器和拆分器),這些模式通常通過特定于領(lǐng)域的語言或使用通用表達(dá)式語言規(guī)范實(shí)現(xiàn),并對以 JSON 或 ProtoBuf 格式進(jìn)行的數(shù)據(jù)以及在 HTTP 或 gRPC 協(xié)議上傳輸?shù)?CloudEvents 包裝進(jìn)行操作。
異步網(wǎng)絡(luò)朝著云的方向發(fā)展
異步網(wǎng)絡(luò)允許應(yīng)用程序?qū)顟B(tài)存儲到外部系統(tǒng)中供其自身使用,或在與另一個服務(wù)交換數(shù)據(jù)之前進(jìn)行臨時存儲。例如,開發(fā)人員可以使用外部狀態(tài)存儲(如 Redis )進(jìn)行鍵值訪問,或使用對象存儲(如 AWS S3 )存儲狀態(tài)并使服務(wù)無狀態(tài)化。應(yīng)用程序可以使用消息代理(如 Apache Kafka )發(fā)布另一個服務(wù)可能感興趣的事件。應(yīng)用程序可以啟動存儲在持久化工作流引擎(如 Conductor )中的業(yè)務(wù)流程,該工作流引擎需要協(xié)調(diào)與其他服務(wù)的交互。當(dāng)我們查看源服務(wù)和目標(biāo)服務(wù)之間的端到端交互時,狀態(tài)會在與其他服務(wù)交換之前在中間系統(tǒng)中持久化。這些異步網(wǎng)絡(luò)交互樣式通過一些眾所周知的方法(如發(fā)布/訂閱、鍵值訪問、編排、定時作業(yè)、分布式鎖等)以可預(yù)測和可靠的方式在參與者之間分布狀態(tài)。

異步網(wǎng)絡(luò)基礎(chǔ)設(shè)施正在轉(zhuǎn)變?yōu)镾aaS(軟件即服務(wù))。
每種異步網(wǎng)絡(luò)模式都提供了一種基于狀態(tài)的獨(dú)特交互方式。鍵值和對象存儲用于存儲通常從同一應(yīng)用程序訪問的狀態(tài)。消息代理用于發(fā)布方服務(wù)與一個或多個接收方服務(wù)之間的異步通信。工作流引擎用于協(xié)調(diào)多個應(yīng)用程序之間的復(fù)雜有狀態(tài)交互,或者按時間間隔觸發(fā)服務(wù)端點(diǎn)。
還有其他一些專門的有狀態(tài)應(yīng)用程序基礎(chǔ)設(shè)施示例:例如,將應(yīng)用程序配置從中央配置存儲中分發(fā)、分發(fā)密鑰、使用分布式鎖實(shí)現(xiàn)對資源的互斥訪問等。這些交互對應(yīng)用程序是顯式的,開發(fā)人員需要以適應(yīng)這些專門系統(tǒng)的方式開發(fā)應(yīng)用程序。在各自領(lǐng)域中,有許多正在被廣泛采用的 API 標(biāo)準(zhǔn)。例如,Redis、MongoDB 和 Amazon Web Services(AWS)的 S3 是鍵值和文檔訪問的常用 API 示例。Apache Kafka、AMQP、NATS 是異步交互協(xié)議的示例。Camunda、Conductor 和 Cadence 是有狀態(tài)編排引擎的示例。
雖然這些項(xiàng)目專注于單一類型的有狀態(tài)交互,并提供實(shí)現(xiàn)和 API ,但 Dapr 項(xiàng)目專注于為不同交互樣式提供統(tǒng)一的 API ,并將它們插入現(xiàn)有的后端實(shí)現(xiàn)中。例如, Dapr 狀態(tài)存儲 API 可以與 Redis、MongoDB、PostgreSQL 等一起使用。Dapr 發(fā)布訂閱 API 可以與 Kafka、AWS SQS、GCP Pub/Sub、Azure EventHub 等一起使用。其配置、密鑰和分布式鎖 API 也可以插入現(xiàn)有基礎(chǔ)設(shè)施系統(tǒng),并提供了一個統(tǒng)一的多語言高級 HTTP 和 gRPC 協(xié)議來抽象這些后端。
為了應(yīng)對管理狀態(tài)的固有復(fù)雜性,該行業(yè)正在目睹一個令人矚目的轉(zhuǎn)變,即異步網(wǎng)絡(luò)能力越來越多地作為 SaaS 解決方案提供。這種轉(zhuǎn)變簡化了采用過程,簡化了可擴(kuò)展性,并提升了這些服務(wù)的可管理性。
廣泛使用的消息代理 Apache Kafka 現(xiàn)在可作為 Confluent Cloud 和 AWS 托管的 Apache Kafka(MSK) 訪問。同樣,傳統(tǒng)上在內(nèi)部管理的鍵值存儲(如 Redis )和文檔存儲(如 MongoDB )已經(jīng)發(fā)展成為云服務(wù)。Redis Labs 的全面托管云服務(wù)和 MongoDB Atlas 的全球可用服務(wù)集成了資源和工作負(fù)載優(yōu)化。
同樣,有狀態(tài)的工作流系統(tǒng)也進(jìn)入了 SaaS 領(lǐng)域,簡化了開發(fā)人員在應(yīng)用程序之間進(jìn)行復(fù)雜有狀態(tài)交互的任務(wù)。AWS Step Functions 、 Temporal Cloud 、 Orkes 和 Diagrid Cloud 都是這一演進(jìn)的先驅(qū)。將有狀態(tài)網(wǎng)絡(luò)項(xiàng)目轉(zhuǎn)變?yōu)?SaaS 的這一趨勢是為了抽象狀態(tài)管理的復(fù)雜性。它使開發(fā)人員能夠?qū)W⒂跇I(yè)務(wù)邏輯,而不是復(fù)雜的異步交互。
應(yīng)用程序網(wǎng)絡(luò)的分歧路徑
分布式應(yīng)用程序由分布在多個進(jìn)程中的多個組件組成,它們通過網(wǎng)絡(luò)相互交互。分布式應(yīng)用程序的主要優(yōu)勢,如更快的發(fā)布周期和可擴(kuò)展性,取決于不同的網(wǎng)絡(luò)模式如何促進(jìn)依賴關(guān)系的隔離和狀態(tài)在參與者之間的分布。然而,網(wǎng)絡(luò)在分布式系統(tǒng)編程模型、可靠性、安全性和可觀測性方面帶來了新的挑戰(zhàn)。與容器的采用類似,容器將重要的應(yīng)用程序責(zé)任從開發(fā)人員轉(zhuǎn)移到運(yùn)維團(tuán)隊(duì),我們也可以觀察到不同類型的網(wǎng)絡(luò)關(guān)注點(diǎn)的轉(zhuǎn)變。
透明網(wǎng)絡(luò)功能雖然在功能上有限,但隨著其集成到平臺提供中變得越來越普遍。有了適當(dāng)?shù)钠脚_功能,開發(fā)人員不再需要關(guān)注網(wǎng)絡(luò)安全、可觀測性和流量管理。
無狀態(tài)交互將網(wǎng)絡(luò)與數(shù)據(jù)格式的知識和消息轉(zhuǎn)換邏輯相結(jié)合。這樣的交互通過標(biāo)準(zhǔn)連接器和作為專門構(gòu)建的分布式系統(tǒng)中間件實(shí)現(xiàn)的企業(yè)集成模式越來越多地變得可重用。開發(fā)人員不必在每種語言和應(yīng)用程序堆棧中不斷重新發(fā)明輪子,而是可以在運(yùn)行時將這些功能插入到他們的應(yīng)用程序中。在足夠長的時間內(nèi),這些網(wǎng)絡(luò)模式將變成可重用的庫、專門構(gòu)建的框架和Sidecar ,并最終轉(zhuǎn)變?yōu)榛谠频?API 。
異步交互具有更高的復(fù)雜性,因?yàn)樗鼈冃枰谀缓筮M(jìn)行狀態(tài)管理。這些網(wǎng)絡(luò)交互通常作為專門的獨(dú)立軟件或托管服務(wù)提供,最好由廣泛采用的 API 作為前端。與下沉到計(jì)算層并主要由運(yùn)維團(tuán)隊(duì)使用的透明 API 不同,異步網(wǎng)絡(luò)交互出現(xiàn)在為應(yīng)用程序開發(fā)人員創(chuàng)建的云提供中。

應(yīng)用程序網(wǎng)絡(luò)責(zé)任的演變
這種網(wǎng)絡(luò)責(zé)任的演進(jìn)預(yù)計(jì)將進(jìn)一步將透明運(yùn)行時和網(wǎng)絡(luò)功能融入到計(jì)算平臺中。與此同時,顯式功能將繼續(xù)整合,形成通用的 API ,并成為無處不在的無服務(wù)器能力。在不同的網(wǎng)絡(luò)任務(wù)中適當(dāng)?shù)匚胸?zé)任,并選擇適當(dāng)?shù)臉?biāo)準(zhǔn)化 API ,變得越來越重要。因此,這一巨大趨勢將使開發(fā)人員能夠?qū)W⒂趯?shí)現(xiàn)業(yè)務(wù)邏輯,通過透明方式或通過廣泛認(rèn)可和可移植的 API 集成其他能力
本文使用 文章同步助手 同步