文 / Kenyon,10多年技術開發和管理經驗,從程序員到技術總監,目前專注於技術團隊管理、架構設計和AI落地實踐,歡迎關注我一起學習交流。

由於公眾號推流的原因,請在關注頁右上角加星標⭐️,這樣才能及時收到新文章的推送。

在前幾篇文章中,我們探討了關於團隊和個人的價值層次還有個人該如何給團隊賦能的內容。接下來我想跟大家去探討系統架構方面的內容,今天,讓我們先深入探討架構設計中更底層的邏輯——架構設計原則,這些被稱為"黃金法則"的指導思想,是構建高質量系統的基礎。

作為長期從事架構設計實踐的"老司機",我見證了太多團隊因為缺少對核心設計原則的理解和應用,導致系統隨着業務發展變得臃腫、難以維護,甚至不得不進行大規模重構。架構設計原則就像建築設計中的"力學定律",它們不是束縛創造力的枷鎖,而是讓創意能夠落地並持久的保障。

核心觀點:架構設計原則是系統設計的"指南針",它們幫助我們在複雜的技術選擇中做出正確的決策,構建出高內聚、低耦合、可擴展、可維護的系統。

22560f0fde8346a19997940b0c2bf92c~tplv-tb4s082cfz-aigc_resize_2400_2400.webp

一、基本設計原則:SOLID原則的"五根支柱"

打個比喻,如果把架構設計比作一座大廈,那麼基本設計原則就是大廈的"地基"。SOLID原則作為面向對象設計的核心原則,為我們提供了構建高質量軟件的基礎框架。

1.1 單一職責原則(Single Responsibility Principle,SRP)

  • 定義:一個模塊只有一個主要的職責
  • 應用:每個組件只負責一個明確的功能,不同類型的功能應該由不同的組件負責
  • 好處:降低模塊之間的耦合度,提高內聚,便於系統和模塊後續的維護

實戰要點

  • 避免出現"萬能類"或"萬能模塊"的情況,每個類或模塊都應該有一個明確的職責
  • 當你需要去修改一個類或模塊的時候,要先問問自己:"這次修改的內容是否屬於它的核心職責?",如果是,那麼就可以修改;如果不是,那就需要考慮是否應該將這個功能拆分成一個新的類或模塊。

1.2 開閉原則(Open-Closed Principle,OCP)

  • 定義:類、模塊等軟件實體應該對擴展開放,對修改關閉
  • 應用:通過抽象和多態實現功能的擴展,避免直接修改已有的代碼
  • 好處:提高系統的穩定性的同時,還能支持靈活地擴展系統地功能

實戰要點

  • 使用接口或抽象類定義穩定的契約
  • 通過繼承或組合實現功能擴展,而非直接修改現有代碼

1.3 里氏替換原則(Liskov Substitution Principle,LSP)

  • 定義:子類應能替換父類而不破壞程序正確性
  • 應用:確保繼承關係的正確性
  • 好處:確保繼承體系的契約一致性,避免繼承濫用

實戰要點

  • 子類必須完全實現父類的抽象方法
  • 子類不能違背父類的約定(如前置條件、後置條件)

1.4 接口隔離原則(Interface Segregation Principle,ISP)

  • 定義:客户端應依賴於最小的接口集合,不應該依賴它不需要的接口
  • 應用:設計小而專一的接口,而不是大而多功能的接口
  • 好處:減少不必要的依賴,降低接口複雜性,提高接口的靈活性和獨立性

實戰要點

  • 避免設計"胖接口",將大接口拆分為多個小接口
  • 接口應該只包含客户端需要的方法

1.5 依賴倒置原則(Dependency Inversion Principle,DIP)

  • 定義:高層模塊不應該依賴低層模塊,都應該依賴抽象
  • 應用:通過依賴注入實現解耦
  • 好處:提高系統的靈活性和可測試性

實戰要點

  • 依賴抽象類或接口,而非具體實現類
  • 使用依賴注入容器管理對象依賴關係

9f3a2657cc5e4f3e8897dc762323e974~tplv-tb4s082cfz-aigc_resize_2400_2400.webp

二、架構設計原則:構建系統的"上層建築"

如果説基本設計原則關注的是"如何設計好一個類或模塊",那麼架構設計原則關注的是"如何設計好整個系統"。

2.1 分離關注點(Separation of Concerns)

  • 定義:將複雜問題分解為獨立的關注點
  • 應用:按功能、層次、職責分離系統
  • 實現方式
    • 分層架構:按技術層次分離系統,如我們常見的Model、View、Controller的MVC架構
    • 模塊化:按功能領域分離系統,如按業務功能或技術組件來組織代碼,比如公共代碼模塊、數據訪問模塊、業務邏輯模塊(還可以繼續分用户模塊、訂單模塊、支付模塊等)等
    • 服務化:按業務能力分離系統,如微服務架構,將系統拆分成多個獨立的服務,每個服務負責一個明確的業務功能

實戰要點

  • 每個關注點應該有明確的邊界
  • 關注點之間的通信應該通過明確定義的接口或者是事件來進行

2.2 高內聚低耦合(High Cohesion, Low Coupling)

  • 內聚性:模塊內部元素的相關程度
  • 耦合性:模塊間的依賴程度
  • 目標:提高內聚性,降低耦合性
  • 實現方式
    • 明確的接口定義:模塊之間通過接口或者事件進行通信,而不是直接調用彼此的方法
    • 最小化依賴關係:每個模塊只依賴於必要的其他模塊,避免依賴於過多的模塊
    • 使用抽象層隔離變化:通過抽象層(如接口、抽象類)隔離模塊之間的變化,使系統更靈活

實戰要點

  • 模塊內部的功能應該高度相關
  • 模塊之間的依賴應該越少越好,依賴關係應該越弱越好

2.3 抽象與封裝(Abstraction and Encapsulation)

  • 抽象:隱藏複雜性,突出本質特徵
  • 封裝:隱藏實現細節,提供穩定接口
  • 應用
    • API設計:提供簡潔的接口
    • 數據封裝:隱藏數據結構細節
    • 服務封裝:隱藏業務邏輯實現

實戰要點

  • 抽象類和方法的時候應該抓住問題的本質,忽略次要細節
  • 封裝應該提供足夠的抽象,同時隱藏內部實現

2.4 可擴展性設計(Scalability Design)

  • 水平擴展:可以不斷地增加更多的服務器實例來分擔負載
  • 垂直擴展:增強單個服務器的能力,如升級硬件、增加內存等
  • 設計考慮
    • 無狀態設計:每個請求都是獨立的,不依賴於之前的請求狀態
    • 數據分片策略:將數據分佈到多個服務器實例,避免單點故障
    • 負載均衡機制:將請求分發到多個服務器實例,避免過載
    • 緩存策略:緩存熱數據,減少數據庫訪問次數

實戰要點

  • 優先考慮水平擴展,因為它比垂直擴展有更好的伸縮性,而且基本不用停機維護
  • 設計系統時要考慮未來的增長需求,提前預留好擴展空間,避免因為系統負載增加而導致的性能問題

2.5 容錯與恢復(Fault Tolerance and Recovery)

  • 故障預防:通過設計避免故障發生
  • 故障檢測:及時發現系統故障
  • 故障隔離:防止故障擴散
  • 故障恢復:快速恢復系統服務
  • 實現模式
    • 斷路器模式
    • 重試機制
    • 降級策略
    • 備份恢復

實戰要點

  • 在設計系統時,要考慮如何做好故障隔離和恢復機制,比如可以假設所有上游接口系統和依賴的模塊都可能失敗
  • 設計系統時要考慮各種故障場景,如數據庫故障、網絡故障、服務器故障等
  • 做好系統的監控和告警,及時發現故障,快速定位問題根源

三、架構設計原則的實戰應用:從理論到實踐

3.1 原則應用的優先級

在實際項目中,我們不可能同時完美地應用所有原則,需要根據項目的實際情況確定優先級:

  • 小型項目:可以更關注基本設計原則(SOLID),快速交付功能
  • 大型項目:需要更關注架構設計原則,確保系統的可擴展性和可維護性
  • 高併發系統:需要特別關注可擴展性和容錯設計
  • 長期維護的系統:需要平衡所有原則,確保系統的穩定性和可維護性

3.2 原則之間的平衡

架構設計原則之間有時會存在衝突,需要在實際應用中進行平衡:

  • 單一職責原則 vs 高內聚低耦合:單一職責可能導致模塊過多,增加系統複雜性
  • 開閉原則 vs 簡單性:過度設計可能導致系統過於複雜,影響開發效率
  • 可擴展性 vs 性能:某些擴展性設計可能會影響系統性能

實戰建議

  • 不要為了遵循原則而遵循原則,原則是手段,不是目的
  • 每個項目都有其獨特性,需要根據實際情況靈活應用原則
  • 在應用原則時,要考慮投入產出比

f01d082331164d538380b701a2cddf63~tplv-tb4s082cfz-aigc_resize_2400_2400.webp

四、常見誤區:避免原則應用的"陷阱"

在架構設計原則的應用過程中,我總結了幾個常見的誤區:

4.1 過度設計

  • 表現:為了未來可能的需求,過度應用各種原則,導致系統過於複雜
  • 解決方法:遵循"YAGNI"(You Ain't Gonna Need It)原則,只設計當前需要的功能

4.2 教條主義

  • 表現:嚴格遵守原則,不考慮項目的實際情況
  • 解決方法:將原則作為指導思想,而非硬性規定

4.3 忽視權衡

  • 表現:只關注某一個原則,忽視其他原則的影響
  • 解決方法:在應用原則時,要考慮原則之間的相互影響和平衡

4.4 缺乏實踐

  • 表現:只瞭解原則的理論,缺乏實際應用經驗
  • 解決方法:在實際項目中應用原則,通過實踐加深理解

五、總結與行動建議

架構設計原則是架構師的"工具箱",它們幫助我們在複雜的技術選擇中做出正確的決策。好的架構不是設計出來的,而是演進出來的,而架構設計原則就是指導這個演進過程的"指南針"。

給架構師的3個行動建議

  1. 理解原則的本質:不要只記住原則的名稱和定義,要理解它們背後的思想和目的
  2. 在實踐中應用:選擇一個正在進行的項目,嘗試應用這些原則,在實踐中學習和提高
  3. 持續反思和改進:定期回顧系統架構,思考如何更好地應用原則,不斷優化系統設計

記住架構設計的核心理念:"好的架構應該是簡單的、清晰的、可擴展的、可維護的"——這也是我們應用架構設計原則的最終目標。


互動話題:作為架構師,你在應用架構設計原則時,遇到過哪些挑戰?是如何克服的?歡迎在評論區分享你的經驗。

關於作者

Kenyon,資深軟件架構師,15年的軟件開發和技術管理經驗,從程序員做到企業技術高管。多年企業數字化轉型和軟件架構設計經驗,善於幫助企業構建高質量、可維護的軟件系統,目前專注技術管理、架構設計、AI技術應用和落地;全網統一名稱“六邊形架構”,歡迎關注交流。

原創不易,轉載請聯繫授權,如果覺得有幫助,請點贊、收藏、轉發三連支持!