微服務是一種應用程序架構風格,它將應用程序劃分爲組件,其中每個組件都是一個完整但微型的應用程序,專注於根據單一責任原則生成單個業務任務。從GUI到數據庫或從服務API到數據庫,以便不同的GUI和客戶端應用程序可以重用相同的業務任務功能。每個微服務都有明確定義的接口和依賴關係(例如,對於其他微服務和外部資源),以便微服務可以相當獨立地運行。
微服務的宗旨:使得開發更高效。通過最大限度地減少人與人之間的溝通和協調它(少一些會議多一些開發等),以及減少變更範圍和風險來加速交付。
微服務架構的目標是將app組件彼此完全decouple/分離,以便可以維護、擴展等。微服務架構如下:
===========【SOA VS Microservices】================
· SOA/service-oriented architecture : Focus on reuse, technical integration issues, technical APIs
· Microservices: Focus on functionaldecomposition, business capabilities, business APIs
翻譯爲:
· SOA:專注於重用,技術集成問題,技術API
· 微服務:專注於功能分解,業務功能,業務API
=====【Key tenets of a microservices architecture】====
1) 大型整體結構分爲許多小型服務
· 每個服務都在自己的進程中運行
· 適用的雲規則是每個容器一服務
2)服務針對單個功能進行了優化
· 每項服務只有一個業務功能
· 單一責任原則:微服務應該只有一個改變的理由
3) 通過RESTAPI和消息代理進行通信
· 避免通過DB通信引入緊密耦合
4) 每個服務定義CI/CD(持續集成和持續部署)
· 服務以不同的速度發展
· 設置架構原則以指導系統進化發展
5) 每個服務定義HA(高可用性)和羣集決策
· 一種規模或擴展策略並不適合所有微服務
· 並非所有服務都需要擴展,其他微服務需要自動擴展到大數
===========【Monolithic VS Microservices】===========
/ |
Monolithic |
Microservice |
架構 |
以單個邏輯可執行文件構建 |
以一套小型服務構建 |
模塊化 |
基於語言功能 |
基於業務能力 |
敏捷度 |
更改涉及構建和部署整個應用程序的新版本 |
更改可以獨立應用於每個服務 |
擴展 |
當有一部分是瓶頸時,需要整個應用程序進行擴展。 |
每個服務在需要時獨立擴展 |
實現 |
通常全部由一種編程語言開發實現 |
每種服務都可以用不同的編程語言開發實現 |
可維護性 |
大型代碼庫對新開發人員是一種intimidating/威脅 |
較小的代碼庫更易於管理 |
部署 |
複雜部署,需要維護窗口和計劃停機時間。 |
簡單部署,因爲每個服務都可以單獨部署,停機時間最短。 |
微服務最大的要求是操作複雜性,因爲有更多的移動部件需要監控和管理,一個大型的業務需求有可能需要上千個應用程序,這就需要管理和監控上千個應用程序運行情況,這對企業來說是個巨大的挑戰。微服務存在的隱患:
· 微服務重視服務之間的重用獨立性,重用會產生依賴關係就會存在團隊之間的交互因此無法獨立工作。
· 獨立運行的部分越多,分佈式系統就會越成爲問題(網絡延遲、斷開連接、容錯、序列化);那麼找到bugEnd2End測試難度就會增加。
============= Microservice Advantages ==============
· 獨立開發,並對其他服務存在有限的、顯式的依賴
· 可以由一個所有團隊成員都理解整個代碼庫的小團隊開發
· 根據本團隊時間表開發,以便獨立於其他服務提供新版本
· 獨立擴展和失敗,可以隔離任何問題,不影響整個app
· 每種服務都可以用不同的語言開發實現
· 管理自己的數據以選擇最佳技術和架構