概述 優點 第一 ,它解決了複雜問題。它把可能會變得龐大的單體應用程式分解成一套服務。雖然功能數量不變,但是應用程式已經被分解成可管理的塊或者服務。每個服務都有一個明確定義邊界的方式,如遠程過程調用(RPC)驅動或消息驅動 API。微服務架構模式強制一定程度的模塊化,實際上,使用單體代碼來實現是極其 ...
概述
優點
第一,它解決了複雜問題。它把可能會變得龐大的單體應用程式分解成一套服務。雖然功能數量不變,但是應用程式已經被分解成可管理的塊或者服務。每個服務都有一個明確定義邊界的方式,如遠程過程調用(RPC)驅動或消息驅動 API。微服務架構模式強制一定程度的模塊化,實際上,使用單體代碼來實現是極其困難的。因此,使用微服務架構模式,個體服務能被更快地開發,並更容易理解與維護。
第二,這種架構使得每個服務都可以由一個團隊獨立專註開發。開發者可以自由選擇任何符合服務 API 契約的技術。當然,更多的組織是希望通過技術選型限制來避免完全混亂的狀態。然而,這種自由意味著開發人員不再有可能在這種自由的新項目開始時使用過時的技術。當編寫一個新服務時,他們可以選擇當前的技術。此外,由於服務較小,使用當前技術重寫舊服務將變得更加可行。
第三,微服務架構模式可以實現每個微服務獨立部署。開發人員根本不需要去協調部署本地變更到服務。這些變更一經測試即可立即部署。比如,UI 團隊可以執行 A|B 測試,並快速迭代 UI 變更。微服務架構模式使得持續部署成為可能。
最後,微服務架構模式使得每個服務能夠獨立擴展。您可以僅部署滿足每個服務的容量和可用性約束的實例數目。此外,您可以使用與服務資源要求最匹配的硬體。例如,您可以在 EC2 Compute Optimized 實例上部署一個 CPU 密集型圖像處理服務,並且在 EC2 Memory-optimized 實例上部署一個記憶體資料庫服務。
缺點
微服務另一個主要缺點是由於微服務是一個分散式系統,其使得整體變得複雜。開發者需要選擇和實現基於消息或者 RPC的進程間通信機制。此外,由於目標請求可能很慢或者不可用,他們必須要編寫代碼來處理局部故障。雖然這些並不是很複雜、高深,但模塊間通過語言級方法/過程調用相互調用,這比單體應用要複雜得多。
微服務的另一個挑戰是分區資料庫架構。更新多個業務實體的業務事務是相當普遍的。這些事務在單體應用中的實現顯得微不足道,因為單體只存在一個單獨的資料庫。在基於微服務的應用程式中,您需要更新不同服務所用的資料庫。通常不會選擇分散式事務,不僅僅是因為 CAP 定理。他們根本不支持如今高度可擴展的 NoSQL 資料庫和消息代理。您最後不得不使用基於最終一致性的方法,這對於開發人員來說更具挑戰性。
測試微服務應用程式複雜。例如,使用現代框架如 Spring Boot,只需要編寫一個測試類來啟動一個單體 web 應用程式並測試其 REST API。相比之下,一個類似的測試類對於微服務來說需要啟動該服務及其所依賴的所有服務,或者至少為這些服務配置存根。再次聲明,雖然這不是一件高深的事情,但不要低估了這樣做的複雜性。
微服務架構模式的另一個主要挑戰是實現了跨越多服務變更。例如,我們假設您正在實現一個變更服務 A、服務 B 和 服務 C 的需求,其中 A 依賴於 B,且 B 依賴於 C。在單體應用程式中,您可以簡單地修改相應的模塊、整合變更並一次性部署他們。相反,在微服務中您需要仔細規劃和協調出現的變更至每個服務。例如,您需要更新服務 C,然後更新服務 B,最後更新服務 A。幸運的是,大多數變更只會影響一個服務,需要協調的多服務變更相對較少。
部署基於微服務的應用程式也是相當複雜的。一個單體應用可以很容易地部署到基於傳統負載均衡器的一組相同伺服器上。每個應用程式實例都配置有基礎設施服務的位置(主機和埠),比如資料庫和消息代理。相比之下,微服務應用程式通常由大量的服務組成。例如,據 Adrian Cockcroft 瞭解到,Hailo 擁有 160 個不同的服務,Netflix 擁有的服務超過 600 個。
每個服務都有多個運行時實例。還有更多的移動部件需要配置、部署、擴展和監控。此外,您還需要實現服務發現機制,使得服務能夠發現需要與之通信的任何其他服務的位置(主機和埠)。比較傳統麻煩的基於票據(ticket-based)和手動的操作方式無法擴展到如此複雜程度。因此,要成功部署微服務應用程式,需要求開發人員能高度控制部署方式和高度自動化。
一種自動化方式是使用現成的平臺即服務(PaaS),如 Cloud Foundry。PaaS 為開發人員提供了一種簡單的方式來部署和管理他們的微服務。它讓開發人員避開了諸如採購和配置 IT 資源等煩惱。同時,配置 PaaS 的系統人員和網路專業人員可以確保達到最佳實踐以落實公司策略。
自動化微服務部署的另一個方式是開發自己的 PaaS。一個普遍的起點是使用集群方案,如 Kubernetes,與 Docker 等容器技術相結合。