微服務架構在現今軟體開發領域日益普及,它將應用程式拆分成小型、獨立的服務單元,每個單元負責特定的業務功能。這種架構模式相較於傳統單體架構,更能適應快速變化的市場需求,並提升開發效率。隨著業務規模的擴大,單體架構的維護成本、更新難度和擴充套件性瓶頸日益顯著。微服務架構則能有效解決這些問題,實作更精細化的資源管理和更快速的迭代更新。同時,微服務也允許團隊根據不同服務的需求選擇最合適的技術堆疊,提升開發靈活性。然而,微服務架構也帶來了新的挑戰,例如服務間通訊的複雜性、分散式系統的監控和管理難度以及資料一致性問題。因此,在轉型過程中需要仔細評估和規劃,並選擇合適的工具和技術來應對這些挑戰。
微服務架構的商業價值
在當今快速變化的數位環境中,企業面臨著許多挑戰,包括技術老化、客戶需求變動以及業務需求的不斷演變。這些因素促使企業考慮採用微服務架構來取代傳統的單體架構(monolithic architecture)。然而,微服務架構雖然能帶來許多好處,但也伴隨著一些複雜性和挑戰。以下是一些關鍵考量因素。
監控與管理
在微服務架構中,數百甚至數千個微服務分佈在分散式系統中,這意味著有大量的動態元素需要監控和管理。為了確保系統的穩定執行,必須在基礎設施層面(如CPU、記憶體、I/O效能)和應用層面(如應用日誌、API呼叫效能)進行詳細的檢查和監控。這些資料應該易於取得,以便營運和工程團隊能夠及時採取行動,改進服務。
組態管理
每個微服務都有各種組態選項,這些選項提供了在生產環境中調整服務的靈活性。例如,快取設定、擴充套件引數、執行緒數量、特定功能標誌以及資料函式庫連線等。然而,管理這些組態對於數千個服務來說可能會非常繁瑣。因此,選擇合適的工具組合來建立一個簡單的共同介面是至關重要的。
失敗處理
在微服務架構中,失敗是不可避免的。每個微服務都應該設計成能夠在依賴服務失敗時仍然保持正常運作,而不會影響整體系統的效能。這意味著需要設計自我修復系統,確保即使某個微服務失敗,也不會影響到其他服務。
換成微服務的商業價值
儘管微服務架構帶來了許多挑戰,但其長期收益遠超過初始投資。以下是一些關鍵因素:
- 靈活性與擴充套件性:微服務架構使得系統更容易進行模組化擴充套件和更新,從而提高了系統的靈活性和可維護性。
- 快速交付:透過將應用程式拆分成更小的獨立部分,開發團隊可以更快地進行更新和佈署,縮短了交付時間。
- 技術選型自由:不同的微服務可以使用不同的技術堆疊,這使得技術選型更加靈活。
從單體架構轉向微服務
傳統單體架構的平均壽命通常為4到5年。隨著業務需求和技術環境的變化,企業不得不定期進行平台更新或替換。然而,這些更新通常需要大量的資源投入和時間成本。在此情況下,微服務架構提供了一種更具成本效益的解決方案。
高層次分析
我們可以透過對比單體架構和平台重新整理週期來理解微服務架構的優勢:
- 建立成本:從頭開始建立一個軟體平台包括分析、設計、開發、測試和發布等階段。這是整個週期中最大的投資。
- 維護成本:正常維護軟體平台所需的費用包括應用OS級補丁和基礎設施維護等。
- 更新/變更成本:增加新功能、修復bug、重測和發布所需的費用。
- 擴充套件成本:隨著使用者基礎增長而適當擴充套件平台以保持系統回應時間和效能所需的費用。
- 市場進入時間:從分析到發布一個軟體平台或更新所需的時間。
透過對比單體架構和平台重新整理週期中的這些成本組成部分,我們可以看到微服務架構在建立成本上可能較高,但其長期維護成本和擴充套件成本遠低於單體架構。此外,微服務架構還能顯著縮短市場進入時間。
轉向微服務:前瞻與深思
目前大多數軟體平台採用的是單體式架構(monolithic architecture),其平均壽命約為4到5年。隨著時間推移與環境變遷影響因素會驅動著現有功能逐漸陳舊化:
- 客戶需求變化
- 新興業務需求
- 架構缺乏靈活性
- 無法有效擴充套件
- 技術老化
- 效率低下
當遇到上述問題時,平台重新整理迴圈便會開始執行:企業必須考慮新技術並做出相關投資以適應新一代平台需要。這類別改變不可避免地影響到企業盈利底線。
麵對高昂轉型成本
我們假設一個典型情境來分析轉型後可實作之成本文省:當前有兩套軟體開發模式 — 單體式與微服務式 — 分別以「M」及「S」表示其各項開發與維護相關費用:
- 建立費用: M_CTB 及 S_CTB
- 維護費用: M_CTM 及 S_CTM
- 更新/變更費用: M_CTU 及 S_CTU
- 拓展費用: M_CTS 及 S_CTS
- 市場進入時間: M_TTM 及 S_TTM
從經濟角度出發,「單體式」在初始構建時通常較為便宜但難以長期維護;而「微服務式」初始費用較高但長期維護、升級及擴充套件更具彈性與靈活性。
提供深入分析與詳細解密
不同模式之對比分析
- 建立費用:
- 若已有一現有應用程式, 轉換為「單體式」時, 必須考慮培訓員工、變革文化、引入新人才及工具系統等額外投資, 故此情景下轉換為「單體式」應用程式所需初始費用往往較高。
- 若從頭開始一個全新軟體專案, 初始費用差異將不太明顯, 甚至「單體式」仍會較為划算。
- 維護費用:
- 「單體式」由於硬體維護與補丁安裝可能導致停機, 「單體式」故障排除複雜且耗時。
- 「單體式」採取自動化技術(如容器化與DevOps)可減少人為干預, 減少停機率及節省IT維運時間。
- 開發/變更/升級費用:
- 「單體式」通常需要重構整個程式碼函式庫以新增新功能或修復bug, 故相對耗時且複雜。
- 「單體式」每次變動都會觸發龐大測試工作量(迴歸測試等), 故全流程較慢且繁瑣。
- 擴充套件費用:
- 隨著使用者數量增加,「單體式」可能無法提供足夠靈活性以實作顯著擴充並維持系統反應速度與表現。
- 「單體式」設計時已考慮到模組化與獨立性, 故能簡單地新增或移除特定功能元件而不影響整個系統執行。
- 市場進入時間:
- 「單體式」常因開發週期較長導致市場進入時間較慢; 需要為每次更新進行全面測試並推出.
- 「單體式」則允許開發團隊對各項功能模組進行獨立開發並迅速佈署, 減少交付時間.
代表轉型過程
graph TD; C[C] A[傳統單體架構] --> B[遇到瓶頸]; B --> C{選擇轉型}; C -->|Yes| D[選擇微服務]; C -->|No| E[維持現狀]; D --> F[初步投資]; F --> G[組織文化變革]; G --> H[靈活擴充套件]; H --> I[降低維護費用]; E --> J[逐漸老化];
內容解密:
此圖示表示從傳統單體架構遇到瓶頸後所面臨之選擇:選擇轉型或維持現狀。
- 傳統單體架構:代表目前大部分企業採行之方式。
- 遇到瓶頸:隨著技術演進與業務增長, 傳統單體形式將無法滿足需要。
- 選擇轉型:當前公司必須決定是否轉型為更先進之結構.
- 若否則代表將繼續採行傳統方式並逐漸陰化.
- 若是則進入接下來步驟:
- 選擇微服務:若決定轉型則選擇採行「微服務」。這一決策將帶來未來一系列之改革.
- 初步投資:首先將會面臨較高之初步投資(如培訓人才與引入新技術).
- 組織文化變革:隨後進行內部文化改造以適應新環境.
- 靈活擴充套件:最終可實作更具靈活性與彈性之擴充套件能力.
- 降低維護費用:此外亦可顯著降低後續之維護費用.
透過此圖示我們可以清晰看見各階段之走向與可能結果
轉換為微服務架構的優勢
轉換為微服務架構(Microservices Architecture)不僅是技術趨勢,更是企業在面對快速變化市場時的戰略選擇。以下將探討微服務架構相較於傳統單體架構(Monolithic Architecture)的幾個主要優勢,包括更新成本、擴充套件成本以及上市時間。
更新成本
更新或新增功能在微服務架構中相對簡單,因為每個微服務都是獨立執行且具有一定功能範疇的模組。這與單體架構截然不同,單體應用程式通常需要重建整個系統來進行更新,這不僅耗時還容易產生人為錯誤。
更新流程對比
在單體架構中,一次小小的修改可能需要重新編譯整個應用程式,這樣的流程通常需要數小時甚至更長時間。而微服務則只需針對特定模組進行更新、測試和佈署,這大大縮短了開發和發布的時間。
擴充套件成本
微服務架構允許根據需求進行靈活擴充套件。當某些微服務出現高負載時,可以自動增加相應的服務容器來處理需求,並且在需求減少時自動釋放資源。這種靈活性不僅節省了硬體和軟體資源,也提高了系統的可靠性和效率。
擴充套件策略
在單體架構中,擴充套件通常需要啟動另一個完整的應用程式例項,這樣不僅浪費資源,還增加了系統的複雜度。而微服務則可以精確地針對特定模組進行擴充套件,這使得資源利用更加高效。
上市時間
快速上市是微服務架構的一大優勢。新功能的開發和佈署速度顯著提升,特別是與DevOps策略相結合時。DevOps強調速度、穩定性、效能和協作,這些都是成功軟體平台必備的元素。
DevOps與微服務
微服務和容器技術是DevOps成功的關鍵。它們使得團隊能夠更快地交付軟體並且保持高品質。這種敏捷性使得企業能夠迅速回應市場變化並保持競爭力。
未來更新週期
傳統單體架構通常有一個有限的壽命週期,一旦到期,企業就需要進行全新的開發和佈署。而微服務則打破了這一模式,因為它們允許隨時新增或移除模組以滿足業務需求。
長期維護
由於微服務架構的模組化設計,企業可以根據需要升級或替換特定技術元件而不影響整個系統。這種靈活性使得系統能夠持續演進而不需要大規模重構。
內容解密:
- 更新成本:在傳統單體架構中,任何小變動都可能導致全面重建;而在微服務中,只需針對特定功能進行更新。
- 擴充套件成本:傳統單體架構要求啟動完整應用程式例項;而微服務則允許精確地針對特定模組進行擴充套件。
- 上市時間:DevOps與微服務相結合大幅縮短了上市時間。
- 未來更新週期:傳統單體架構有限壽命週期;而微服務允許靈活升級和替換技術元件。
轉換為微服務架構後的實踐案例
以下案例將詳細說明一家電子商務公司如何透過轉換為微服務架構來實作快速迭代與靈活擴充套件:
案例背景
某電子商務公司原本採用單體架構來管理其整個平台。隨著業務量的急劇增長,他們發現系統難以滿足需求並且維護成本逐年增加。
轉型過程
公司決定將其系統拆分為多個獨立執行的微服務模組:
- 搜尋功能
- 購物車功能
- 支付功能
- 庫存管理
每個模組都獨立佈署並在各自容器中執行。
結果
轉型後,搜尋功能遭遇高負載時可以自動擴充套件並釋放資源。購物車功能也可以根據需求進行快速更新。支付功能則保持穩定執行以確保交易安全。
此圖示展示了該電子商務平台在轉型前後的結構變化:
graph TD A[Load Balancer] --> B[Monolithic Application] B --> C[Helpdesk] B --> D[Application] B --> E[Ticketing] A2[Load Balancer] --> B2[API Gateway] B2 --> C2[Ticketing Microservice] B2 --> D2[Search Microservice] B2 --> E2[Catalog Microservice]
內容解密:
- 圖示解釋:原始結構中的所有功能由單一應用程式提供;轉型後每個功能都成為一個獨立執行的微服務。
- 具體技術選型:使用API Gateway作為入口點來管理不同微服務之間的通訊。
- 實際效益:快速迭代能力提升、資源利用更加高效、系統更加靈活且可擴充套件。
透過轉換為微服務架構,玄貓認為電子商務公司不僅降低了維護成本,還顯著提升了系統效能與可靠性。這樣的轉型經驗對於其他企業也具有一定參考價值。
微服務之間的通訊
在微服務架構中,服務之間的通訊是一個關鍵問題。同步通訊方式,例如HTTP請求,雖然簡單直觀,但卻存在一些嚴重的缺點。客戶端會被阻塞,直到接收到其他服務的回應才能繼續工作。如果服務故障或發生錯誤,這種方法就無法很好地擴充套件,並且會失去微服務的大部分優勢。因此,非同步通訊是更好的替代方案。
非同步通訊
在非同步通訊中,客戶端向另一個微服務發出請求後,可以繼續進行其他工作,同時透過監聽執行緒等待回應。監聽執行緒在回應到來時處理它們。被呼叫的微服務內部的問題不會影響客戶端。結果是提高了可擴充套件性,並且服務之間的耦合性降低。
使用發布/訂閱模式
另一種方法是使用發布/訂閱模式,其中發布者將訊息發布到訊息匯流排(如Kafka)。訂閱者在訊息匯流排上註冊感興趣的訊息,並處理它們,忽略其餘的。處理完畢後,它們可能會發布結果,這些結果可能會被原始發布者接收,這取決於使用的訊息交換模式。
準備撰寫Web服務
總體來說,開發人員在準備撰寫Web服務時需要決定三件事:
協定
當涉及到Web服務協定時,HTTP是金標準。它是網頁瀏覽器使用的同一協定,經受住了時間的考驗。最大的優點是它非常輕量級,根據簡單的請求/回應模型。客戶端形成並傳送HTTP請求,伺服器執行所需的操作並傳回HTTP回應。
Web服務標準
有三個主要選擇:
- RESTful:廣泛接受並推薦。
- SOAP:過於臃腫,需要客戶端和伺服器端實作。
- GraphQL:開放協定用於構建和消費RESTful API。
RESTful根據HTTP請求和回應。它比SOAP更輕量級,這是它的優勢之一。此外,RESTful服務是無狀態且可快取的,這使得它們更快——對於支援行動請求至關重要。
訊息格式
有許多常用且完全可接受的訊息格式可以選擇,包括XML、RSS和JSON。許多開發人員喜歡JSON,主要是因為它根據文字且可讀性強,還有各種函式庫可以輕鬆地將JSON轉換為物件和傳回文字表示形式。由於JSON沒有語法上的過度負擔,JSON資料比XML資料更小。這意味著處理速度更快,因為傳輸和接收訊息所需的頻寬更少。JSON特別適用於手持裝置和行動裝置(如手機和平板電腦電腦),這些裝置儲存有限、計算輕量化且頻寬要求低以傳輸網路訊息。
不同的人有不同的需求和偏好,因此本章節僅提供建議。根據您的需求、效能要求和舒適度做出自己的選擇。
微服務維護
建立微服務之間的通訊後,您需要保持它們的最新狀態並進行維護。「變化是永恆」這句話也適用於您的軟體。隨著新需求不斷湧入,調整現有功能的請求也會隨之而來,有時甚至需要修改這些Web服務。這就是微服務的一個複雜性問題。
支援現有客戶端實作
有一些時候您需要在修改微服務核心功能時更新介面。您必須確保微服務具備向後相容性,因為很可能有一個或多個其他微服務(消費者)正在使用這個已發布介面進行通訊。因此您必須確保仍然支援舊版本直到消費者微服務團隊更改實作以消費新介面。
安全設計
如果呼叫的Web服務故障,您可以採取幾種方式來解決問題之一是簡單地在客戶端程式碼中新增超時機制。在提供方方面顯示錯誤情況下傳回適當錯誤碼或某些情況下傳回預設值。此操作也有助於改善故障排除工作。
監控
主動監控微服務以定期呼叫每個或透過其他方式監控它們。如果某個微服務故障則採取適當行動。
佇列
使用發布/訂閱方法構建非同步Web服務將有顯著優勢 即使當該專案停止時, 專案也會從匯流排重新啟動.
當我們將單體應用程式轉換為微服務架構時, 其結果可能會產生數百個微服務, 以及成千上萬 的 web service 或 message service 用來溝通, 因此遵循最佳實踐至關重要.
發現服務
當您擁有數百或數千個微服務時會發生什麼?此外, 您可能還需要為相同功能提供多個 web service (例如根據不同客戶端).
在單體架構中不會出現大問題
- 客戶端將進行一次呼叫, 剩下的是由應用程式處理
- 在微服務架構中, 則產生兩大問題
- 客戶端必須同時呼叫多個 Service以達到相同功能
- 客戶端必須知道 Service位置.
以圖書管理應用程式為例. 假設一位使用者想檢視其帳戶頁面. 帳戶頁面顯示借書歷史、建議、目前購物車、付款、帳戶設定等資訊. 若應用程式根據單體架構, 當使用者點選我的帳戶, Service 呼叫顯示我的帳戶頁面, 在後端, 應用程式呼叫各種函式並查詢資料函式庫完成所有操作.
對於手持裝置和平板電腦電腦則需要不同或子集呼叫給予空間和處理能力限制, 增加了複雜度.
與此相對地, 在根據微型化架構中, 一個客戶端則負責呼叫所有必要 Micro Service: 借書購物車、付款資訊及帳戶設定等. 採取此方式效率低下且僵硬.
graph TD; A[Client] --> B[Micro Service: Checkout Cart] A --> C[Micro Service: Payment Info] A --> D[Micro Service: Account Settings]
此圖示展示了一位客戶必須同時呼叫多項 Micro Service才能達到相同功能.
內容解密:
- Client: 模擬使用者與系統互動。
- Micro Services: 借書購物車、付款資訊及帳號設定。
- 呼叫關係: Client必須同時呼叫多項 Micro Service才能達到相同功能, 因此造成效率低下且僵硬.
對於某些特定情況(如依賴其他外部API),可考慮使用API Gateway等技術來解決上述問題:
graph TD; A[Client] --> B[API Gateway] B --> C[Micro Service: Checkout Cart] B --> D[Micro Service: Payment Info] B --> E[Micro Service: Account Settings]
此圖示展示了一位 Client 與 API Gateway 的互動流程以及 API Gateway 與多項 Micro Service 的互動關係.
- Client: 模擬使用者與系統互動。
- API Gateway: 作為 Client 與 Micro Services 的橋樑。
- Micro Services: 借書購物車、付款資訊及帳號設定。
- 呼叫關係: Client 僅需與 API Gateway 溝通即可達成目標, 而 API Gateway 則負責與各項 Micro Services 溝通.
API Gateway 的設計原則
- 中央入口點: Client 僅需透過 API Gateway 與系統互動, 大大簡化了 Client 的設計。
- 安全性提升: API Gateway 提供了集中的安全機制(如身份驗證、授權等)。
- 負載平衡: API Gateway 能夠根據業務需求自動分配流量, 提高系統穩定性。
- 快取機制: API Gateway 提供了快取機制, 提高資料讀取速度。
- 日誌記錄與監控: 集中管理所有請求日誌與監控資料, 提高維運效率。
以上內容展示瞭如何利用API Gateway解決分散式系統中的一些常見問題.