【讀書精華分享】《分佈式服務框架原理與實踐》李林鋒(華爲PaaS平臺架構師)著

【分享說明】:

我會花很多時間或淺或深的研讀一本書,然後總結一些提煉出來的精華,用簡短的語言,讓其他人能夠用很少的時間大致知道這本書能帶給自己的價值,如果適用自己,鼓勵買一本正本實體書細讀和收藏。

通篇會以原文目錄爲結構,給出提煉內容,如果不重要或者一看目錄就懂的,會保留目錄,有不明白的,以原文學習爲參照。

所有分享內容,爲了區分,會以》開頭,可能有多行縮進,或差異化顏色表示。


【書名】:《分佈式服務框架原理與實踐》李林鋒(華爲PaaS平臺架構師)著

【發行】:2016年

【適用】:分佈式0基礎人員,希望強化實踐的,複雜服務平臺構建者,微服務方向,java更宜,不適用於用c++做定製化創造框架組件方向的(我個人在這個方向上,後文簡單過了一下),更偏基於各種已有組件,構建大型功能集成平臺。

【總結】:

1、書不是很長,章節非常多。前面從宏觀上講了需求目標和大體架構,後文分章節細分和實踐講解。

2、整體架構形態講解的很細緻到位,瞭解全面。

3、後面太長,有重複和冗餘,連續讀心累,最好後面章節邊實踐練習邊研討。

4、讀完之後視野有開拓的感覺,值得回味再讀一遍。

【章節總結】

1章應用框架演變講了從MVC、RPC、SOA到微服務框架的演變原因、特性和設計原則,深刻體會一下需求場景,有了框架的宏觀認識。

2章分佈式服務框架入門通過幾個常用的框架的分析,整體的講了分佈式設計的原理和組成組件。

3-9章圍繞各主要組件,詳細的講了設計考慮因素和一些具體實踐。

10-19章圍繞分佈式架構的一些特殊場景,詳細的講了設計考慮因素和一些具體實踐。

20章細節的講了微服務框架。

21章總結了分佈式設計實踐中遇到的一些其他方面的總結。


【正式分享】

1章應用架構演進1
1.1
傳統垂直應用架構2

LAMPMVC爲典型
1.1.1
垂直應用架構介紹2

》簡單說就是單線,上是訪問入口,最底層是數據存儲

》高負責時,通過上層分流(F5七層負載均衡或SLB)做分流,後面是對等邏輯部署(每個分流完全一致)
1.1.2
垂直應用架構面臨的挑戰4

1複雜應用維護成本高,效率低:一次編譯出錯全部重新打包

2團隊效率差,公共功能重複開發

3系統可靠性變差,雪崩效應,一個模塊故障,其他模塊壓力暴增

4維護和定製困難,代碼量增加導致

5新功能上線週期變長:測試周期長,功能無法獨立上線

》進化:一些公共功能抽以出來,提供api訪問,跨進程形成rpc調用
1.2RPC
架構6

》遠程調用框架
1.2.1RPC
框架原理6

4個核心技術點

1、遠程服務需要以某種形式提供服務調用相關信息

2、遠程代理對象:將本地調用封閉成遠程服務調用

3、通信

4、數據序列化
1.2.2
最簡單的RPC框架實現8
1.2.3
業界主流RPC框架14

》介紹4

      1FaceBook開發的ApacheThrift:高效完備,豐富的選擇

      2Hadoop子項目Avro-RPC:良好的定製化支持,傳輸和業務分離

      3caucho提供基於binary-RPCHessian:輕量簡單易用

      4google gRPC:高性能通用
1.2.4RPC
框架面臨的挑戰17

》負載均衡實現路由,隨着服務增加,單點壓力過大

》需要額外增加一個服務註冊中心,客戶端通過大量緩存路由來降壓

》隨着業務增多,服務關係複雜,啓動順序難以理清

》服用調用增大,質量問題突顯

》服務上線容易下線難

》進化:單純的RPC治理能力都不健全,需要通過服務框架+服務治理解決
1.3SOA
服務化架構18

》粗粒度鬆耦合的以服務爲中心的框架
1.3.1
面向服務設計的原則18

1、服務可複用

2、服務共享一個標準契約

3、服務是鬆耦合的,儘可能不依賴其他

4、服務是底層邏輯的抽象

5、服務是可組合可編排的:多個服務組合成一個新服務

6、服務是自治的,邏輯由服務控制,不依賴其他服務

7、服務是無狀態的

8、服務是可被自動發現

1.3.2服務治理19

》至少7條挑戰

1、分佈式框架下的服務調用性能

2、服務化框架如何支持線性擴展

3、如何實現高效、實時監控

4、大規模分佈式下的故障快速定界和定位

5、分佈下式海量日誌檢索、模糊查詢

6、服務的流控(業務流、事務)、超時控制、服務升降機(增刪設備)

7、服務的劃分原則,如何實現最大程度複用

8、更多……

SOA的治理

1、服務定義:對服務進行標識,與使用團隊協調確保滿足需求,避免重複工作

2、服務生命週期治理:計劃(未實現)、測試(不服務或有限服務)、運行(服務階段)、棄用(標識棄用,只減不加)、廢棄(下線,從注刪中心移除或標記移除)

3、服務版本治理

4、服務註冊中心

5、服務監控

6、運行期質量保證:限流、遷入和遷出、升降機、權重調節、服務超時控制

7、快速故障定界定位手段:1、日誌彙總索引2、事件跟蹤

8、服務安全:主要指服務權限
1.4
微服務架構21

》通過將功能分散到離散的各個服務中以實現對解決方案的解耦
1.4.1
什麼是微服務21

》主要特徵

1、原子服務,專注於一件事

2、高密度部署

3、敏捷交付

4、微自治
1.4.2
微服務架構對比SOA22

》兩者差異

1、拆分粒度不同:SOA粗,重點是異構服務化

2、服務依賴:微服務解耦,儘可能不依賴

3、服務規模不同:SOA打包爲主,微服務部署規模膨脹

4、服務治理:SOA靜態治理,微服務動態治理

5、微服務敏捷交付爲主,小團隊研發
1.5
總結23
2章分佈式服務框架入門25

》服務化改造的核心技術就是:分佈式服務框架
2.1
分佈式服務框架誕生背景26
2.1.1
應用從集中式走向分佈式26?

》儘可能拆分

      縱向拆分:按屬性不同分類處理

橫向拆分:按本質不同分塊處理,拆分公共等
2.1.2
亟需服務治理28
2.2
業界分佈式服務框架介紹29
2.2.1
阿里Dubbo30

》主要質量屬性

1、連通性:組件間長連接和緩存

2、健壯性:很多組件掛掉不影響服務

3、伸縮性:服務中心對等集羣、服務提供者無狀態

4、擴展性:插件設計+管道設計
2.2.2
淘寶HSF33

》框架總結

1、配置化開發,對業務代碼低侵入

2、插件管理系統

3、異步NIO(一種通信框架名稱)通信,多種序列化方式

4、靈活的路由能力

5、多協議地

6、多種服務治理策略
2.2.3
亞馬遜CoralService35

》特點總結

1、支持多協議

2、輕量級框架,非常容易與已有系統集成

3、配置化開發

4、與亞馬遜的其他基礎設施集成,實現DevOps
2.3
分佈式服務框架設計36
2.3.1
架構原理36

》通常抽象成3

1RPC層:本質是通信層,通信和序列化

2FilterChain層:本質是控制和框架層,負載均衡、統計、通知、重試等

3service層:業務對接層

》功能上看核心:服務治理中心和服務註冊中心
2.3.2
功能特性37

》服務訂閱和發佈

配置化發佈和引用服務

服務自動發現機制

服務在線註冊和去註冊

》服務路由

默認提供隨機路由、輪循、權重路由等

粘滯鏈接:總向同一個提供方發請求,記憶功能

路由定製

》集羣容錯

Failover:失敗重試其他節點,讀操作或冪等性寫操作

Failback:失敗自動恢復,重試等,通常用於消息機制

Failfash:只發起一次調用,失敗立即報錯

》服務調用:同步、異步、並行

》多協議:私有協議、公有協議

》序列化:二進制、文本

》配置中心:本地靜態和配置中心動態
2.3.3
性能特性39

》高性能、低時延、性能線性增長(不隨着服務增大、負載增大而明顯增長)
2.3.4
可靠性39

》服務註冊中心

服務健康狀態檢測

故障切換

HA:高可用,全部掛掉不影響已存在服務

》清除單點狀態

服務無狀態:任意一臺宕掉不影響服務

服務集羣容錯:只要集羣還有1臺就正常

》鏈接健壯性

心跳檢測

斷連重連
2.3.5
服務治理40

》服務運行狀管控

服務路由:高峯修改路由導流

服務限流

服務遷入遷出:高峯遷出

服務降級:強制減用資源

服務超時控制:保持成功率

》服務監控

性能統計

統計報表

告警

》服務生命週期管理

上線審批

下線通知

服務灰度發佈

》故障快速定界定位

分佈式日誌採集

海量日誌在線檢索

調用鏈可視化展示

運行日誌故障定位

》服務安全

敏感服務的授權策略

鏈路安全:針對調用者,客戶端
2.4
總結41
3章通信框架42
3.1
關鍵技術點分析43
3.1.1
長連接還是短連接43

》通常是長連接,節約資源
3.1.2BIO
還是NIO43

BIO:同步阻塞模式 NIO:支持多路複用非阻塞
3.1.3
自研還是選擇開源NIO框架46

BIO有不足,開源經歷實踐,netty
3.2
功能設計47
3.2.1
服務端設計48

》重要設計原則

1、只提供上層api,不綁定具體協議

2、提供的api屏蔽底層通信細節

3、服務端功能不要求全,而是擴展性
3.2.2
客戶端設計50
3.3
可靠性設計53
3.3.1
鏈路有效性檢測54

ping-pong:發心跳,立即回,請求-迴應型

ping-ping:對等心跳,雙向心跳
3.3.2
斷連重連機制56
3.3.3
消息緩存重發57
3.3.4
資源優雅釋放58
3.4
性能設計59
3.4.1
性能差的三宗罪59

》罪一:網絡傳輸方式問題,同步通信壓力增大,通信變差

》罪二:序列化性能差

》罪三:線程模型問題導致開了大量線程
3.4.2
通信性能三原則60

》同步的3
3.4.3
高性能之道61
3.5
最佳實踐61
3.6
總結64
4章序列化與反序列化65

》跳過
4.1
幾個關鍵概念澄清66
4.1.1
序列化與通信框架的關係66
4.1.2
序列化與通信協議的關係66
4.1.3
是否需要支持多種序列化方式67
4.2
功能設計67
4.2.1
功能豐富度67
4.2.2
跨語言支持68
4.2.3
兼容性69
4.2.4
性能70
4.3
擴展性設計71
4.3.1
內置的序列化/反序列化功能類71
4.3.2
反序列化擴展72
4.3.3
序列化擴展75
4.4
最佳實踐77
4.4.1
接口的前向兼容性規範77
4.4.2
高併發下的穩定性78
4.5
總結78
5章協議棧79

》簡單過了一下
5.1
關鍵技術點分析80
5.1.1
是否必須支持多協議80
5.1.2
公有協議還是私有協議80
5.1.3
集成開源還是自研81
5.2
功能設計82
5.2.1
功能描述82
5.2.2
通信模型82
5.2.3
協議消息定義84
5.2.4
協議棧消息序列化支持的字段類型85
5.2.5
協議消息的序列化和反序列化86
5.2.6
鏈路創建89
5.2.7
鏈路關閉90
5.3
可靠性設計90
5.3.1
客戶端連接超時90
5.3.2
客戶端重連機制91
5.3.3
客戶端重複握手保護91

》禁止客戶端重複連接以避免客戶端異常消耗大量句柄
5.3.4
消息緩存重發92
5.3.5
心跳機制92
5.4
安全性設計92

IP白名單機制
5.5
最佳實踐協議的前向兼容性94
5.6
總結95
6章服務路由96

》簡單過一下
6.1
透明化路由97
6.1.1
基於服務註冊中心的訂閱發佈97
6.1.2
消費者緩存服務提供者地址98
6.2
負載均衡98
6.2.1
隨機98
6.2.2
輪循99
6.2.3
服務調用時延99
6.2.4
一致性哈希100
6.2.5
粘滯連接101

》長連接記錄狀態
6.3
本地路由優先策略102
6.3.1injvm
模式102

》優先尋找本jvm,用本地調用替換遠程調用
6.3.2innative
模式102

》優先尋找本機jvm,用本機調用替換遠程調用
6.4
路由規則103
6.4.1
條件路由規則103
6.4.2
腳本路由規則104
6.5
路由策略定製105
6.6
配置化路由106
6.7
最佳實踐——多機房路由107
6.8
總結108
第7章集羣容錯109
7.1
集羣容錯場景110
7.1.1
通信鏈路故障110
7.1.2
服務端超時111
7.1.3
服務端調用失敗111
7.2
容錯策略112
7.2.1
失敗自動切換(Failover112

》失敗重新回到路由入口
7.2.2
失敗通知(Failback113

》將失敗告訴調用者
7.2.3
失敗緩存(Failcache113

》失敗保存,等下次:週期性的、可預測恢復的、延時不敏感的、通知類的等
7.2.4
快速失敗(Failfast114

》高峯時非核心業務,就調用一次
7.2.5
容錯策略擴展114
7.3
總結115
8章服務調用116

》簡單看一下
8.1
幾個誤區117
8.1.1NIO
就是異步服務117
8.1.2
服務調用天生就是同步的118
8.1.3
異步服務調用性能更高120
8.2
服務調用方式120
8.2.1
同步服務調用120
8.2.2
異步服務調用121
8.2.3
並行服務調用125
8.2.4
泛化調用129
8.3
最佳實踐130
8.4
總結131
第9章服務註冊中心132

》簡單看一下
9.1
幾個概念133
9.1.1
服務提供者133
9.1.2
服務消費者133
9.1.3
服務註冊中心133
9.2
關鍵功能特性設計134
9.2.1
支持對等集羣135
9.2.2
提供CRUD接口136
9.2.3
安全加固136
9.2.4
訂閱發佈機制137
9.2.5
可靠性138
9.3
基於ZooKeeper的服務註冊中心設計139
9.3.1
服務訂閱發佈流程設計139
9.3.2
服務健康狀態檢測141
9.3.3
對等集羣防止單點故障142
9.3.4
變更通知機制144
9.4
總結144
10章服務發佈和引用145
10.1
服務發佈設計146
10.1.1
服務發佈的幾種方式146
10.1.2
本地實現類封裝成代理148
10.1.3
服務發佈成指定協議148
10.1.4
服務提供者信息註冊149
10.2
服務引用設計150
10.2.1
本地接口調用轉換成遠程服務調用150
10.2.2
服務地址本地緩存151
10.2.3
遠程服務調用151
10.3
最佳實踐152
10.3.1
對等設計原則152
10.3.2
啓動順序問題153

》不可控,需要支持亂序
10.3.3
同步還是異步發佈服務153

》集羣或啓動比較快,異步發佈是可以的(啓動成功,但還有未就緒的)
10.3.4
警惕網絡風暴154
10.3.5
配置擴展154
10.4
總結156
11章服務灰度發佈157
11.1
服務灰度發佈流程設計158
11.1.1
灰度環境準備158

》對灰度環境進行劃分、隔離和準備
11.1.2
灰度規則設置159
11.1.3
灰度規則下發160
11.1.4
灰度路由161
11.1.5
失敗回滾162
11.1.6
灰度發佈總結163
11.2
總結163
12章參數傳遞164
12.1
內部傳參165
12.1.1
業務內部參數傳遞165
12.1.2
服務框架內部參數傳遞168
12.2
外部傳參169
12.2.1
通信協議支持169
12.2.2
傳參接口定義170
12.3
最佳實踐171
12.3.1
防止參數互相覆蓋171

》沒有好辦法,系統可以預先定義聲明給業務方不要覆蓋
12.3.2
參數生命週期管理171

map無限追加,需要控制
12.4
總結172
13章服務多版本173

》簡單看一下,主要思路就是版本號管理
13.1
服務多版本管理設計174
13.1.1
服務版本號管理174
13.1.2
服務提供者175
13.1.3
服務消費者175
13.1.4
基於版本號的服務路由176
13.1.5
服務熱升級177
13.2
OSGi的對比178
13.2.1
模塊化開發179
13.2.2
插件熱部署和熱升級184
13.2.3
不使用OSGi的其他理由185
13.3
總結185
14章流量控制186

》簡單看一下
14.1
靜態流控187
14.1.1
傳統靜態流控設計方案187
14.1.2
傳統方案的缺點188
14.1.3
動態配額分配製188
14.1.4
動態配額申請制190
14.2
動態流控191
14.2.1
動態流控因子192
14.2.2
分級流控192
14.3
併發控制193
14.3.1
服務端全局控制193
14.3.2
服務消費者流控194
14.4
連接控制195
14.4.1
服務端連接數流控195
14.4.2
服務消費者連接數流控195
14.5
併發和連接控制算法195
14.6
總結197
15章服務降級198

》跳過
15.1
屏蔽降級199
15.1.1
屏蔽降級的流程199
15.1.2
屏蔽降級的設計實現200
15.2
容錯降級202
15.2.1
容錯降級的工作原理202
15.2.2
運行時容錯降級204
15.3
業務層降級205
15.4
總結205
16章服務優先級調度207

》跳過
16.1
設置服務優先級208
16.2
線程調度器方案209
16.3Java
優先級隊列210
16.4
加權優先級隊列211
16.5
服務遷入遷出212
16.6
總結213
17章服務治理214

》跳過
17.1
服務治理技術的歷史變遷215
17.1.1SOAGovernance215

17.1.2分佈式服務框架服務治理217
17.1.3AWS
雲端微服務治理217
17.2
應用服務化後面臨的挑戰218
17.2.1
跨團隊協作問題219
17.2.2
服務的上下線管控220
17.2.3
服務安全220
17.2.4
服務SLA保障221
17.2.5
故障快速定界定位221
17.3
服務治理222
17.3.1
服務治理架構設計223
17.3.2
運行態服務治理功能設計225
17.3.3
線下服務治理232
17.3.4
安全和權限管理234
17.4
總結237
18章分佈式消息跟蹤239

》跳過
18.1
業務場景分析240
18.1.1
故障的快速定界定位240
18.1.2
調用路徑分析241
18.1.3
調用來源和去向分析242
18.2
分佈式消息跟蹤系統設計242
18.2.1
系統架構243
18.2.2
埋點日誌244
18.2.3
採樣率247
18.2.4
採集和存儲埋點日誌248
18.2.5
計算和展示249
18.2.6
調用鏈擴展251
18.3
總結251
19章可靠性設計253

》簡單看一下,主要策略就是隔離分散風險
19.1
服務狀態檢測254
19.1.1
基於服務註冊中心狀態檢測254
19.1.2
鏈路有效性狀態檢測機制255
19.2
服務健康度檢測256
19.3
服務故障隔離257
19.3.1
進程級故障隔離257
19.3.2VM
級故障隔離259
19.3.3
物理機故障隔離260
19.3.4
機房故障隔離261
19.4
其他可靠性特性262
19.4.1
服務註冊中心262
19.4.2
監控中心262
19.4.3
服務提供者262
19.5
總結263
20章微服務架構264

》簡單看一下
20.1
微服務架構產生的歷史背景265
20.1.1
研發成本挑戰265
20.1.2
運維成本高267
20.1.3
新需求上線週期長268
20.2
微服務架構帶來的改變268
20.2.1
應用解耦268
20.2.2
分而治之270
20.2.3
敏捷交付271
20.3
微服務架構解析271
20.3.1
微服務劃分原則272
20.3.2
開發微服務272
20.3.3
基於Docker容器部署微服務274
20.3.4
治理和運維微服務277
20.3.5
特點總結278
20.4
總結279
21章服務化最佳實踐280
21.1
性能和時延問題281
21.1.1RPC
框架高性能設計281
21.1.2
業務最佳實踐285
21.2
事務一致性問題286
21.2.1
分佈式事務設計方案287

》盡力避免,因爲性能取決於最慢的

》分階段處理:先通用準備、都準備好了通用處理、失敗通知回滾
21.2.2
分佈式事務優化288

》選擇一箇中間人
21.3
研發團隊協作問題289
21.3.1
共用服務註冊中心290
21.3.2
直連提供者290
21.3.3
多團隊進度協同291
21.3.4
服務降級和Mock測試291
21.3.5
協同調試問題292
21.3.6
接口前向兼容性292
21.4
總結292


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章