成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

架構設計原則:SPI 與 API 該如何選擇?

開發 前端
我們將“倉儲接口”放置于“領域層”這個“包”中,實現放在一個獨立的“包”中,我們看DDD大師的實現都是這樣子,現在來思考一下為什么這么做。

背景

第一次聽說 SPI 是閱讀《軟件框架設計的藝術》,以后陸續在 JDBC 和 SpringBoot 中發現了以這種形式組織代碼的方式,本文給出為什么要區分 SPI 和 API 的一個思考過程。

從面向接口編程說起

圖片圖片

我們在“調用方”和“實現方”之間引入了“接口”,上圖沒有給出“接口”應該位于哪個“包”中,從純粹的可能性上考慮,我們有三種選擇:

  • “接口”位于“調用方”所在的“包”中。
  • “接口”位于“實現方”所在的“包”中。
  • “接口”位于獨立的“包”中。

下面讓我們依次分析這三種可能性,如果現實中確實有這種可能性,不如我們就為其起個名字以方便交流。

“接口”位于“調用方”所在的“包”中

我們先想象一個場景,以倉儲的接口為例:

圖片圖片

我們將“倉儲接口”放置于“領域層”這個“包”中,實現放在一個獨立的“包”中,我們看DDD大師的實現都是這樣子,現在來思考一下為什么這么做。

“領域層”的“領域服務”會依賴“倉儲接口”,“倉儲接口”也會依賴“聚合根”,這兩者都是除了“實現依賴”之外的依賴關系,如果將“接口”放到“倉儲實現”中就喪失了面向接口編程的意義(編譯也不會通過),如果放到“獨立層”中呢?會編譯不通過,出現雙向依賴了。

對于類似這種情況下接口,我們將其稱為“SPI”,全稱為:service provider interface,“SPI”的規則如下:

  1. 概念上更依賴調用方。
  2. 組織上位于調用方所在的包中。
  3. 實現位于獨立的包中。
  4. 常見的例子是:插件模式的插件。

“接口”位于“實現方”所在的“包”中

我們先想象一個場景,以Unity提供的IUnityContainer接口為例,除了維護這個框架的團隊之外,我們沒有發現誰實現了這個接口,雖然理論上是可以實現這個接口的(如果能實現的話,我們何不自己弄額Ioc容器呢?)。

對于類似這種情況下的接口,我們將其稱作為“API”,“API”的規則如下:

  1. 概念上更接近實現方。
  2. 組織上位于實現方所在的包中。
  3. 實現和接口在一個包中。

“接口”位于獨立的“包”中

這里就不說場景了,如果一個“接口”在一個上下文是“API”,在另一個上下文是“SPI”,那么你就可以這么組織。

需要注意的事項

不管是 SPI 或 API,接口都是可以組織到獨立的“包”中,這么做是否有意義,自己來做出決定了。

SPI 和 API 也不一定是接口,我這里都是指狹義的具體的接口。

場景圖

圖片圖片

每一次思考都伴隨著收獲,也離不開和朋友們的交流,天更藍了。

SPI 接口

  1. 定義:SPI 是一種服務提供者接口,它允許在運行時加載不同的服務實現。
  2. 使用場景:

模塊化設計:當系統需要高度模塊化,且希望將核心功能與具體實現分離時。

可插拔架構:需要支持多種服務實現,并且可以在不修改代碼的情況下替換或增加新的服務實現。

服務發現:在運行時根據配置或服務注冊表動態發現和加載服務。

微服務架構:在微服務架構中,SPI 可用于服務間的動態交互和集成。

  1. 優點:
  • 提供了一種機制來在運行時選擇和加載服務實現,增加了系統的靈活性和可擴展性。
  • 支持服務的熱插拔,無需重啟系統即可更換服務實現。

API 接口

  1. 定義:API 是一組預定義的函數、協議和工具,用于構建軟件應用,它定義了軟件組件之間交互的契約。
  2. 使用場景:

客戶端和服務器交互:當需要設計客戶端和服務器之間的通信協議時。

庫和框架:提供給開發者使用的庫或框架的公共接口。

第三方集成:需要與第三方系統或服務進行集成。

內部組件通信:在大型系統中,不同組件或模塊之間的交互。

  1. 優點:
  • 為開發者提供了清晰的接口文檔和規范,易于理解和使用。
  • 有助于保持系統的穩定性,因為 API 變更需要遵循版本控制和兼容性規則。
  • 促進了代碼的重用和模塊化。

如何選擇?

選擇使用 SPI 還是 API 的考慮因素:

  • 擴展性:如果需要在不修改代碼的情況下擴展功能,SPI 更合適。
  • 交互性:API 更適合定義系統內部或系統之間的穩定交互接口。
  • 動態性:SPI 允許在運行時動態發現和加載服務,而 API 通常在編譯時就已經確定。
  • 安全性和穩定性:API 由于其穩定性和可預測性,通常更受青睞。SPI 雖然靈活,但可能引入運行時錯誤。
  • 版本控制和兼容性:API 變更需要考慮版本控制和向后兼容性,而 SPI 可以通過服務版本協商來處理兼容性問題。

架構是“取舍”,而非“銀彈”。

責任編輯:武曉燕 來源: 架構精進之路
相關推薦

2023-07-09 15:24:05

架構設計思想AKF

2015-10-29 10:50:46

Android架構設計原則

2023-05-12 07:52:13

架構設計設計原則

2024-08-16 14:01:00

2023-01-05 08:12:11

分層應用代碼

2022-02-10 23:38:23

API架構設計

2020-06-16 14:12:02

架構ITAPI

2021-05-07 15:27:23

架構設計架構開發

2021-11-01 21:01:01

架構設計軟件

2016-03-29 09:59:11

JavaScriptAPI設計

2024-09-09 09:00:12

架構設計算法

2025-01-15 08:10:29

Java架構代碼

2017-06-19 14:21:01

JavaScriptAPI設計原則

2024-08-23 11:51:39

2015-06-02 04:17:44

架構設計審架構設計說明書

2021-11-11 10:48:35

架構運維技術

2023-07-05 00:36:38

系統架構設計

2025-01-23 11:18:22

JavaSPI接口

2015-06-02 04:34:05

架構設計

2024-08-26 15:35:40

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区在线免费观看 | 99久久免费精品 | 久久久精彩视频 | 在线看片福利 | 国产色婷婷精品综合在线手机播放 | 狠狠操你 | 亚洲第一黄色网 | 国产精品日韩在线观看 | 东方伊人免费在线观看 | 久久久久久久久精 | 91亚洲国产 | 亚洲国产成人久久久 | 久久99精品久久久久久国产越南 | 欧美一区二区三区小说 | 国产视频一区在线观看 | 精品人伦一区二区三区蜜桃网站 | 日本91av视频 | 久久久91精品国产一区二区三区 | 日韩黄色小视频 | 波多野结衣电影一区 | 国产精品免费大片 | 欧美一区二区三区大片 | 国产精品久久久久一区二区三区 | 操人视频在线观看 | 欧美a在线看 | 在线2区| 欧美精品一区二区三区四区五区 | 色999视频| 亚洲精品欧美一区二区三区 | 午夜免费在线 | 国产色99精品9i | 精品国产一区探花在线观看 | 国产日韩视频在线 | 亚洲一区二区精品视频 | 五月综合激情婷婷 | 欧美激情一区二区 | 国产免费色| 日本在线一区二区 | 日韩精品一区二区三区中文在线 | 欧美日韩亚 | 亚洲毛片在线观看 |