編程體系結構(09):分散式系統架構
本文源碼:GitHub·點這裡 || GitEE·點這裡
一、基礎概念
1、單服務
所有業務服務和應用組件部署在一台服務上,節省成本,這是單服務結構,適用於並發低,業務單一的場景。
2、集群模式
業務量逐漸增大,並發高,把一台服務進行水平擴展,做一個服務群,請求壓力分散到不同的服務上處理,每台服務稱為集群的一個節點,到這就是集群服務。
3、分散式架構
分散式結構就是按照業務功能,拆分成獨立的子服務,獨立的庫表,可以獨立運行,且服務之間通訊和交互,帶來的好處降低業務間的耦合度,方便開發維護,水平擴展,復用性高等等。
4、技術體系
服務基礎架構:Dubbo框架,SpringCloud框架;
容器化運維:Docker、Kubernetes;
數據存儲:關係型MySQL,NoSQL資料庫,OLAP引擎;
常用組件:Zookeeper協調,MQ非同步,Redis快取;
二、分散式框架
1、Dubbo框架
垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務復用及整合的分散式服務框架(RPC)是關鍵。Dubbo框架的核心能力:面向介面的遠程方法調用,智慧容錯和負載均衡,以及服務自動註冊和發現。
2、SpringCloud框架
分散式架構下最成熟的框架,SpringCloud是一系列框架的有序集合。它利用SpringBoot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、消息匯流排、負載均衡、斷路器、數據監控等,都可以用SpringBoot的開發風格做到一鍵啟動和部署。
//github.com/cicadasmile/spring-cloud-base
核心組件
註冊中心:具備服務發現、服務記錄、查詢、動態管理的機制。常用的註冊中心,Zookeeper、Eureka、Consul、Nacos等。
熔斷降級:限制流量突然高並發衝垮系統,使這類報文以比較均勻的速度流動發送,達到保護系統相對穩定的目的。常用演算法令牌桶、漏斗;常用組件Nginx、CDN、Hystrix、Sentinel,通過不同節點控制流量。
服務網關:在整個架構體系上也是一個服務,作為請求的唯一入口,與外觀模式十分類似,在網關層處理所有的非業務功能,為客戶端提供訂製的API。常用組件Zuul、Tyk、Kong。
//github.com/cicadasmile/husky-spring-cloud
3、業務型組件
消息中間件:RocktMQ、Kafka、RabbitMQ等;
快取中間件:Redis、Eache等;
分散式事務:Seata、Hmily、TCC-transaction等;
三、架構細節
1、全局ID策略
業務場景產生的數據,都需要一個唯一ID作為核心標識,用來流程化管理。比如常見的:UUID、雪花演算法、自增主鍵、ID容器等。
2、介面冪等性
冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。就是說,一次和多次請求某一個資源會產生同樣的作用影響。在介面、重試、補償的場景下尤其要保證操作的冪等性。
3、快取處理
業務系統中,查詢時最容易出現性能問題的模組,查詢面對的數據量大,篩選條件複雜,所以在系統架構中引入快取層,則是非常必要的,用來快取熱點數據、歸檔數據、首頁查詢等,達到快速響應的目的。
4、非同步處理流程
非同步是一種設計理念,非同步操作不等於多執行緒,MQ中間件,或者消息廣播,這些是可以實現非同步處理的方式,非同步處理不用阻塞當前執行緒來等待處理完成,而是允許後續操作,直至其它執行緒將處理完成,並回調通知此執行緒。
5、高並發與資源鎖
高並發業務核心還是流量控制,控制流量下沉速度,或者控制承接流量的容器大小,多餘的直接溢出,這是相對複雜的流程。一方面可以通過流量整形的方式解決請求量,另一方面可以通過加鎖解決並發訪問資源的問題。
6、分散式事務
不同的服務不同資料庫的多個細節操作組成,這些無感知的細節操作分布在不同服務上,甚至屬於不同的地區和應用,事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點,如何保證這些操作全部成功或者全部失敗,即保證不同資料庫間的數據一致性,這就是分散式事務需要解決的核心問題。
//github.com/cicadasmile/data-manage-parent
四、數據源組件
1、關係型資料庫
採用了關係模型來組織數據的資料庫,其以行和列的形式存儲數據,例如MySQL、Oracle。在分散式系統下,為了保證核心流程的穩定性,在關鍵業務上基本都採用關係型資料庫,當業務完成後,如果數據量大,會把數據同步到其他查詢性能高組件中。
2、NoSQL資料庫
NoSQL意即”不僅僅是SQL”。對不同於傳統的關係型資料庫的資料庫管理系統的統稱。NoSQL用於超大規模數據的存儲。這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。例如MongoDB、Cassandra等。
3、數據管理策略
讀寫庫分離、查詢數據分庫分表、分散式下業務分庫、基於用戶流量分庫。
//github.com/cicadasmile/data-manage-parent
五、服務監控
1、生產故障
在分散式的複雜架構下,應用服務、軟體服務、硬體服務,任何層面出問題都可能導致請求不能完整執行,引發一系列效應,做好全鏈路的監控,快速定位問題是非常關鍵的。
2、應用層監控
應用層為開發的業務邏輯服務,也是最容易突發問題的一個層面,通常從請求流量、服務鏈路熔斷、系統異常日誌幾個方面做監控指標,觀察系統是否穩定。
3、軟體層監控
這裡通常指,資料庫層面,例如Druid的監控分析;常用中間件,例如RocketMQ的控制台;Redis快取:提供命令獲取相關監控數據等。
4、硬體層監控
硬體層面,關注的三大核心內容:CPU、記憶體、網路。底層硬體資源爆發的故障,來自上層的應用服務或者中間件服務觸發的可能性偏高。成熟的監控框架,例如zabbix,grafana等。
六、源程式碼地址
GitHub·地址
//github.com/cicadasmile
GitEE·地址
//gitee.com/cicadasmile
推薦閱讀:編程體系整理
序號 | 項目名稱 | GitHub地址 | GitEE地址 | 推薦指數 |
---|---|---|---|---|
01 | Java描述設計模式,演算法,數據結構 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
02 | Java基礎、並發、面向對象、Web開發 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆ |
03 | SpringCloud微服務基礎組件案例詳解 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆ |
04 | SpringCloud微服務架構實戰綜合案例 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
05 | SpringBoot框架基礎應用入門到進階 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆ |
06 | SpringBoot框架整合開發常用中間件 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
07 | 數據管理、分散式、架構設計基礎案例 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |
08 | 大數據系列、存儲、組件、計算等框架 | GitHub·點這裡 | GitEE·點這裡 | ☆☆☆☆☆ |