這是一本從架構(gòu)視角講解如何構(gòu)建大型分布式系統(tǒng)的著作,是超級暢銷書《深入理解Java虛擬機(jī)》的作者周志明多年架構(gòu)和研發(fā)經(jīng)驗的總結(jié),得到了多位行業(yè)資深架構(gòu)專家的聯(lián)袂推薦。
全書共16章,分為演進(jìn)中的架構(gòu)、架構(gòu)師的視角、分布式的基石、不可變基礎(chǔ)設(shè)施和技術(shù)方法論五部分。
●第①部分 演進(jìn)中的架構(gòu)(第1章)
著重介紹了軟件開發(fā)歷史中多種主流架構(gòu)風(fēng)格出現(xiàn)的契機(jī)、解決的問題以及帶來的新缺陷。
●第②部分 架構(gòu)師的視角(第2~5章)
總結(jié)了一名架構(gòu)師應(yīng)該在架構(gòu)設(shè)計時思考哪些問題,有哪些主流的解決方案和行業(yè)標(biāo)準(zhǔn)做法,各種方案有什么優(yōu)缺點(diǎn),不同的解決方法會帶來什么不同的影響,等等。
●第③部分 分布式的基石(第6~10章)
重點(diǎn)討論了不同架構(gòu)風(fēng)格是應(yīng)該在技術(shù)規(guī)范上統(tǒng)一,還是由應(yīng)用系統(tǒng)自行解決這個問題,給出了解決思路、方法和常見工具。
●第④部分 不可變基礎(chǔ)設(shè)施(第11~15章)
重點(diǎn)講解了基礎(chǔ)設(shè)施不變性的目的、原理與實現(xiàn)途徑,包括虛擬化容器、容器間網(wǎng)絡(luò)、持久化存儲、資源與調(diào)度、服務(wù)網(wǎng)格等內(nèi)容。
●第⑤部分 技術(shù)方法論(第16章)
面向技術(shù)決策者集中討論了與分布式、微服務(wù)、架構(gòu)等相關(guān)的理論話題,將解決問題的能力歸納、總結(jié)、升華為方法論。
全書以實踐為導(dǎo)向,一個案例貫穿全書,同時給出了基于Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda 五種架構(gòu)風(fēng)格的樣例工程。
(1)作者權(quán)威:
《深入理解Java虛擬機(jī)》作者周志明新作,資深架構(gòu)專家,遠(yuǎn)光軟件研究院院長。
(2)9位專家推薦:
付曉巖(IBM副合伙人)、孫玄(奈學(xué)教育CEO)、鄭然(百度主任架構(gòu)師)、劉超(騰訊云T4解決方案專家)、潘新宇(集團(tuán)資深架構(gòu)師)等9位架構(gòu)專家聯(lián)袂推薦。
(3)5個維度全面講解:
從架構(gòu)演進(jìn)、架構(gòu)設(shè)計思維、分布式基石、不可變基礎(chǔ)設(shè)施、技術(shù)方法論5個維度全面探索如何構(gòu)建可靠的大型分布式系統(tǒng)。
(4)5種架構(gòu)風(fēng)格工程樣例:
同時給出了基于Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda 五種架構(gòu)風(fēng)格的樣例工程,代碼開源在GitHub上。
(5) 注重實戰(zhàn):
一個綜合案例貫穿全書,將本書的核心知識點(diǎn)以及作者的經(jīng)驗和思考融入其中。
(6) 關(guān)注華章計算機(jī),回復(fù)68391
獲取GitHub配套代碼工程項目地址
本書是一本以如何構(gòu)建一套可靠的大型分布式系統(tǒng)為敘述主線的技術(shù)手冊。筆者十多年來一直從事大型企業(yè)級軟件的架構(gòu)研發(fā)工作,較完整地經(jīng)歷了從早的大型單體系統(tǒng)到如今基于云原生基礎(chǔ)設(shè)施的架構(gòu)演變過程,希望借此機(jī)會,系統(tǒng)性地整理相關(guān)知識,查漏補(bǔ)缺,將它們都融入既有的知識框架之中,也希望能將這些知識與大家分享討論。筆者相信要深入理解一門技術(shù),不僅要去看、去讀、去想、去用,更要去說、去寫。將自己認(rèn)為掌握了的知識敘述出來,盡量將知識說得條理清晰,讓他人聽得明白,釋去心中疑惑,同時把自己的觀點(diǎn)交予別人審視,乃至質(zhì)疑,在此過程之中,自己也會挖掘出很多潛藏在已知背后的未知。
【如何閱讀本書】
本書一共分為演進(jìn)中的架構(gòu)、架構(gòu)師的視角、分布式的基石、不可變基礎(chǔ)設(shè)施和技術(shù)方法論五部分,每一部分都有相對明確的主題與目標(biāo),建議按順序閱讀各部分以獲得更有邏輯性的閱讀體驗。不過每部分內(nèi)各章節(jié)之間并沒有明顯的前后依賴關(guān)系,讀者從任何一個感興趣的章節(jié)開始閱讀都可以。
筆者并沒有假定本書的所有讀者都在架構(gòu)方面具備特別專業(yè)的技術(shù)水平,因此在講解各個知識點(diǎn)時,會力求在保證邏輯完整、描述準(zhǔn)確的前提下,盡量用通俗的語言和案例去講述架構(gòu)中與開發(fā)關(guān)系為密切的內(nèi)容。但本書的主題畢竟是軟件架構(gòu),這就不可避免地需要讀者有一定的技術(shù)基礎(chǔ)。本書依然主要面向中、高級程序員群體,一些常用的開發(fā)框架、類庫和語法等基礎(chǔ)知識點(diǎn),均假設(shè)讀者已有所了解。書中雖然會涉及這些工具、類庫、框架的使用案例,但本書并不是它們的操作指南,只是借助它們?nèi)ブv解技術(shù)原理。
學(xué)習(xí)任何知識都不應(yīng)該脫離實踐去空談理論。為了講清楚不同架構(gòu)風(fēng)格下的工程實現(xiàn)差異,也為了盡量少在書中貼代碼,將寶貴的版面空間節(jié)省出來,筆者在GitHub上分別建立了基于Spring Boot、Spring Cloud、Kubernetes、Istio和AWS Lambda的五種架構(gòu)風(fēng)格的樣例工程。如果你閱讀之前對架構(gòu)并沒有太深刻的理解,建議先閱讀一遍本書附錄A的內(nèi)容。如果你是一名駕駛初學(xué)者,合理的學(xué)習(xí)路徑應(yīng)該是先把汽車發(fā)動,然后慢慢行駛起來,而不是先從引擎動力原理變速箱構(gòu)造入手去深刻地了解一輛汽車。計算機(jī)技術(shù)也是同理,先從運(yùn)行程序開始,看看效果,搭建好開發(fā)、調(diào)試環(huán)境,對即將學(xué)習(xí)的內(nèi)容先有一個整體的認(rèn)知是很有好處的。
后,筆者再簡要介紹下本書每一部分的讀者對象、目標(biāo)和價值。
●部分 演進(jìn)中的架構(gòu)
這部分只有第1章,適合所有開發(fā)者,但尤其推薦剛剛從單體架構(gòu)向微服務(wù)架構(gòu)轉(zhuǎn)型的開發(fā)者閱讀。
部分既是全書的緒論,也是對后續(xù)將用到的大量名詞概念所做的鋪墊。這部分沒有談?wù)撨^于具體的技術(shù),只是著重介紹了軟件開發(fā)歷史中多種主流架構(gòu)出現(xiàn)的契機(jī)、解決的問題以及帶來的新缺陷。
●第二部分 架構(gòu)師的視角
這部分包括第2~5章,適合所有技術(shù)架構(gòu)師、系統(tǒng)設(shè)計與開發(fā)人員,主要討論與風(fēng)格無關(guān)的架構(gòu)知識。
架構(gòu)師這個詞的外延非常寬泛,不同語境中有不同含義。本書中的技術(shù)架構(gòu)師特指企業(yè)架構(gòu)中面向技術(shù)模型的系統(tǒng)設(shè)計者,這意味著討論范圍不會涉及貼近企業(yè)戰(zhàn)略、業(yè)務(wù)流程的系統(tǒng)分析、信息戰(zhàn)略設(shè)計等內(nèi)容,而是聚焦于貼近一線研發(fā)人員的技術(shù)方案設(shè)計者。這部分將介紹一名架構(gòu)師應(yīng)該在架構(gòu)設(shè)計時思考哪些問題,有哪些主流的解決方案和行業(yè)標(biāo)準(zhǔn)做法,各種方案有什么優(yōu)缺點(diǎn),不同的解決方法會帶來什么不同的影響,等等,以達(dá)到將架構(gòu)設(shè)計這種聽起來抽象的工作具體化、具象化的目的。
作為后續(xù)實踐的基礎(chǔ),第二部分的內(nèi)容與具體的架構(gòu)風(fēng)格無關(guān),討論的是普適的架構(gòu)技術(shù)與使用技巧。無論你是否關(guān)注微服務(wù)、云原生這些概念,無論你從事架構(gòu)設(shè)計還是編碼開發(fā),了解這里所列的基礎(chǔ)知識,都是有實用價值的。
●第三部分 分布式的基石
這部分包括第6~10章,主要面向使用分布式架構(gòu)的開發(fā)人員。
只要選擇了分布式架構(gòu),無論是SOA、微服務(wù)、服務(wù)網(wǎng)格或者其他架構(gòu)風(fēng)格,涉及與遠(yuǎn)程服務(wù)的交互時,服務(wù)的注冊發(fā)現(xiàn)、跟蹤治理、負(fù)載均衡、故障隔離、認(rèn)證授權(quán)、伸縮擴(kuò)展、傳輸通信、事務(wù)處理等一系列問題都是不可避免的。不同的架構(gòu)風(fēng)格,其區(qū)別是到底要在技術(shù)規(guī)范上提供統(tǒng)一的解決方案,由應(yīng)用系統(tǒng)自行解決,還是在基礎(chǔ)設(shè)施層面將這類問題隔離掉。第三部分將重點(diǎn)討論這類問題的解決思路、方法和常見工具。
●第四部分 不可變基礎(chǔ)設(shè)施
這部分包括第11~15章,主要面向基礎(chǔ)設(shè)施的運(yùn)維人員、技術(shù)平臺的開發(fā)人員。
不可變基礎(chǔ)設(shè)施這個概念由來已久。2012年Martin Fowler設(shè)想的鳳凰服務(wù)器一與2013年Chad Fowler正式提出的不可變基礎(chǔ)設(shè)施二,都闡明了基礎(chǔ)設(shè)施不變性帶來的益處。在云原生基金會(Cloud Native Computing Foundation,CNCF)所定義的云原生概念中,不可變基礎(chǔ)設(shè)施被提升到與微服務(wù)平級的重要程度,此時它已不再局限于方便運(yùn)維、程序升級和部署的手段,而是升華為向應(yīng)用代碼隱藏分布式架構(gòu)復(fù)雜度、讓分布式架構(gòu)得以成為一種可普遍推廣的普適架構(gòu)風(fēng)格的必要前提。在云原生時代、后微服務(wù)時代,軟件與硬件之間的界線已經(jīng)徹底模糊,無論是基礎(chǔ)設(shè)施的運(yùn)維人員,抑或是技術(shù)平臺的開發(fā)人員,都有必要深入理解基礎(chǔ)設(shè)施不變性的目的、原理與實現(xiàn)途徑。
●第五部分 技術(shù)方法論
這部分包括第16章,主要面向企業(yè)中重要技術(shù)的決策者。
本書的主體內(nèi)容是務(wù)實的,偏重具體技術(shù),而非方向理論。但在第16章會集中討論幾點(diǎn)與分布式、微服務(wù)、架構(gòu)等相關(guān)的相對務(wù)虛的話題。
筆者認(rèn)為,對于一個技術(shù)人員,成長的主要驅(qū)動力是實踐,是在開發(fā)程序、解決問題中增長知識,再將知識歸納、總結(jié)、升華成為理論,所以筆者將本章安排到全書的末尾,也是希望大家能先去實踐,再談理論。同時,筆者也認(rèn)為,對于一名研究人員或者企業(yè)中技術(shù)方向的決策者,理論與實踐都不可缺少,在涉及決策的場景中,成體系的理論知識甚至比實踐經(jīng)驗還要關(guān)鍵,因為執(zhí)行力再強(qiáng),也必須用在正確的方向上才有價值。如果你對自己的規(guī)劃是有朝一日從一名技術(shù)人員發(fā)展成研究或者管理人員,補(bǔ)充這部分知識是必不可少的。
周志明(博士)
人工智能與企業(yè)級研發(fā)資深專家,遠(yuǎn)光軟件研究院院長,阿里云MVP、騰訊云TVP、華為云MVP。在Java技術(shù)棧、微服務(wù)、云原生架構(gòu)等領(lǐng)域有深入研究。
開源技術(shù)的積極倡導(dǎo)者和推動者,QCon全球開發(fā)者大會明星講師、極客時間布道師、InfoQ.CN專欄撰稿人,作為組織者或主講人,參與了多場線上、線下的技術(shù)布道活動。
計算機(jī)技術(shù)作家,十年間出版過八部技術(shù)專著,口碑和銷量均得到業(yè)內(nèi)認(rèn)可,其中四本書在豆瓣上獲得了9.0分或以上的評價。如知名暢銷書《深入理解Java虛擬機(jī):JVM高級特性與實踐》目前已經(jīng)出至第3版,累計印刷超過50次,仍長銷不衰,是中文計算機(jī)圖書領(lǐng)域公認(rèn)的、難得一見的佳作。
【部分 演進(jìn)中的架構(gòu)】
●第1章 服務(wù)架構(gòu)演進(jìn)史2
1.1 原始分布式時代2
1.2 單體系統(tǒng)時代5
1.3 SOA時代8
1.4 微服務(wù)時代12
1.5 后微服務(wù)時代16
1.6 無服務(wù)時代19
【第二部分 架構(gòu)師的視角】
●第2章 訪問遠(yuǎn)程服務(wù)24
2.1 遠(yuǎn)程服務(wù)調(diào)用24
2.1.1 進(jìn)程間通信24
2.1.2 通信的成本26
2.1.3 三個基本問題28
2.1.4 統(tǒng)一的RPC30
2.1.5 分裂的RPC32
2.2 REST設(shè)計風(fēng)格34
2.2.1 理解REST35
2.2.2 RESTful的系統(tǒng)37
2.2.3 RMM41
2.2.4 不足與爭議45
●第3章 事務(wù)處理48
3.1 本地事務(wù)49
3.1.1 實現(xiàn)原子性和持久性50
3.1.2 實現(xiàn)隔離性54
3.2 全局事務(wù)57
3.3 共享事務(wù)62
3.4 分布式事務(wù)64
3.4.1 CAP與ACID64
3.4.2 可靠事件隊列67
3.4.3 TCC事務(wù)69
3.4.4 SAGA事務(wù)72
●第4章 透明多級分流系統(tǒng)75
4.1 客戶端緩存76
4.1.1 強(qiáng)制緩存77
4.1.2 協(xié)商緩存79
4.2 域名解析81
4.3 傳輸鏈路83
4.3.1 連接數(shù)優(yōu)化84
4.3.2 傳輸壓縮88
4.3.3 快速UDP網(wǎng)絡(luò)連接90
4.4 內(nèi)容分發(fā)網(wǎng)絡(luò)92
4.4.1 路由解析92
4.4.2 內(nèi)容分發(fā)95
4.4.3 CDN應(yīng)用96
4.5 負(fù)載均衡97
4.5.1 數(shù)據(jù)鏈路層負(fù)載均衡99
4.5.2 網(wǎng)絡(luò)層負(fù)載均衡101
4.5.3 應(yīng)用層負(fù)載均衡104
4.5.4 均衡策略與實現(xiàn)106
4.6 服務(wù)端緩存107
4.6.1 緩存屬性108
4.6.2 緩存風(fēng)險117
●第5章 架構(gòu)安全性120
5.1 認(rèn)證121
5.1.1 認(rèn)證的標(biāo)準(zhǔn)121
5.1.2 認(rèn)證的實現(xiàn)128
5.2 授權(quán)129
5.2.1 RBAC130
5.2.2 OAuth 2133
5.3 憑證140
5.3.1 Cookie-Session140
5.3.2 JWT142
5.4 保密147
5.4.1 保密的強(qiáng)度147
5.4.2 客戶端加密148
5.4.3 密碼存儲和驗證149
5.5 傳輸151
5.5.1 摘要、加密與簽名151
5.5.2 數(shù)字證書154
5.5.3 傳輸安全層157
5.6 驗證160
【第三部分 分布式的基石】
●第6章 分布式共識166
6.1 Paxos168
6.1.1 Paxos的誕生169
6.1.2 算法流程169
6.1.3 工作實例172
6.2 Multi Paxos174
6.3 Gossip協(xié)議178
●第7章 從類庫到服務(wù)180
7.1 服務(wù)發(fā)現(xiàn)180
7.1.1 服務(wù)發(fā)現(xiàn)的意義181
7.1.2 可用與可靠182
7.1.3 注冊中心實現(xiàn)185
7.2 網(wǎng)關(guān)路由186
7.2.1 網(wǎng)關(guān)的職責(zé)186
7.2.2 網(wǎng)絡(luò)I/O模型188
7.2.3 BFF網(wǎng)關(guān)190
7.3 客戶端負(fù)載均衡191
7.3.1 客戶端負(fù)載均衡器193
7.3.2 代理負(fù)載均衡器194
7.3.3 地域與區(qū)域196
●第8章 流量治理198
8.1 服務(wù)容錯198
8.1.1 容錯策略199
8.1.2 容錯設(shè)計模式201
8.2 流量控制209
8.2.1 流量統(tǒng)計指標(biāo)210
8.2.2 限流設(shè)計模式211
8.2.3 分布式限流215
●第9章 可靠通信217
9.1 零信任網(wǎng)絡(luò)217
9.1.1 零信任安全模型的特征218
9.1.2 Google的實踐探索220
9.2 服務(wù)安全222
9.2.1 建立信任222
9.2.2 認(rèn)證223
9.2.3 授權(quán)227
●第10章 可觀測性230
10.1 事件日志233
10.1.1 輸出233
10.1.2 收集與緩沖235
10.1.3 加工與聚合236
10.1.4 存儲與查詢237
10.2 鏈路追蹤239
10.2.1 追蹤與跨度239
10.2.2 數(shù)據(jù)收集240
10.2.3 追蹤規(guī)范化243
10.3 聚合度量244
10.3.1 指標(biāo)收集245
10.3.2 存儲查詢248
10.3.3 監(jiān)控預(yù)警250
【第四部分 不可變基礎(chǔ)設(shè)施】
●第11章 虛擬化容器254
11.1 容器的崛起256
11.1.1 隔離文件:chroot256
11.1.2 隔離訪問:名稱空間257
11.1.3 隔離資源:cgroups258
11.1.4 封裝系統(tǒng):LXC259
11.1.5 封裝應(yīng)用:Docker260
11.1.6 封裝集群:Kubernetes263
11.2 以容器構(gòu)建系統(tǒng)266
11.2.1 隔離與協(xié)作266
11.2.2 韌性與彈性271
11.3 以應(yīng)用為中心的封裝275
11.3.1 Kustomize276
11.3.2 Helm與Chart277
11.3.3 Operator與CRD279
11.3.4 開放應(yīng)用模型284
●第12章 容器間網(wǎng)絡(luò)288
12.1 Linux網(wǎng)絡(luò)虛擬化288
12.1.1 網(wǎng)絡(luò)通信模型289
12.1.2 干預(yù)網(wǎng)絡(luò)通信291
12.1.3 虛擬化網(wǎng)絡(luò)設(shè)備294
12.1.4 容器間通信304
12.2 容器網(wǎng)絡(luò)與生態(tài)306
12.2.1 CNM與CNI306
12.2.2 CNM到CNI308
12.2.3 網(wǎng)絡(luò)插件生態(tài)310
●第13章 持久化存儲314
13.1 Kubernetes存儲設(shè)計314
13.1.1 Mount和Volume316
13.1.2 靜態(tài)存儲分配318
13.1.3 動態(tài)存儲分配322
13.2 容器存儲與生態(tài)325
13.2.1 Kubernetes存儲架構(gòu)325
13.2.2 FlexVolume與CSI327
13.2.3 從In-Tree到Out-of-Tree329
13.2.4 容器插件生態(tài)331
●第14章 資源與調(diào)度336
14.1 資源模型336
14.2 服務(wù)質(zhì)量與優(yōu)先級337
14.3 驅(qū)逐機(jī)制340
14.4 默認(rèn)調(diào)度器342
●第15章 服務(wù)網(wǎng)格346
15.1 透明通信的涅槃347
15.1.1 通信成本347
15.1.2 數(shù)據(jù)平面352
15.1.3 控制平面358
15.2 服務(wù)網(wǎng)格與生態(tài)360
15.2.1 服務(wù)網(wǎng)格接口361
15.2.2 通用數(shù)據(jù)平面API363
15.2.3 服務(wù)網(wǎng)格生態(tài)364
【第五部分 技術(shù)方法論】
●第16章 向微服務(wù)邁進(jìn)368
16.1 目的:微服務(wù)的驅(qū)動力369
16.2 前提:微服務(wù)需要的條件371
16.3 邊界:微服務(wù)的粒度375
16.4 治理:理解系統(tǒng)復(fù)雜性377
16.4.1 靜態(tài)的治理378
16.4.2 發(fā)展的治理380
附錄A 技術(shù)演示工程實踐383
附錄B 部署Kubernetes集群402