編輯

共用方式為


微服務架構樣式

Azure

微服務架構是由小型自主服務的集合所組成。 每個服務都是獨立的,而且應該在限定的內容內實作單一商務功能。 限定內容是企業內的自然部門,並提供定義域模型存在的明確界限。

微服務架構樣式的邏輯圖表。

什麼是微服務?

  • 微服務屬於小型、獨立且鬆散結合的服務。 開發人員的單一小型小組可以撰寫和維護服務。

  • 每項服務的程式碼基底各自分開,由小型的開發小組負責管理。

  • 服務可以獨立部署。 小組可以直接更新現有服務,而不需要重建和重新部署整個應用程式。

  • 服務會負責保存自己的數據或外部狀態。 這與傳統模型不同,其中個別的數據層會處理數據持續性。

  • 服務會使用定義完善的 API 彼此通訊。 每個服務的內部實作詳細資料都會對其他服務隱藏。

  • 支援多語言程式設計。 例如,服務不需要共用相同的技術堆疊、連結庫或架構。

除了服務本身之外,其他一些元件會出現在一般微服務架構中:

管理/協調流程。 此元件負責將服務放在節點上、識別失敗、跨節點重新平衡服務等等。 此元件通常是現成的技術,例如 Kubernetes,而不是自定義建置的專案。

API 閘道。 API 閘道是客戶端的進入點。 用戶端會呼叫 API 閘道,而不是直接呼叫服務,這會將呼叫轉送至後端的適當服務。

使用 API 閘道的優點包括:

  • 它會將客戶端與服務分離。 服務可以進行版本設定或重構,而不需要更新所有用戶端。

  • 服務可以使用不易用 Web 的傳訊通訊協定,例如 AMQP。

  • API 閘道可以執行其他交叉功能,例如驗證、記錄、SSL 終止和負載平衡。

  • 現用原則,例如節流、快取、轉換或驗證。

福利

  • 靈活度。 因為微服務為獨自部署,所以可更輕鬆地管理錯誤 (bug) 修正和功能版本。 您可以更新服務而不重新部署整個應用程式,並在發生問題時回復更新。 在許多傳統應用程式中,如果在應用程式的某個部分找到錯誤,這可能會封鎖整個發行程序。 新功能可能會擱置,等待 Bug 修正整合、測試和發布。

  • 小型、專注的團隊。 微服務應小到讓單一功能小組可加以建置、測試及部署。 小型小組大小可提升更大的靈活度。 大型小組的生產力往往較低,因為通訊速度較慢,管理額外負荷會增加,且靈活度會降低。

  • 小型程式代碼基底。 在整合型應用程式中,程式代碼相依性會隨著時間而變得糾纏的趨勢。 新增功能需要在很多地方接觸程序代碼。 微服務架構不會共用程式碼或資料存放區,因而降低相依性,並可讓您更輕鬆地新增功能。

  • 混合技術。 小組可以視情況使用混合的技術堆疊,以挑選出最適合其服務使用的技術。

  • 錯誤隔離。 如果個別微服務變得無法使用,只要任何上游微服務都設計成正確處理錯誤,它就不會中斷整個應用程式。 例如,您可以實 作斷路器模式,也可以設計解決方案,讓微服務使用 異步傳訊模式彼此通訊。

  • 延展性。 服務可以獨立調整,讓您相應放大需要更多資源的子系統,而不需要相應放大整個應用程式。 使用 Kubernetes 之類的協調器,您可以將較高的服務密度封裝到單一主機,以更有效率地利用資源。

  • 資料隔離。 執行架構更新會更容易,因為只有單一微服務受到影響。 在整合型應用程式中,架構更新可能會變得非常具有挑戰性,因為應用程式的不同部分可能會觸碰相同的數據,而對架構有風險的任何變更。

挑戰

微服務的優點不會免費取得。 以下是開始微服務架構之前要考慮的一些挑戰。

  • 複雜度。 微服務應用程式的變動組件數量比同等單體式應用程式的還多。 每個服務會更為簡單,但是系統整個會變得更複雜。

  • 開發和測試。 撰寫依賴其他相依服務的小型服務,需要不同於撰寫傳統整合型或分層式應用程式的方法。 現有工具的設計不一定適合處理服務相依性。 跨服務界限進行重構會很困難。 測試服務相依性也會很困難,尤其是當應用程式的演變速度很快時。

  • 缺乏治理。 微服務的非集中式建置方法有其優點,卻也可能導致問題發生。 您最終可能會有很多不同的語言和架構,而讓應用程式變得難以維護。 備有某些適用於全部專案的標準,而不要過度限制小組的彈性,這樣的做法可能會有幫助。 這特別適用於跨領域功能,例如記錄。

  • 網路壅塞和延遲。 使用許多小型且細微的服務可能會導致服務之間需要更多通訊。 此外,如果服務相依性鏈結變得太長(服務 A 呼叫 B,它會呼叫 C...),額外的延遲可能會變成問題。 您將必須謹慎地設計 API。 避免過度閒聊的 API、考慮串行化格式,並尋找使用異步通訊模式的位置,例如 佇列型負載撫平

  • 資料完整性。 每個微服務都會負責自己的數據持續性。 因此,跨多個服務的數據一致性可能是一項挑戰。 不同的服務會在不同的時間保存數據,使用不同的技術,以及可能不同的成功層級。 當有多個微服務參與保存新的或變更日期時,不太可能將完整的數據變更視為 ACID 交易。 相反地,這項技術更符合BASE(基本可用、軟狀態和最終一致)。 可能的話,請採用最終一致性。

  • 管理。 想要成功運用微服務,就必須有成熟的 DevOps 文化。 在服務之間建立關聯式記錄會非常困難。 一般而言,記錄必須將多個服務呼叫相互關聯到單一使用者作業。

  • 版本控制。 服務的更新不得打斷與其相依的服務。 多個服務有可能在同一時間一起更新,因此若未謹慎設計,便可能發生回溯相容性或往後相容性問題。

  • 技能集。 微服務是高度分散的系統。 請謹慎評估小組是否有技能和經驗能夠成功。

最佳作法

  • 建立商務網域周圍的模型服務。

  • 分散所有專案。 個別小組負責設計和建置服務。 避免共用程式代碼或數據架構。

  • 數據記憶體應該是擁有數據之服務的私用記憶體。 針對每個服務和數據類型使用最佳的記憶體。

  • 服務會透過設計完善的 API 進行通訊。 避免洩漏實作詳細數據。 API 應該建立網域的模型,而不是服務的內部實作。

  • 避免在服務之間結合。 結合的原因包括共用資料庫架構和嚴格的通訊協定。

  • 將跨領域考慮,例如驗證和 SSL 終止卸除至閘道。

  • 讓網域知識遠離閘道。 網關應該處理和路由傳送用戶端要求,而不需要瞭解商務規則或網域邏輯。 否則,閘道會變成相依性,而且可能會導致服務之間的結合。

  • 服務應該具有鬆散結合和高功能凝聚力。 可能一起變更的函式應該封裝並部署在一起。 如果它們位於個別的服務中,這些服務最終會緊密結合,因為一個服務中的變更需要更新另一個服務。 兩個服務之間過度閒聊的通訊可能是緊密結合和低凝聚力的癥狀。

  • 隔離失敗。 使用復原策略來防止服務內的失敗串連。 請參閱 復原模式設計可靠的應用程式

下一步

如需在 Azure 上建置微服務架構的詳細指引,請參閱 在 Azure 上設計、建置和操作微服務。