系統架構系列 - 2: 微服務架構

更新於 發佈於 閱讀時間約 4 分鐘

又來到了一周的開始,真不想去上班QQ,總之,這次來介紹臺灣企業近年來熱衷的微服務架構吧!

簡介

上週提到過,微服務架構的設計初衷是為了解耦服務之間的關係,使每個服務能夠獨立更新和維護,從而提高擴展性,而服務之間則透過 API 交換資料。這種獨立的服務設計讓多個團隊能夠更方便地同時進行開發,避免程式碼衝突。因此,在臺灣隨著敏捷開發方法(Scrum)的普及,越來越多的團隊開始採用微服務架構。

依賴與耦合

介紹到這裡,相信有些人心中會產生疑問:什麼是耦合?它與依賴有關嗎?其實,這兩個概念相當相似。

簡單來說,依賴指的是程式碼之間的關聯性。例如,功能 B 需要依賴功能 A 才能實現,或是類別 C 繼承自類別 D 等等。當依賴關係越來越多,維護就變得愈加困難。有時,你可能只是想修正 A 功能的小錯誤,卻發現 B、C、D 等其他功能也受到影響,結果原本的小調整卻變成了大項目,讓你不得不先盤點哪些功能有依賴,再將參數隔離,工作量驟增。

耦合則可以理解為程式碼間依賴的程度。原則上,我們希望耦合越低越好,只維持最低限度的依賴[註1],這樣才能有助於後續的擴展與維護。

有關依賴及依賴注入的更詳細內容,可以參考這位前輩寫的文章菜雞與物件導向 (14): 依賴反轉原則 | 伊果的沒人看筆記本

回到微服務

在介紹完耦合與依賴後,就讓我們回到微服務架構吧!微服務架構的主要優點包括:

  • 模組化設計:每個微服務專注於特定業務功能,使系統更加模組化,方便開發與維護。
  • 獨立部署:各服務可以獨立部署和更新,不會互相影響,提高開發和部署的靈活性。
  • 技術多樣性:不同微服務可根據需求選擇最合適的技術,增加技術選擇的靈活性。
  • 擴展性:微服務架構容易針對特定服務進行擴展,從而提高整體系統的可擴展性和性能。
  • 容錯性:由於每個微服務獨立運行,單一服務的故障不會影響整體系統,提升容錯能力。
  • 易於維護和測試:每個微服務都是小而專注的功能單元,讓程式碼庫更簡潔,易於維護和測試。

不難發現,這些優點都基於「將服務獨立出來」的理念。雖然獨立的服務會使整體系統更加複雜,但對於各服務而言,卻提供了更高的靈活性與擴展性,特別適合快速迭代的現代環境。

如何解耦

雖然微服務架構的設計初衷是為了減少耦合,但在實踐中,如果設計或管理不當,仍可能導致高耦合。以下是兩個常見情況及其解決方案:

1. 共享資料庫

  • 問題:如果多個微服務共享同一個資料庫,會增加耦合度,降低獨立部署和擴展的能力。
  • 解決方案:每個微服務應擁有自己的資料庫,通過服務接口進行數據交換,而非直接訪問其他服務的資料庫。

2. API 的變更

  • 問題:當一個微服務的 API 發生變更時,依賴該 API 的其他服務也需同步更新。
  • 解決方案:採用向後兼容的 API 設計原則[註2],並使用版本控制管理 API 的變更,從而減少對其他服務的影響。

總結

總之,微服務架構仍然需要仔細的設計和管理,以避免高耦合問題。通過採取適當的設計模式和工具,我們可以有效減少微服務之間的耦合,實現系統的高可用性和可擴展性!


[註1] 需要注意的是,這並不是說完全不依賴,畢竟將程式碼複製貼上一份並不是好的做法,因為這樣其實不符合 Clean Code 的原則,實務上也會使後續維護變得困難,例如相似功能的預設值不同,導致需要逐一檢查確認。

[註2] 向後兼容的 API 設計原則的主要理念是希望不影響現有使用者,避免因 API 的變更而導致系統中斷或故障。主要做法包括「添加新參數」、「為參數設定預設值」、「在 URL 中加上版本號」等。

參考資料:

  1. https://igouist.github.io/post/2020/12/oo-14-dependency-inversion-principle/
  2. https://medium.com/手寫筆記/clean-code-index-51e209cc47db
  3. https://www.ithome.com.tw/voice/74889
留言
avatar-img
留言分享你的想法!
avatar-img
林柏宇的沙龍
2會員
50內容數
test
林柏宇的沙龍的其他內容
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/13
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
2025/04/13
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
看更多
你可能也想看
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
Thumbnail
本書介紹了戰略設計、管理領域複雜度、實際應用領域驅動設計等主題。透過對核心子領域、支持子領域、限界上下文等概念的探討,提供了領域驅動設計的相關知識。這篇文章中還涉及了微服務、事件驅動架構和資料網格等相關主題,提供了設計系統和應用領域驅動設計的指導。
Thumbnail
本書介紹了戰略設計、管理領域複雜度、實際應用領域驅動設計等主題。透過對核心子領域、支持子領域、限界上下文等概念的探討,提供了領域驅動設計的相關知識。這篇文章中還涉及了微服務、事件驅動架構和資料網格等相關主題,提供了設計系統和應用領域驅動設計的指導。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
替產業做設計 有人要我談程式設計,那我就稍微談一下。我從事的大都是產業的工作,所以我們也從如何替產業做設計來談起。基本上,每個產業都會有自己的作業流程,大同小異。但是基礎來做都是一樣的,都會有客戶、物料、產品、供應商、員工等資料。不同的是,由於企業型態的不同,他們每個人有不同的作業流程。這個作業流
Thumbnail
替產業做設計 有人要我談程式設計,那我就稍微談一下。我從事的大都是產業的工作,所以我們也從如何替產業做設計來談起。基本上,每個產業都會有自己的作業流程,大同小異。但是基礎來做都是一樣的,都會有客戶、物料、產品、供應商、員工等資料。不同的是,由於企業型態的不同,他們每個人有不同的作業流程。這個作業流
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News