程式設計體系結構(09):分散式系統架構
阿新 • • 發佈:2020-10-16
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile) || [GitEE·點這裡](https://gitee.com/cicadasmile)
# 一、基礎概念
![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201016114454204-77705876.png)
**1、單服務**
所有業務服務和應用元件部署在一臺服務上,節省成本,這是單服務結構,適用於併發低,業務單一的場景。
**2、叢集模式**
業務量逐漸增大,併發高,把一臺服務進行水平擴充套件,做一個服務群,請求壓力分散到不同的服務上處理,每臺服務稱為叢集的一個節點,到這就是叢集服務。
**3、分散式架構**
分散式結構就是按照業務功能,拆分成獨立的子服務,獨立的庫表,可以獨立執行,且服務之間通訊和互動,帶來的好處降低業務間的耦合度,方便開發維護,水平擴充套件,複用性高等等。
**4、技術體系**
服務基礎架構:Dubbo框架,SpringCloud框架;
容器化運維:Docker、Kubernetes;
資料儲存:關係型MySQL,NoSQL資料庫,OLAP引擎;
常用元件:Zookeeper協調,MQ非同步,Redis快取;
# 二、分散式框架
**1、Dubbo框架**
垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提高業務複用及整合的分散式服務框架(RPC)是關鍵。Dubbo框架的核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。
**2、SpringCloud框架**
分散式架構下最成熟的框架,SpringCloud是一系列框架的有序集合。它利用SpringBoot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用SpringBoot的開發風格做到一鍵啟動和部署。
![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201016114516611-1794276998.png)
```
https://github.com/cicadasmile/spring-cloud-base
```
**核心元件**
註冊中心:具備服務發現、服務記錄、查詢、動態管理的機制。常用的註冊中心,Zookeeper、Eureka、Consul、Nacos等。
熔斷降級:限制流量突然高併發沖垮系統,使這類報文以比較均勻的速度流動傳送,達到保護系統相對穩定的目的。常用演算法令牌桶、漏斗;常用元件Nginx、CDN、Hystrix、Sentinel,通過不同節點控制流量。
服務閘道器:在整個架構體系上也是一個服務,作為請求的唯一入口,與外觀模式十分類似,在閘道器層處理所有的非業務功能,為客戶端提供定製的API。常用元件Zuul、Tyk、Kong。
![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201016114528358-1977803969.png)
```
https://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、分散式事務**
不同的服務不同資料庫的多個細節操作組成,這些無感知的細節操作分佈在不同服務上,甚至屬於不同的地區和應用,事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點,如何保證這些操作全部成功或者全部失敗,即保證不同資料庫間的資料一致性,這就是分散式事務需要解決的核心問題。
![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201016114542539-863143594.png)
```
https://github.com/cicadasmile/data-manage-parent
```
# 四、資料來源元件
**1、關係型資料庫**
採用了關係模型來組織資料的資料庫,其以行和列的形式儲存資料,例如MySQL、Oracle。在分散式系統下,為了保證核心流程的穩定性,在關鍵業務上基本都採用關係型資料庫,當業務完成後,如果資料量大,會把資料同步到其他查詢效能高元件中。
**2、NoSQL資料庫**
NoSQL意即"不僅僅是SQL"。對不同於傳統的關係型資料庫的資料庫管理系統的統稱。NoSQL用於超大規模資料的儲存。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。例如MongoDB、Cassandra等。
**3、資料管理策略**
讀寫庫分離、查詢資料分庫分表、分散式下業務分庫、基於使用者流量分庫。
![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201016114555179-222071566.png)
```
https://github.com/cicadasmile/data-manage-parent
```
# 五、服務監控
**1、生產故障**
在分散式的複雜架構下,應用服務、軟體服務、硬體服務,任何層面出問題都可能導致請求不能完整執行,引發一系列效應,做好全鏈路的監控,快速定位問題是非常關鍵的。
**2、應用層監控**
應用層為開發的業務邏輯服務,也是最容易突發問題的一個層面,通常從請求流量、服務鏈路熔斷、系統異常日誌幾個方面做監控指標,觀察系統是否穩定。
**3、軟體層監控**
這裡通常指,資料庫層面,例如Druid的監控分析;常用中介軟體,例如RocketMQ的控制檯;Redis快取:提供命令獲取相關監控資料等。
**4、硬體層監控**
硬體層面,關注的三大核心內容:CPU、記憶體、網路。底層硬體資源爆發的故障,來自上層的應用服務或者中介軟體服務觸發的可能性偏高。成熟的監控框架,例如zabbix,grafana等。
# 六、原始碼地址
```
GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile
```
**推薦閱讀:程式設計體系整理**
|序號|專案名稱|GitHub地址|GitEE地址|推薦指數|
|:---|:---|:---|:---|:---|
|01|Java描述設計模式,演算法,資料結構|[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent)|☆☆☆☆☆|
|02|Java基礎、併發、面向物件、Web開發|[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent)|☆☆☆☆|
|03|SpringCloud微服務基礎元件案例詳解|[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base)|☆☆☆|
|04|SpringCloud微服務架構實戰綜合案例|[GitHub·點這裡](https://github.com/cicadasmile/husky-spring-cloud)|[GitEE·點這裡](https://gitee.com/cicadasmile/husky-spring-cloud)|☆☆☆☆☆|
|05|SpringBoot框架基礎應用入門到進階|[GitHub·點這裡](https://github.com/cicadasmile/spring-boot-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-boot-base)|☆☆☆☆|
|06|SpringBoot框架整合開發常用中介軟體|[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent)|☆☆☆☆☆|
|07|資料管理、分散式、架構設計基礎案例|[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent)|☆☆☆☆☆|
|08|大資料系列、儲存、元件、計算等框架|[GitHub·點這裡](https://github.com/cicadasmile/big-data-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/big-data-parent)|☆☆☆☆☆|