解道jdon 2021-08-15 12:16:14 阅读数:413
在設計有效的 Web 應用程序時,讓您的軟件架構正確很重要。構建可維護的 Web 應用程序的一個好方法是構建靈活、可擴展和適應性强的架構。六邊形架構是軟件開發中流行的架構模式。這種架構風格通過將邏輯放入應用程序的不同層來促進關注點分離。今天,我們將深入研究六邊形架構模式,並討論原理、優缺點、用例等。
六邊形架構或端口和適配器架構源於 Alistair Cockburn 的工作。它是一種用於設計軟件應用程序的架構模式。使用六邊形架構,我們將輸入和輸出置於設計的邊緣。這使我們能够將應用程序的中心邏輯與外部世界隔離。由於我們的輸入和輸出比特於邊緣,我們可以在不影響核心代碼的情况下切換它們的處理程序。
六邊形架構旨在提高我們 Web 應用程序的可維護性,以便我們的代碼總體上需要更少的工作。六邊形架構由六邊形錶示。六邊形的每一面都代錶我們的系統與其他系統通信的不同方式。我們可以使用 HTTP 請求、REST API、SQL、其他六邊形架構等進行通信。六邊形的每一層都獨立於其他層,因此我們可以在不影響整個系統的情况下進行單獨的更改。
讓我們來看看六邊形架構可能是什麼樣子:
應用層錶示為六邊形。在六邊形中,我們有我們的領域實體和使用它們的用例。如我們所見,沒有傳出依賴項。我們所有的依賴都指向中心。六邊形的內部,或域,只取决於它自己。這確保了業務邏輯與技術層分離。它還確保我們可以重用域邏輯。如果我們改變我們的堆棧,它不會對域代碼產生影響。核心擁有主要的業務邏輯和業務規則。
在六邊形之外,我們看到與我們的應用程序交互的不同適配器。不同的適配器將與應用程序的不同方面進行交互。例如,我們可以有一個與 Web 瀏覽器交互的網絡適配器,一些與外部系統交互的適配器,以及一個與數據庫交互的適配器。左側的適配器驅動我們的應用程序,因為它們調用我們的應用程序核心。右側的適配器由我們的應用程序驅動,因為它們由我們的應用程序核心調用。
適配器可以是應用程序的外部 API,也可以是其他系統的客戶端。適配器使用端口來啟動與應用程序的交互。REST 控制器將是適配器的一個示例。應用程序核心提供端口,以便它可以與適配器進行通信。端口允許我們將適配器插入核心域。我們可以將端口視為不可知的入口點。
六邊形架構不應該依賴於任何技術框架。這包括外部注釋,例如 Java Persistence API (JPA) 和 Jackson。
優於傳統分層架構
六邊形架構與傳統的分層架構背道而馳。六邊形架構的主要區別之一是用戶界面可以換出。使用六邊形架構而不是分層架構有很多好處。讓我們看看一些優點、缺點和用例:
優點
缺點
用例
六邊形架構的一些示例用例包括:
六邊形架構原理
現在,讓我們來看看六邊形架構背後的一些基本原則。
單一職責原則的定義是“一個組件應該只有一個改變的理由”。當與架構相關時,這意味著如果一個組件只有一個更改的原因,如果我們出於任何其他原因更改軟件,我們就不必擔心這個組件。
依賴倒置原則 (DIP) 允許我們反轉代碼庫中任何依賴項的方向。問題在於,只有當我們控制依賴關系的雙方時,我們才能反轉依賴關系。所以,如果我們對第三方庫有依賴,就不能倒置,因為我們無法控制庫的代碼。
讓我們來看看實際中的依賴倒置原則。假設我們想要反轉我們的域代碼和我們的持久性代碼之間的依賴關系,以便我們的持久性代碼依賴於域代碼。我們將使用以下結構:
在上面的結構中,我們在域層有一個服務,它與存儲庫和持久層中的實體一起工作。我們可以為域層的倉庫創建一個接口,讓持久層的倉庫實現它。這允許我們將域邏輯從其對持久性代碼的依賴中解放出來。這是它的樣子:
使用端口和適配器隔離邊界
端口和適配器允許我們以完全隔離的模式運行我們的應用程序。六邊形架構使用端口和適配器來說明內部和外部之間的通信。端口是我們應用程序的邊界。有兩種端口:主端口和輔助端口。
主端口或入站端口是外部世界與應用程序核心之間的初始通信點。主端口是請求到達應用程序的地方。應用程序核心使用輔助端口或出站端口將數據上遊到外部服務。
適配器作為我們端口的實現。有兩種適配器:主要和次要。主要適配器是主要端口的實現。它們獨立於應用程序的核心。輔助適配器是輔助端口的實現。它們也獨立於應用程序核心。
六邊形架構示例
在文章的前面,我們列出了一些六邊形架構用例。現在,我們將在一個簡短的教程中開始使用其中一個用例。我們將遵循允許我們從一個帳戶向另一個帳戶匯款的應用程序的用例。讓我們看一下我們將編寫的用於創建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 } } |
恭喜您邁出了使用六邊形架構的第一步!六邊形架構軟件設計模式創建了一個抽象層,將應用程序的核心與外部工具和技術隔離開來。它是軟件開發中流行的架構風格。
版权声明:本文为[解道jdon]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815121613019d.html