架構師觀點 - 轉移到微服務架構的經驗分享 (Part 3)
摘要提示
- 基礎建設優先: 微服務簡化單一服務複雜度,但把整體複雜度轉移到服務間互動,基礎建設是否完備決定成敗。
- 導入先決條件: 需具備快速配置、部署、監控與DevOps流程能力,否則遷移微服務會放大風險與成本。
- 逐步演進: 由可重構的單體起步,遇到瓶頸再逐步切分與擴充基礎建設,而非一開始就全盤微服務化。
- 四大支柱: API Gateway、Service Discovery、Communication/Event(Message Queue/Bus)、集中式Log/追蹤。
- API Gateway職責: 聚合請求、路由、快取、授權/認證、協議/版本轉換,將內部細節與變動隔離於外部。
- 服務發現關鍵: 註冊/反註冊、配置下發、負載導流、主動/被動健康檢查,可用DNS或Consul/etcd/ZooKeeper落實。
- 通訊模式選擇: Sync/Async、RPC、Pub/Sub、事件驅動,善用MQ降低耦合、緩衝流量、提升可靠度與可擴展性。
- 分散式交易: 以事件驅動與2PC思維處理跨服務一致性,比RDBMS單庫交易更複雜須由應用與基礎設施共同承擔。
- 工具與實務: 推薦NGINX微服務電子書;API Gateway可用Kong/APIM;MQ用RabbitMQ/Kafka;Redis/MSMQ視情境採用。
- 日誌與追蹤: 以事件/追蹤ID關聯多服務Log,支援快速問題定位與還原流程,是微服務運維不可或缺能力。
全文重點
本文聚焦微服務落地所需的關鍵基礎建設與部署思維。作者指出,微服務並未讓整體系統更簡單,只是把複雜度由「單體內部」轉移到「服務間互動」。因此,若沒有對應的基礎設施與DevOps能力,微服務的優勢無法體現,反會帶來維運與協作上的巨大壓力。對初創或規模尚小的團隊,建議從可重構的單體系統起步,保持架構整潔與可切分性,當流量或組織規模逼近瓶頸時,再逐步切割並同步擴充基礎建設。
作者提煉微服務的四大必備支柱:API Gateway、Service Discovery、Communication & Event-Driven(以Message Queue/Bus為核心)、以及Log/追蹤。API Gateway負責對外統一入口,提供API聚合、路由、快取、授權/認證與協議轉換,使客戶端不需直接耦合多個內部服務;在跨服務認證場景中,Gateway能與認證服務整合,統一處理驗證與失敗記錄,後端僅需信任Gateway的憑證。Service Discovery提供服務註冊、反註冊、節點清單、配置管理與健康檢查,並與負載平衡協同,將流量導向可用節點;除了被動心跳,也應加入主動探測(如Echo/Diagnostic API),提高可用性判定的精度。實作上可用DNS進行基本能力,或採用Consul、etcd、ZooKeeper等專門方案。
通訊面向涵蓋同步/非同步、RPC、回呼、Pub/Sub與事件機制。良好的Message Queue/Bus(如RabbitMQ、Kafka)能把發布端、訂閱端與轉送層解耦,集中管理訊息流向,並藉由持久化、回放與多消費者並行處理,降低尖峰衝擊、提升可靠性與吞吐。在分散式交易一致性上,需以事件驅動與2PC思維設計:先記錄狀態並發布事件,對方服務訂閱處理後回傳確認,原服務據以變更狀態;若超時或失敗,則取消並重試通知,透過冪等與最終一致性確保正確性。雖可用HTTP/REST實作,但處理重試、對偶通道與關聯性成本更高。
此外,微服務的Log不能只是流水帳,必須能以交易/追蹤ID聚合多服務的分散記錄,支援跨邊界的故障定位與流程還原,否則排錯成本極高。文末強調,微服務成功與否高度取決於基礎建設與團隊運維能力。應在負擔得起、理解充分、可維護的前提下選型,並重視組件間的整體搭配。作者推薦NGINX的微服務電子書作為入門綱要,並列舉Kong、Azure API Management、Consul/etcd/ZooKeeper、RabbitMQ/Kafka、以及在特定情境下可用的Redis/MSMQ等方案,作為實作參考。部署議題將留待後續篇章詳述。
段落重點
前言:微服務運行在什麼樣的基礎建設上?
本文延續前兩篇規劃與切割案例,轉而聚焦微服務的底層運作環境。作者指出,微服務降低了單一服務的複雜度,但整體應用並未變簡單,複雜度被轉移到服務之間的協作,因此需要強而有力的基礎設施來支撐數十到數百個服務實例的協同與治理。對新創而言,不建議一開始就全面微服務化;應以可重構的單體起步,當系統和團隊規模成長到瓶頸再逐步切分,並同步擴建運維能力與基礎設施。成功導入的前提包括:團隊具備DevOps流程與快速配置/部署/監控能力,以及環境架構與維運流程的可靠性。本文將鎖定微服務特有的四大基礎建設:API Gateway、Service Discovery、Communication & Event-Driven System、Log,並推薦NGINX微服務電子書作為入門資源。
微服務需要那些基礎建設?
作者強調四大必備能力如同系統重要器官,缺一不可。API Gateway負責對外API的關卡管理,涵蓋安全/認證、快取與API聚合;Service Discovery維護服務清單、健康狀態與配置,支援Gateway與後端路由決策;Communication/Event-Driven以MQ/Bus承載同步/非同步、Pub/Sub、路由與排程等模式,將通訊複雜度從業務程式碼中剝離;Log則需支援跨服務事件的關聯與追蹤,協助快速回溯與定位問題。作者提醒,在基礎設施尚未成熟前,微服務難以產生實質效益,且許多文章忽略了這些「黑暗面」。因此,導入策略應審慎評估現況能力與成本,再逐步補齊缺口。文中並引導讀者先行閱讀NGINX的微服務系列,以掌握這些基礎組件在架構中的作用與選型原則。
API Gateway
在多服務組成的前端場景(如電商首頁),若由客戶端直連多個後端微服務,將面臨多次往返、耦合過深、難以最佳化與安全風險。API Gateway作為統一入口,能進行N對1的請求聚合、路由與轉譯,並集中特權操作(認證/授權、緩存、日誌),讓前端只做一次呼叫即可取得整合資料,內部細節對外完全隔離。更進一步,Gateway能與認證服務整合,統一處理跨服務的身份驗證與錯誤記錄,後端服務只需信任來自Gateway的憑證,避免N×(N-1)種認證傳遞組合爆炸。實作上可選開源Kong或雲端API Management(如Azure APIM),也可自建但成本較高。作者並指向其系列文章中的API Token實作,展示跨服務認證的落地方法。總結而言,Gateway是性能優化、演進隔離與安全治理的關鍵樞紐。
Service Discovery
服務發現解決「我要的服務在哪裡」:維護可用節點、提供IP/Port查詢、下發共用配置,並與其他元件(含API Gateway、LB)緊密協作。最基本可用DNS實現(DDNS註冊/撤銷、RR、SRV/TXT),但專用解決方案(Consul、etcd、ZooKeeper)在健康檢查與配置管理上更完善。基本流程是服務啟動時透過客戶端註冊,Registry維護清單;呼叫方查詢Registry取得可用端點。為避免呼叫端承擔過多邏輯,建議由後端LB結合Registry做流量分配,提高維運可控性。健康檢查應同時具備被動心跳與主動探測(如Ping/Echo/Diagnostic API),以避免心跳仍在但應用實際掛掉的誤判。文末提供選型參考與.NET相關方案,說明不同技術棧都能建立適用的發現與治理能力。
Async & Sync Communication / Event System
微服務通訊不僅是HTTP/REST,還包含同步/非同步、回呼、Pub/Sub與事件驅動等模式。Message Queue/Bus是核心基建,負責發布/訂閱、路由與緩衝,將發布端、訂閱端與轉送層解耦,集中管理資料流,降低耦合與複雜度,並透過持久化與多消費者並行,提升可靠性與吞吐。常見情境包括:訂單受理的非同步處理;以雙通道MQ實現可靠的同步請求/回覆;事件驅動協同,將N×M互動簡化為N+M。作者以跨服務交易為例,說明用事件與2PC處理一致性:先記錄狀態並發布事件,對方確認後再轉為成功;若逾時或失敗則取消並可重送取消,確保最終一致性。工具上建議RabbitMQ、Kafka;在特定情境亦可用Redis或MSMQ(其Store-and-Forward可靠但彈性較弱)。雖然HTTP可行,但處理重試、關聯與錯誤恢復的成本更高,MQ/Bus能顯著簡化設計。
後記
作者總結,微服務的成敗高度依賴基礎建設成熟度與團隊維運能力;在地基不穩時貿然導入,幾乎註定失敗。選型原則是「買得起、跑得動、理解深、有能力維護」,並強調組件間的整體搭配優於單點最強。市場已有成熟方案可用,應善用社群與雲端服務降低風險與人力成本。本文著重於四大基礎建設的角色與實務,部署細節與策略將於下一篇續述,提醒讀者在規模演進過程中持續調整架構與運維能力,讓微服務成為支撐業務成長的穩定平台,而非額外負擔。
資訊整理
知識架構圖
- 前置知識:
- 基本系統架構概念:單體式架構 vs. 微服務、SOA、HTTP/REST
- DevOps 能力:自動化配置、部署、監控、日誌集中化
- 分散式系統基礎:服務發現、負載平衡、健康檢查、CAP/一致性思維
- 訊息與佇列:MQ 基本模型(pub/sub、routing、RPC、store-and-forward)
- 基礎網路與安全:反向代理、API 認證/授權、TLS、WAF 基本概念
- 核心概念:
- 微服務基礎建設四支柱:API Gateway、Service Discovery、Communication/Event(MQ)、Logging
- 架構複雜度轉移:從服務內部轉移到服務間協作與運維
- 認證集中化:以 API Gateway 統一處理跨服務認證與授權
- 服務健康與彈性:註冊/反註冊、heartbeat、主動探測、負載導向轉送
- 事件驅動與一致性:以 MQ 實現異步協作、用事件簡化耦合、以 2PC/補償流程處理跨服務交易
- 技術依賴:
- API Gateway 依賴:Service Discovery(服務端點、健康狀態)、認證服務、快取/日誌
- Service Discovery 依賴:健康檢查(被動 heartbeat + 主動探測)、註冊客戶端、可能結合組態管理
- Communication/Event 依賴:可靠 MQ(RabbitMQ/Kafka 等)、Topic/Exchange/Queue 設計、可能的 HTTP RPC
- Logging 依賴:全域追蹤 ID(Correlation/Trace ID)、集中式收集與查詢平台、與 Gateway/MQ/服務日誌整合
- 負載平衡與反向代理:與 Discovery 整合,實作就近選路、熔斷/重試
- 應用場景:
- 行動/電商首頁資料聚合:API Gateway 做 N→1 聚合、快取、版本轉譯
- 高動態擴縮:大量 service instances 的自動註冊、摘除故障節點
- 訂單/支付等工作流:以 MQ 非同步處理、削峰填谷、消費者多實例並行
- 跨服務交易一致性:事件驅動流程 + 2PC 或補償機制
- 故障追蹤與稽核:用 Trace ID 串接多服務日誌,快速定位異常鏈路
學習路徑建議
- 入門者路徑:
- 理解單體到微服務的動機與權衡(先漸進重構)
- 了解 API Gateway 基本職能(轉發、聚合、認證、快取)
- 了解 Service Discovery 概念與 DNS 的基本替代作法
- 初識 MQ:pub/sub、routing、簡單異步處理
- 建立基本日誌規範:結構化日誌與 Trace/Correlation ID
- 進階者路徑:
- 實作跨服務認證委派:Gateway 統一驗證與憑證傳遞
- 建置 Discovery 全家桶:註冊、健康檢查(主動/被動)、與 LB 整合
- 設計事件驅動資料流:topic 規劃、死信/重試策略、順序與一致性
- 交易一致性策略:2PC 概念、補償/回滾流程設計、冪等性
- 可觀測性:集中式日誌、分散式追蹤、關鍵 SLO 與警示
- 實戰路徑:
- 選型與 PoC:Kong 或雲端 API Management;Consul/etcd/ZooKeeper;RabbitMQ/Kafka
- 建立最小可行平台:CI/CD、容器化部署、Gateway + Discovery + MQ + Logging 基礎線
- 實作一個端到端案例:行動首頁聚合 + 事件驅動的訂單流程 + 追蹤 ID 串接
- 故障演練:服務下線、心跳延遲、節點故障、重試/熔斷/降級
- 擴展與治理:版本管理、配額/速率限制、API 生命週期與觀測回饋
關鍵要點清單
- 漸進式演進而非一蹴可幾: 先在單體中持續重構,規模與瓶頸出現時再切微服務 (優先級: 高)
- DevOps 先決能力: 自動化配置、部署、監控、集中式日誌是導入微服務的硬門檻 (優先級: 高)
- API Gateway 的核心職能: 轉發、聚合、快取、路由、認證/授權、日誌 (優先級: 高)
- 認證集中化到 Gateway: 避免 N×(N−1) 複雜轉授,後端只信任來自 Gateway 的憑證 (優先級: 高)
- Service Discovery 機制: 註冊/反註冊、健康檢查、端點查詢、可與組態管理整合 (優先級: 高)
- 主動+被動健康檢查: heartbeat 搭配主動探測(Echo/Diagnostics API)提升準確度 (優先級: 高)
- 以 LB 消弭呼叫端複雜度: 由後端 LB + Discovery 決定轉送與摘除,簡化客戶端 (優先級: 中)
- DNS 作為基礎替代: 在基本需求下可用 DDNS、SRV/TXT、RR 先行支撐 Discovery (優先級: 中)
- 事件驅動架構: 用事件把 N×M 關係簡化為 N+M,降低耦合與溝通複雜度 (優先級: 高)
- MQ 的價值主張: 解耦與可靠傳遞、削峰填谷、水平擴展消費者、存儲後轉送 (優先級: 高)
- 跨服務一致性策略: 事件編排 + 2PC/補償、冪等性與重送策略 (優先級: 高)
- 同步 vs 非同步通訊選擇: HTTP/REST 搭配 LB 與重試;或以雙向 MQ 模式實現同步語義 (優先級: 中)
- 日誌的可追蹤性: 用追蹤編號串起多服務日誌,支援問題回放與即時定位 (優先級: 高)
- 解決方案選型: API Gateway(Kong/雲端 APIM)、Discovery(Consul/etcd/ZK)、MQ(RabbitMQ/Kafka)(優先級: 中)
- 可靠性與社群驗證: 基礎建設優先採用成熟方案,避免自建造成風險 (優先級: 高)