在構建云原生應用程序時,采用了一些不同的軟件架構方法。云原生應用程序通常采用微服務架構,以最大程度地利用云計算模型的優勢。這些應用程序需要能夠在動態編排和容器化環境中運行。
云原生計算是一種在現代、動態環境(如公有云、私有云和混合云)中構建和運行可擴展應用程序的軟件開發方法。
云環境中,軟件架構的主要目標是關注點的分離,特別是通過將軟件組件模塊化到容器中。為了實現這一目標,有幾種模式可供選擇。本文介紹一些常用模式。
1 邊車/副車模式
邊車/副車模式(Sidecar/Adaptor Pattern)用于將主要應用程序的一些外圍功能或附加功能抽象為獨立的微服務。這種模式可以實現服務之間的獨立性,打破緊密耦合的組件。
邊車/副車模式適用于應用程序使用相同的語言和庫,并且需要一個共享生命周期但可以獨立部署的服務。然而,如果為每個實例部署邊車服務的資源成本超過隔離優勢,那么在應用程序中實施邊車/副車模式可能不是一個明智的決策。例如,將日志記錄、配置等功能抽象到單獨的微服務中,如下面的示例所示,每個主要服務都有一個關聯的輔助服務,它們之間形成一對一的關系。在應用邊車/副車模式時,需要綜合考慮資源成本和隔離優勢。
邊車/副車模式
2 大使模式
大使模式(Ambassador Pattern)經常用于擴展現有服務的網絡功能,特別是對于那些過于古老或復雜且無法修改的服務。
大使服務可以被視為與客戶端共存的一個進程外代理。
通過此模式添加額外的代理會增加延遲。與邊車不同,這種模式可以用于多個服務。這種模式對于增強遺留服務的連接功能非常有效。如果低延遲是關鍵因素,使用大使模式可能會增加代理開銷成本,因此不是一個好的選擇。
大使模式
3 散點/聚集模式
散點/聚集模式(Scatter/Gather Pattern)是一種用于并行處理大規模數據集的設計模式。這種模式的要點是有一個聚合器,匯總來自不同服務的響應并提供報價。這種模式對于控制消息流到所有微服務非常有用。
散點/聚集模式
散點/聚集模式適用于需要對大量數據進行并行處理的情況,如分布式計算、數據分析、并行搜索等。它可以提高系統的處理速度和吞吐量,利用多個處理單元同時處理數據,從而加快處理過程。
4 前端后端模式
前端后端模式(Backends For Frontends Pattern)的主要要點是在前端和實際后端之間添加另一層后端,這被稱為前端后端。這是工業界廣泛應用的最受歡迎的模式之一。通過添加這種額外的層,可以在不同的前端和后端服務器之間進行編排,驗證過濾來自前端的響應,映射和轉換來自后端的數據模型。
BFF模式
5 反腐敗層模式
反腐敗層模式(Anti-Corruption Layer Pattern)用于解決在不同子系統或微服務之間通信時的語義不匹配問題。這種模式最初由埃里克·埃文斯在領域驅動設計中描述。
當存在多個子系統或微服務它們各自使用不同的語義和數據結構時,可能會導致通信困難和混亂。反腐敗層模式的目標是在這些不兼容的系統之間建立一個翻譯或轉換層,以確保它們之間能夠正確地交互和通信。這個層充當了一個中間件,負責將一個系統的請求轉換為另一個系統可以理解的格式,并將響應從一個系統的格式轉換為另一個系統可以接受的格式。
反腐敗層模式的缺點和注意事項:
增加了額外的中間層,可能會引入性能延遲。
需要額外的開發和維護工作來處理轉換邏輯。
需要確保反腐敗層的正確性和穩定性,以避免引入更多問題。
反腐敗層模式
6 命令與查詢職責分離模式
命令與查詢職責分離模式(Command and Query Responsibility Segregation,CQRS)旨在將讀操作(查詢)和寫操作(命令)分離開來,以優化系統的性能、可伸縮性和靈活性。
在傳統的應用程序中,讀操作和寫操作通常共享相同的數據模型和數據庫,這會產生一些問題,例如當需要進行復雜查詢時,可能會對寫操作的性能產生影響,或者在需要高并發寫操作時可能會影響讀操作的性能。
解決方案是命令查詢職責分離(CQRS),將讀取和寫入分為不同的組件:
命令必須基于任務(例如“預訂酒店房間”而不是“將預訂狀態設置為已預訂”)。
命令通過異步通信實現。
查詢不會改變數據庫。查詢響應使用不包含業務邏輯的數據傳輸對象(DTO)。
這種模式的缺點是需要保持讀取和寫入組件的同步。
命令查詢職責分離模式
7 事件溯源模式
事件溯源模式(Event Sourcing Pattern)是過去十年中流行的一種技術,用于處理CRUD應用程序缺乏一致性的情況。與傳統CRUD應用程序僅保存當前狀態不同,事件溯源的主要是以追加方式保存數據,以存儲對數據執行的完整系列操作。它提供了事務數據的一致性,保持了完整的編輯歷史記錄,提供完全的審計控制。
優點:
通過實現強數據一致性來提高性能。
使用事件存儲簡化數據編輯的實現和管理。
事件對領域專家可讀,不僅對開發人員可理解。
防止對同一數據的并發更新,因為其事件的時間順序。
事件存儲作為數據操作的單一數據源。
缺點:
對于小型領域應用來說可能過于工程化。
不適用于實時數據驅動的應用程序。
8 服務網格模 式
服務網格模式(Service Mesh Pattern)旨在提供對微服務之間通信、安全、監控和可觀察性的細粒度控制。
此模式要點是將與應用程序無關的橫切關注點(如通信、監控、安全性、身份驗證/授權等)與核心業務邏輯隔離開來。這種專用基礎設施層為低延遲、可配置性增加了價值。
除了身份驗證/授權、服務發現,服務網格模式還提供其他重要功能,如:
斷路器
速率限制
條件速率限制
流量轉移
9 笨拙組件與智能組件(面向前端)模式
此模式是在關注點分離(SoC)原則基礎上的一種進階模式。在這種模式中,將前端組件分為兩種類型:笨拙組件(Dumb Components)和智能組件(Smart Components)。笨拙組件主要負責呈現和展示數據,而智能組件則負責處理數據流和業務邏輯,將數據注入到笨拙組件中。主要通過在笨拙組件中基于@Input和@Output(EventEmitter)的雙向數據綁定實現。通過這些注解,笨拙組件從智能組件獲取相關數據,或將數據發送到智能組件。智能組件通常注入服務或外觀(Facade)并處理數據流。
10 單向架構(面向前端)模式
單向架構(面向前端)模式是一種結合響應式編程的主要模式。在當今的前端框架中,數據流是單向的,由數據流向驅動。數據僅以一種方向流向視圖,而視圖的反饋會觸發不同的操作。這種設計使得對數據的控制更加精確。在處理數據流時,使用不同的庫如RxJs、NgRx、Flux,可以提供多種功能和工具。