六邊形架構教程:構建可維護的Web應用程式 - DEV

banq發表於2021-08-15

在設計有效的 Web 應用程式時,讓您的軟體架構正確很重要。構建可維護的 Web 應用程式的一個好方法是構建靈活、可擴充套件和適應性強的架構。六邊形架構是軟體開發中流行的架構模式。這種架構風格透過將邏輯放入應用程式的不同層來促進關注點分離。今天,我們將深入研究六邊形架構模式,並討論原理、優缺點、用例等。
六邊形架構或埠和介面卡架構源於 Alistair Cockburn 的工作。它是一種用於設計軟體應用程式的架構模式。使用六邊形架構,我們將輸入和輸出置於設計的邊緣。這使我們能夠將應用程式的中心邏輯與外部世界隔離。由於我們的輸入和輸出位於邊緣,我們可以在不影響核心程式碼的情況下切換它們的處理程式。
六邊形架構旨在提高我們 Web 應用程式的可維護性,以便我們的程式碼總體上需要更少的工作。六邊形架構由六邊形表示。六邊形的每一面都代表我們的系統與其他系統通訊的不同方式。我們可以使用 HTTP 請求、REST API、SQL、其他六邊形架構等進行通訊。六邊形的每一層都獨立於其他層,因此我們可以在不影響整個系統的情況下進行單獨的更改。
讓我們來看看六邊形架構可能是什麼樣子:

六邊形架構教程:構建可維護的Web應用程式 - DEV
應用層表示為六邊形。在六邊形中,我們有我們的領域實體和使用它們的用例。如我們所見,沒有傳出依賴項。我們所有的依賴都指向中心。六邊形的內部,或域,只取決於它自己。這確保了業務邏輯與技術層分離。它還確保我們可以重用域邏輯。如果我們改變我們的堆疊,它不會對域程式碼產生影響。核心擁有主要的業務邏輯和業務規則。
在六邊形之外,我們看到與我們的應用程式互動的不同介面卡。不同的介面卡將與應用程式的不同方面進行互動。例如,我們可以有一個與 Web 瀏覽器互動的網路介面卡,一些與外部系統互動的介面卡,以及一個與資料庫互動的介面卡。左側的介面卡驅動我們的應用程式,因為它們呼叫我們的應用程式核心。右側的介面卡由我們的應用程式驅動,因為它們由我們的應用程式核心呼叫。
介面卡可以是應用程式的外部 API,也可以是其他系統的客戶端。介面卡使用埠來啟動與應用程式的互動。REST 控制器將是介面卡的一個示例。應用程式核心提供埠,以便它可以與介面卡進行通訊。埠允許我們將介面卡插入核心域。我們可以將埠視為不可知的入口點。
六邊形架構不應該依賴於任何技術框架。這包括外部註釋,例如 Java Persistence API (JPA) 和 Jackson。
 

優於傳統分層架構
六邊形架構與傳統的分層架構背道而馳。六邊形架構的主要區別之一是使用者介面可以換出。使用六邊形架構而不是分層架構有很多好處。讓我們看看一些優點、缺點和用例:
優點

  • 可維護性:我們的應用程式具有很高的可維護性,因為我們應用程式的一個領域的變化不會影響其他領域。
  • 靈活性:我們可以輕鬆地在不同的應用程式之間切換,並且可以在不更改原始碼的情況下新增新的介面卡。
  • 簡單測試:由於我們的程式碼與外界的實現細節是分離的,所以我們可以單獨測試。
  • 不可知:由於應用程式獨立於外部服務,我們可以在構建外部服務之前開發核心。

缺點
  • 解耦:由於中間類,我們的應用程式的效能可能會受到影響。
  • 除錯:有時很難理解和除錯介面卡。
  • 複雜:六邊形架構有時會令人困惑,因為我們應該考慮的外部結構並不總是很明顯。

用例
六邊形架構的一些示例用例包括:
  • 一種銀行應用程式,允許我們從一個帳戶向另一個帳戶匯款
  • 一個允許我們申請貸款、透過驗證並在我們的應用程式更新時接收更新的系統
  • 一個忠誠度應用程式,允許我們註冊客戶並升級或降級他們的會員資格

 

六邊形架構原理 
現在,讓我們來看看六邊形架構背後的一些基本原則。

  • 單一職責原則

單一職責原則的定義是“一個元件應該只有一個改變的理由”。當與架構相關時,這意味著如果一個元件只有一個更改的原因,如果我們出於任何其他原因更改軟體,我們就不必擔心這個元件。
  • 依賴倒置

依賴倒置原則 (DIP) 允許我們反轉程式碼庫中任何依賴項的方向。問題在於,只有當我們控制依賴關係的雙方時,我們才能反轉依賴關係。所以,如果我們對第三方庫有依賴,就不能倒置,因為我們無法控制庫的程式碼。
讓我們來看看實際中的依賴倒置原則。假設我們想要反轉我們的域程式碼和我們的永續性程式碼之間的依賴關係,以便我們的永續性程式碼依賴於域程式碼。我們將使用以下結構:

六邊形架構教程:構建可維護的Web應用程式 - DEV
在上面的結構中,我們在域層有一個服務,它與儲存庫和持久層中的實體一起工作。我們可以為域層的倉庫建立一個介面,讓持久層的倉庫實現它。這允許我們將域邏輯從其對永續性程式碼的依賴中解放出來。這是它的樣子:

六邊形架構教程:構建可維護的Web應用程式 - DEV
 

使用埠和介面卡隔離邊界
埠和介面卡允許我們以完全隔離的模式執行我們的應用程式。六邊形架構使用埠和介面卡來說明內部和外部之間的通訊。埠是我們應用程式的邊界。有兩種埠:主埠和輔助埠。
主埠或入站埠是外部世界與應用程式核心之間的初始通訊點。主埠是請求到達應用程式的地方。應用程式核心使用輔助埠或出站埠將資料上游到外部服務。
介面卡作為我們埠的實現。有兩種介面卡:主要和次要。主要介面卡是主要埠的實現。它們獨立於應用程式的核心。輔助介面卡是輔助埠的實現。它們也獨立於應用程式核心。
 

六邊形架構示例
在文章的前面,我們列出了一些六邊形架構用例。現在,我們將在一個簡短的教程中開始使用其中一個用例。我們將遵循允許我們從一個帳戶向另一個帳戶匯款的應用程式的用例。讓我們看一下我們將編寫的用於建立SendMoneyService類的程式碼:

package buckpal.account.application.service;

@RequiredArgsConstructor
@Transactional
public class SendMoneyService implements SendMoneyUseCase {

 private final LoadAccountPort loadAccountPort;
 private final AccountLock accountLock;
 private final UpdateAccountStatePort updateAccountStatePort;

 @Override
 public boolean sendMoney(SendMoneyCommand command) {
   // TODO: validate business rules
   // TODO: manipulate model state
   // TODO: return output
 }
}


恭喜您邁出了使用六邊形架構的第一步!六邊形架構軟體設計模式建立了一個抽象層,將應用程式的核心與外部工具和技術隔離開來。它是軟體開發中流行的架構風格。

相關文章