架構師觀點 - 轉移到微服務架構的經驗分享 (Part 2)
摘要提示
- 保守演進策略: 以逐步重構與POC驗證取代推倒重來,降低導入微服務的風險與成本。
- 問題驅動切割: 以維護困難與雲端化困難為優先,部署困難次之,按痛點排序推進。
- 避免一窩蜂: 警惕盲從潮流,強調快速驗證、投報優先、風險控管與替代方案。
- 架構師職能: 需能平衡技術與業務,且必須親自寫出核心POC與範例程式帶動團隊。
- Content Service升級: 從靜態CDN轉型為可獨立運行的Courseware Service,強化授權、追蹤與API。
- 引入SVN: 以集中式版控取代檔案伺服器,解決教材版本、同步、儲存效率與維運問題。
- MQ通信模式: 採用Message Queue + Worker建立RPC,強化非同步、可靠度與事件驅動能力。
- 雲端友善部署: 架構需同時支援企業私有環境與公有雲,能靈活混合部署。
- 微服務粒度: 實務採取「microservice ready/miniservice」的細粒度,務實達成商業目標。
- Think big, start small: 先描繪藍圖再小步快跑,確保後續演進不被早期決策綁死。
全文重點
本文延續Part 1,聚焦於將一套大型、歷史悠久的ASP.NET + MS SQL單體式企業系統,務實走向微服務架構的實戰過程。作者先界定情境:系統多年累積功能與複雜度,已面臨維護、部署與雲端化瓶頸,且需同時支援單機(private cloud)與SaaS(public cloud)模式。因微服務導入門檻高,作者採保守演進策略:大量POC驗證、逐步重構切割、避免一次性重寫,以降低風險並維持隨時可出貨。
在決策思維上,作者以「一窩蜂驅動開發」為戒,強調不要為潮流而做,要為問題而改。具體方法包括:快速Spikes/POC確認可行性與風險;以投資報酬率排序採行指南;倚賴有實作能力的架構師主導,確保能以程式碼與團隊對話並提供可運行樣板。作者指出,完全重寫常會陷入漫長黑暗期,重構更能延續既有商業邏輯與用戶期望,同時藉單元測試與設計重構提升可切割性。
架構調整的三個關鍵改動:其一,將原本「Content Service/CDN」升級為「Courseware Service」,賦予獨立完整的教材代管能力(包含發布API、身份傳遞、學習追蹤、計費、HLS+AES保護、授權管理與回傳API),並配置專屬資料庫,對齊微服務的獨立、自主、單一職責原則,也更契合PaaS化與雲端部署。其二,引入SVN(Subversion)取代傳統檔案伺服器,解決教材版本化、差異儲存、透過HTTP/HTTPS/SSH進行穿牆傳輸、自動化同步與成熟維運工具鏈,實務上比採用Git更貼近集中式內容庫需求。其三,以Message Queue(MSMQ)+ Worker建構服務間RPC通訊,彌補REST-only的限制,實現非同步、失敗重試、順序處理、推送通知與更高可靠度,避免HTTP長連線與同步耦合問題,並為發布/訂閱與事件驅動鋪路。
總結上,作者自評此階段是「微服務化就緒/miniservice」而非全然教科書式微服務,重點在務實落地與可持續演進。最後提出三道關鍵提問引導後續:如何切出真正獨立的服務?哪些可用成熟第三方替代?需要哪些共用基礎建設(如reverse proxy、MQ)?策略是先描繪藍圖,按痛點與ROI排序,小步快跑、持續重構,確保架構既能支撐現有商業,也能平滑邁向更完整的微服務與容器化(將於Part 3展開)。
段落重點
實際轉移案例
作者評估微服務的高複雜度與高門檻後,採保守策略:先深入理解優缺點,再以POC驗證技術、流程與環境,不推倒重來而是循序重構。面對人資學習系統的高耦合與維護困難、CI/CD因巨型編譯而失效、單體故障牽連整體等痛點,作者鎖定優先目標為維護與雲端化困難,部署困難次之,並計畫分階段微服務化。同時明確認知台灣多數情境不等於大型雲端服務場景,需要因地制宜做取捨,確保短期不致過度投資在對現況無顯著益處的設計上,但也要避免成為未來演進的阻礙。
一窩蜂驅動開發!!
以「一窩蜂驅動開發」文章為借鏡,作者提醒技術決策不可盲從潮流。好奇、樂觀、熱血不是問題,衝動缺評估才是風險。過往若重寫架構易陷黑暗期,如今選擇重構以保留符合用戶期待的既有邏輯,藉自動化測試與逐步演進降低風險。避免一窩蜂的做法包括:大量Spikes/POC聚焦關鍵風險(相容性、部署、容器化可行性等)、投報最高的先做、由具實作能量的架構師主導並以可執行程式碼帶動團隊。強調架構師應能寫出核心原型,作為內外溝通與取信基礎,文件不如程式碼具體;外部顧問若不能以程式碼引導團隊,效果有限。
回到微服務化,我們最後做了那些改變?
原架構為傳統WEB+DB,外加File/Content Server,偏向企業內網思維,CP值低、雲端優勢未發揮。作者重新聚焦三原則:服務需有足夠細粒度與清晰邊界;部署需能同時適應企業內與混合雲;充分運用雲服務的技術與商業特性。經過反思後,捨棄教條式熱門做法,改以「能解決實際痛點、可在短期產生價值且不阻礙未來演進」為準則,提出第一步調整後的架構藍圖並據此開展三項關鍵實作:Courseware Service升級、SVN替代File Server、MQ導入跨服務通訊。
1. Content Service 從單純的 CDN 升級為 Courseware Service:
將原本只做靜態檔與路由的Content Service升級為可獨立運作的Courseware Service,重點是「獨立自主與單一職責」:以服務「教材代管」為核心,具教材發布API、與主系統的身份與Session傳遞、學習行為追蹤與計費、HLS+AES內容保護、Token/JWT授權管理與可回傳學習紀錄的API,並配置專屬資料庫。此舉讓服務由單純頻寬分流升級為平台級能力,符合微服務自包含與雲端優化原則,也更貼近PaaS化的商業模式。設計思想呼應SRP(單一職責原則),但從物件層面擴展到服務邊界。
2. 採用 SVN (subversion) 來取代原有的 file server。
面對教材版本、同步、儲存效率與維運需求,作者以SVN取代傳統檔案伺服器:集中式版本庫具差異儲存與壓縮,降低雲端儲存成本;以HTTP/HTTPS/SSH穿牆,便於自動化與資安;具備成熟的維運工具、備份還原與一致性檢查;.NET有SharpSVN可整合。相較Git,SVN在集中式內容庫、權限與存取模型上更貼近需求。藉此把教材庫視為「針對檔案最佳化的資料庫」,讓團隊用熟悉的版控思維完成版本化、同步與維運,大幅降低自行研發專屬內容庫的風險與成本。
3. 系統之間的通訊方式,採用 Message Queue
僅靠REST的點對點同步呼叫在多服務場景下受限:缺乏推送、難以非同步處理、長連線不穩且佔資源、不利廣播與發布/訂閱模式。作者以MSMQ + Worker建立RPC機制:呼叫端非同步投遞,接收端排隊處理、可順序保證與失敗重試,完成後再回傳結果或透過事件通知,提升可靠度與即時性,避免HTTP長連線問題,並為事件驅動與更複雜的跨服務交易鋪陳。此改動先解決可靠度與非同步兩大痛點,未來可進一步演進到更完整的事件總線與Pub/Sub架構。
小結 - 微服務架構規劃的要點
作者自評此階段屬「microservice ready/miniservice」而非全然微服務,強調務實取捨:只採納能帶來足夠效益的準則,其餘先確保不形成未來阻礙。提出三大思考框架:1) 如何把現有系統切成真正可獨立部署與運行的服務(如Courseware Service);2) 哪些能力可由成熟第三方替代(如SVN取代File Server);3) 需要哪些基礎建設(如Reverse Proxy、Message Queue)。以「Think big, start small」為原則:先有藍圖與路線圖,再依痛點與ROI小步快跑、持續重構,既不一窩蜂,也不自縛手腳,為後續容器化與更完整的微服務基建(預告Part 3)做好鋪墊。
資訊整理
知識架構圖
- 前置知識
- 單體式架構與微服務架構的差異與成本
- 分散式系統基礎(服務邊界、資料一致性、非同步通訊)
- OOP、重構技巧、單元測試與CI/CD
- ASP.NET/SQL Server/Windows 環境與基礎雲端概念(Azure/混合雲)
- API 設計與安全(OAuth2/JWT)、Message Queue 基本概念
- 核心概念(3-5個)及其關係
- 漸進式遷移與保守策略:以POC與重構取代砍掉重練,先解決最痛點(維護、雲端化、部署)。
- 服務邊界與獨立性:提升「Content Service」為「Courseware Service」,專注單一責任且可獨立部署與運營。
- 善用成熟基礎設施:以SVN取代自建File Server,借力而非重造輪子。
- 非同步通訊:以Message Queue(MSMQ)+ Worker 實作可靠的RPC/事件處理,避免REST-only的限制。
- 架構師角色:以技術判斷、POC、代碼能力引導團隊,避免「一窩蜂驅動開發」。
關係:架構師以保守遷移策略串起服務邊界設計與技術選型;善用成熟元件與非同步通訊提升可靠度與雲端化彈性。
- 技術依賴
- Courseware Service:SQL Database、存取控制(OAuth2/JWT)、內容發佈與追蹤API、HLS+AES加密、CDN/內容分發
- 主系統內容儲存:SVN(集中式版本控管、差異儲存、透過SharpSVN整合)、HTTP/SSH/本機存取需求
- 服務間通訊:MSMQ(Queue、順序處理、重試)、Worker(背景任務)、RPC封裝
- 環境與部署:Azure(公有雲)與私有雲/代管、反向代理(Reverse Proxy)、CI/CD、容器化(後續Part 3)
- 應用場景
- 傳統ASP.NET + MS-SQL 企業應用逐步微服務化
- 需同時支援單機/私有雲與SaaS/公有雲的內容密集型系統(如人資e-learning)
- 面臨維護困難、部署緩慢、雲端化受限的大型單體式系統
- 需要可靠的跨服務事件處理、非同步交易流程、即時回傳的場景
學習路徑建議
- 入門者路徑
- 了解微服務的利弊與門檻,辨識自身痛點(維護、部署、雲端化)
- 熟悉REST與API安全(JWT/OAuth2)與ASP.NET Web API基礎
- 了解Message Queue基本概念與典型使用(非同步、重試、順序)
- 以小型POC練習:單一功能的服務化、基本Queue處理、簡單JWT驗證
- 進階者路徑
- 系統重構技巧:界定服務邊界、以interface解耦、建立單元測試保護網
- 設計與打造「可獨立運營」的服務(資料庫獨立、API邊界安全、部署獨立)
- 將檔案/版本需求交給成熟方案(SVN + SharpSVN),學會備援、一致性檢查、備份策略
- 設計Queue為中心的流程(RPC封裝、失敗重試、死信處理、冪等性)
- 實戰路徑
- 以Content→Courseware Service為範例:設計發佈API、學習追蹤、授權流程、HLS+AES
- 以SVN取代File Server:建立教材庫、差異儲存、傳輸通道(HTTPS/SSH/本機)
- 在關鍵流程導入MSMQ+Worker:定義消息格式、重試策略、監控與告警
- 部署到混合雲:反向代理、版本相容性策略、CI/CD流水線;逐步上線、灰度發布
關鍵要點清單
- 漸進式遷移策略:以POC與重構替代重寫,先解決最痛點(維護/雲端/部署) (優先級: 高)
- 架構師的實作力:能以代碼驗證架構、帶領POC與落地,避免紙上談兵 (優先級: 高)
- 避免一窩蜂:技術選型以投資報酬率與團隊能力為先,非盲從流行 (優先級: 高)
- 服務獨立性:單一責任、可獨立部署與營運,API邊界清晰 (優先級: 高)
- Courseware Service化:從CDN型內容服務升級為教材全流程服務 (優先級: 高)
- API安全:採用OAuth2/JWT與授權令牌保護跨服務存取 (優先級: 高)
- 內容保護:HLS + AES與金鑰管理,兼顧安全與體驗 (優先級: 中)
- 以SVN取代File Server:集中式版本控管、差異儲存、成熟維運工具 (優先級: 高)
- SharpSVN整合:在.NET環境中以API操作SVN以自動化流程 (優先級: 中)
- 非同步通訊:以Message Queue(MSMQ)+ Worker實現可靠RPC/事件處理 (優先級: 高)
- 冪等性與重試:消息處理需設計可重入、可重試與死信處理 (優先級: 高)
- 避免REST-only侷限:長任務、回調、廣播/訂閱以消息機制補足 (優先級: 中)
- 混合雲部署:同時支援私有雲/公有雲,部署方式與網路邊界需靈活 (優先級: 中)
- 基礎設施優先:反向代理、MQ、監控與CI/CD優先鋪好再擴張 (優先級: 高)
- Think Big, Start Small:有藍圖、有順序,確保每步可落地與回滾 (優先級: 高)