系統架構系列 - 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
2會員
18內容數
test
留言0
查看全部
發表第一個留言支持創作者!
林柏宇的沙龍 的其他內容
在這篇文章中,我們深入探討系統架構的不同層面,尤其關注於軟體層面。文章介紹了幾種常見的架構模式,包括一體化架構、微服務架構、事件驅動架構、服務導向架構及無服務架構,並討論了其優缺點。此外,我們還探討了技術選型與性能優化的重要性,並提供實用的建議,幫助讀者在未來的軟體開發中做出更明智的選擇。
本文彙整了一些關於 SQL 效能優化的技巧,提供讀者更快的資料處理方案。包括如何清空資料表、獲取最新資料、總和資料時的可能問題以及評估 SQL 語句效能的方法。通過合理的指令使用,能夠大幅提升查詢效率並降低錯誤發生的機率。適合資料庫管理者和程式開發者作為參考。
本文介紹資料庫鎖(DB lock)的基本概念、鎖的類型及其優缺點。通過對資料庫鎖的深入探討,我們可以理解如何在多用戶環境下保護資料的一致性與完整性,並瞭解排他鎖、共享鎖、意向鎖等不同類型鎖的作用。此外,文章還分析了鎖競爭、鎖等待和死鎖等可能的問題,幫助讀者更全面地掌握資料庫鎖的運作機制。
本文介紹資料庫正規化的概念與重要性,及其三個主要階段:第一正規化(1NF)、第二正規化(2NF)和第三正規化(3NF)。透過消除重複資料及確保欄位間的關聯性,正規化能夠顯著提升資料庫的管理便捷性與效能。使用不同情境例子幫助讀者瞭解在不同情境下正規化的必要性及其應用。適合所有希望優化資料庫設計的讀者。
本文探討資料庫中的索引及其關鍵概念,涵蓋何謂索引、其類型與設立原因、索引失效情況及 B-tree 與 B+ tree 的差異,並簡要區分主鍵與外鍵的功能。瞭解索引的運作有助於提升資料查詢效率,並正確選擇適當的索引策略,以確保資料庫的高效運行。
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
在這篇文章中,我們深入探討系統架構的不同層面,尤其關注於軟體層面。文章介紹了幾種常見的架構模式,包括一體化架構、微服務架構、事件驅動架構、服務導向架構及無服務架構,並討論了其優缺點。此外,我們還探討了技術選型與性能優化的重要性,並提供實用的建議,幫助讀者在未來的軟體開發中做出更明智的選擇。
本文彙整了一些關於 SQL 效能優化的技巧,提供讀者更快的資料處理方案。包括如何清空資料表、獲取最新資料、總和資料時的可能問題以及評估 SQL 語句效能的方法。通過合理的指令使用,能夠大幅提升查詢效率並降低錯誤發生的機率。適合資料庫管理者和程式開發者作為參考。
本文介紹資料庫鎖(DB lock)的基本概念、鎖的類型及其優缺點。通過對資料庫鎖的深入探討,我們可以理解如何在多用戶環境下保護資料的一致性與完整性,並瞭解排他鎖、共享鎖、意向鎖等不同類型鎖的作用。此外,文章還分析了鎖競爭、鎖等待和死鎖等可能的問題,幫助讀者更全面地掌握資料庫鎖的運作機制。
本文介紹資料庫正規化的概念與重要性,及其三個主要階段:第一正規化(1NF)、第二正規化(2NF)和第三正規化(3NF)。透過消除重複資料及確保欄位間的關聯性,正規化能夠顯著提升資料庫的管理便捷性與效能。使用不同情境例子幫助讀者瞭解在不同情境下正規化的必要性及其應用。適合所有希望優化資料庫設計的讀者。
本文探討資料庫中的索引及其關鍵概念,涵蓋何謂索引、其類型與設立原因、索引失效情況及 B-tree 與 B+ tree 的差異,並簡要區分主鍵與外鍵的功能。瞭解索引的運作有助於提升資料查詢效率,並正確選擇適當的索引策略,以確保資料庫的高效運行。
本文介紹關聯式資料庫與非關聯式資料庫的基本概念,闡述兩者的差異及各自的應用場景。文章進一步分析了 MySQL 的兩種主要儲存引擎:MyISAM與InnoDB,並探討了它們的優缺點及使用情境,幫助讀者瞭解選擇適合的資料庫引擎所需考量的因素。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
Thumbnail
這是為了搭建自己想要的工作流而開始的研究工作。
Thumbnail
gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。 使用 到https://github.com/protocolbuffers/protobuf/releases下
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
Thumbnail
這是為了搭建自己想要的工作流而開始的研究工作。
Thumbnail
gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。 使用 到https://github.com/protocolbuffers/protobuf/releases下