微服務架構的演變

微服務是一種服務間鬆耦合的、每個服務之間高度自治並且使用輕量級協議進行通訊的可持續整合部署的分散式架構體系。這一句包含了微服務的特點,微服務架構和其他架構有什麼區別?以下對比一些常見的架構。

單體架構

單體架構是最簡單的軟體架構,常用於傳統的應用軟體開發以及傳統Web應用。傳統Web應用,一般是將所有功能模組都打包(jar,war)在一個Web容器(JBoss、Tomcate)中部署、執行。隨著業務複雜度增加、技術團隊規模擴大。在一個單體應用中維護程式碼,會降低開發效率。即使是處理一個小需求,也需要將所有機器上的應用全部部署一遍,增加了運維的複雜度。

SOA架構

當某一天使用單體架構發現很難推進需求的開發、以及日積月累的技術債,很多企業會開始做單體服務的拆分。拆分的方式一般有水平拆分以及垂直拆分。垂直拆分把一個應用拆成鬆耦合的多個獨立的應用,讓應用可以獨立部署,有獨立的團隊進行維護。水平拆分把一些通用的,會被很多上層服務呼叫的模組獨立拆分出去,形成一個共享的基礎服務,這樣拆分可以對一些效能瓶頸的應用進行單獨的優化和運維管理,也一定程度防止了垂直拆分的重複造輪子。
SOA也叫面向服務的架構,從單體服務到SOA的演進,需要結合水平拆分以及垂直拆分。SOA強呼叫統一的協議進行服務間的通訊,服務間執行在彼此獨立的硬體平臺但是需通過統一的協議介面相互協作,也即將應用系統服務化。舉個易懂的例子,單體服務如果相當於一個快餐店,所有的服務員都是一樣的,又要負責收銀結算,又要負責做漢堡,又要負責端盤子,又要負責打掃,服務員之間不需要有交流,一個使用者來了一個服務員從前到後負責到底。SOA相當於讓服務員有職責分工,收銀員負責收銀,廚師負責做漢堡,保潔阿姨負責打掃等等。所有服務員需要同一種語言交流,方便工作協調。

微服務和SOA

微服務也是一種服務化,不過其和SOA架構的服務化概念也是有區別的。可以從幾個關鍵字來理解:

  1. 鬆耦合: 每個微服務內部都可以使用DDD(領域驅動設計)的思想進行設計領域模型,服務間儘量減少同步的呼叫,多使用訊息的方式讓服務間的領域事件來進行解耦。
  2. 輕量級協議:Dubbo是SOA的開源的標準實現之一,類似的還有像gRPC、Thrift等。微服務更傾向於使用Restful風格的API,輕量級的協議可以很好得支援跨語言開發的服務,可能有的微服務用Java實現,有的用Go語言,有的用C++,但所有的語言都可以支援Http協議通訊,所有的開發人員都能理解Restful風格API的含義。
  3. 高度自治和持續整合:從底層的角度來說,SOA更加傾向於基於虛擬機器或者伺服器的部署,每個應用都部署在不同的機器上,一般持續整合工具更多是由運維團隊寫一些shell指令碼以及提供基於共同協議(比如dubbo管理頁面)的開發部署頁面。微服務可以很好得和容器技術結合,容器技術比微服務出現得晚,但是容器技術的出現讓微服務的實施更加簡便。目前Docker已經成為很多微服務實踐的基礎容器。因為容器的特色,所以一臺機器上可以部署幾十個幾百個不同的微服務。如果某個微服務流量壓力比其他微服務大,可以在不增加機器的情況,在一臺機器上多分配一些該微服務的容器例項。同時,因為Docker的容器編排社群日漸成熟,類似Mesos,Kubernetes以及Docker官方提供的swarm都可以作為持續整合部署的技術選擇。

其實從架構的演進的角度來看,整體的演進都是朝著越來越輕量級,越來越靈活的應用方向。甚至到近兩年日漸成熟起來的Serverless(無服務)架構。從單體服務到分層的服務,再到面向服務、再到微服務甚至無服務。對於架構的挑戰是越來越大的。

微服務架構和分散式

微服務架構屬於分散式系統嗎?答案是肯定的。微服務和SOA都是典型的分散式架構,只不過微服務的部署粒度更細,服務擴充套件更靈活。

理解微服務中的分散式

微服務的分散式不僅僅是容器應用層面的分散式,其為了高度自治,底層的儲存體系也應該互相獨立。並且也不是所有的微服務都需要持久化的儲存服務。一個“手機驗證碼”微服務可能底層儲存只用一個Redis。一個“營銷活動搭建頁面”微服務可能底層儲存只需要一個MongoDB。

微服務中的分散式場景除了服務本身需要有服務發現、負載均衡。微服務依賴的底層儲存也會有分散式的場景: 為了高可用性和效能需要處理資料庫的複製、分割槽。並且儲存的分庫情況下,微服務需要能保證分散式事務的一致性。

分散式微服務架構體系詳解

微服務架構的技術體系、社群目前已經越來越成熟,所以在初期選擇使用或者企業技術體系轉型微服務的時候,需要了解微服務架構中的分散式的問題:

  • 在所有服務都是更小單元的部署結構時,一個請求需要調動更多的服務資源,怎樣獲得更好的效能?
  • 當業務規模增大,需要有地理分佈不同的微服務叢集時,其底層的資料儲存叢集是多資料中心還是單資料叢集?
  • 資料儲存如何進行資料複製?
  • 業務資料達到大資料量時怎樣進行資料的分割槽?
  • 分散式事務怎樣保證一致性?
  • 不同程度的一致性有什麼差別?
  • 基於容器技術的服務發現怎麼處理?
  • 應該用哪些 RPC 技術,用哪些分散式訊息佇列來完成服務通訊和解耦?
  • 那麼多的分散式技術框架、演算法、服務應該選哪個才適合企業的業務場景?

本課程結合自己創業三年來對於微服務的實踐,以及在阿里對於分散式架構的積累。從微服務不得不面對和解決的分散式問題出發,包含分散式技術的一系列理論以及架構模型、演算法的介紹,同時結合技術選型和實踐應用,提供一系列解決方案的梳理。
相信閱讀完整個課程,你會對微服務的分散式問題有個系統地理解。本課程會對微服務的分散式場景問題一一擊破,為你提供解決思路。

課程主要內容

微服務架構下的分散式場景及方案——分散式系統的問題

  • 引出分散式系統的可能問題:節點故障、網路延遲,結合錯誤檢測的可行方案進行介紹
  • 分散式中的時間和順序的問題,以及標量時鐘和向量時鐘的實現

微服務架構下的分散式場景及方案——分散式資料儲存

  • 分散式資料儲存的技術選型、關係型資料庫以及一些流行的Nosql技術介紹(MongoDB、Redis、Neo4j以及Cassandra等)
  • 分散式儲存技術使用的資料結構,瞭解底層資料儲存原理(HashTable、SSTable、LSMTree、BTree等)
  • 各個儲存方案使用的場景以及對比

微服務架構下的分散式場景及方案——資料複製

  • 對於大規模儲存叢集,需要進行資料庫的複製,排除單點故障
  • 資料複製的模型和實現以及幾種複製日誌的實現方式
  • 主備同步、主主複製、多資料中心的資料複製方案
  • 資料複製中的讀寫一致性問題以及寫衝突問題的解決
  • 介紹以Mysql為例延伸叢集資料複製方案

微服務架構下的分散式場景及方案——資料分割槽

  • 當單個領域模型維度的資料已經到一定規模時,需要進行資料分割槽,減輕單庫壓力。資料分割槽和分表又有哪些不同?資料分割槽可以如何實現?
  • 以Mysql的分割槽策略為例介紹不同分割槽策略的實現。
  • 資料分割槽後,請求的路由有哪些解決方案?會展開介紹不同的方案又有什麼差別。

微服務架構下的分散式場景及方案——服務發現和服務通訊

  • 基於容器技術的微服務體系,怎樣選擇服務發現、負載均衡的技術實現?不同的服務發現的技術有什麼區別,如何選型?
  • 為了達到鬆耦合的目的以及基於DDD思想,微服務之間減少服務呼叫可以通過哪些技術實現?API gateway可以用哪些技術框架實現?遠端呼叫可以有哪些技術框架?怎樣提高同步通訊的效能?
  • 分散式的訊息佇列都有哪些開源、商業實現?應該怎樣選擇適合的訊息佇列?
  • 使用DDD思想應該如何應對服務通訊,如何在實踐中應用DDD?

微服務架構下的分散式場景及方案——分散式儲存叢集的事務

  • 理解分散式中的事務以及本地事務的基礎概念
  • 分散式儲存的隔離級別以及各個DB支援的隔離方案的實現原理
  • 以Mysql InnoDB中的 MVCC 為例看併發控制的在Mysql的實現,學習儲存系統對於分散式事務的實現思想。

分散式微服務架構體系詳——分散式一致性

  • 瞭解分散式系統的一致性有哪些問題以及一致性的幾種實現程度的模型:線性一致性(強一致性)、順序一致性及因果一致性、最終一致性
  • 分散式一致性相關的理論CAP(CA、CP、AP 的相關演算法)的介紹以及適合用於哪些實踐。
  • 介紹FLP不可能結果,以及BASE理論

微服務架構下的分散式場景及方案——分散式事務實踐

  • 瞭解微服務中分散式事務的問題
  • 介紹強一致性的實踐:二階段、三階段。2PC,3PC的優缺點和限制,XA協議的介紹和實踐方案,以及最終一致性實踐:TCC模型和實踐方案
  • 分散式鎖的實現模型和實踐方案
  • 基於微服務下的分散式事務實踐案例分析

微服務架構下的分散式場景及方案——共識問題

  • 瞭解為什麼分散式場景下有共識問題
  • 介紹共識演算法和全域性訊息廣播的實現。公式演算法的基礎:leader選舉和quorum演算法,以及一些已實現的演算法的介紹和對比:VSR ,Raft,Paxos,ZAB
  • 共識演算法在微服務體系的應用場景介紹:服務發現、一致性kv儲存(Etcd,Zk)。以及,技術的選型如何權衡一致性的追求和效能。

微服務架構下的分散式場景及方案——架構設計

  • 瞭解了很多分散式的問題和解決方案之後,迴歸微服務架構模型、技術選型、再回顧下微服務的弊端和特點
  • 微服務體系的架構要素分析:安全、伸縮性、效能、可用性、擴充套件性
  • 結合團隊、業務場景的DDD實踐和總結

重點重點:為了方便初學者理解微服務實踐,以及掌握怎樣在微服務中使用 DDD(Domain-Driven Design)思想,在本課程第 05 課中講解了 Demo 示例,該示例是基於 SpringBoot、SpringCloud-Eureka 技術寫的。
Github 上的原始碼地址:

分散式微服務架構體系詳解