這是一本從架構(gòu)視角講解如何構(gòu)建大型分布式系統(tǒng)的著作,是超級(jí)暢銷書《深入理解Java虛擬機(jī)》的作者周志明多年架構(gòu)和研發(fā)經(jīng)驗(yàn)的總結(jié),得到了多位行業(yè)資深架構(gòu)專家的聯(lián)袂推薦。
全書共16章,分為演進(jìn)中的架構(gòu)、架構(gòu)師的視角、分布式的基石、不可變基礎(chǔ)設(shè)施和技術(shù)方法論五部分。
●第①部分 演進(jìn)中的架構(gòu)(第1章)
著重介紹了軟件開(kāi)發(fā)歷史中多種主流架構(gòu)風(fēng)格出現(xiàn)的契機(jī)、解決的問(wèn)題以及帶來(lái)的新缺陷。
●第②部分 架構(gòu)師的視角(第2~5章)
總結(jié)了一名架構(gòu)師應(yīng)該在架構(gòu)設(shè)計(jì)時(shí)思考哪些問(wèn)題,有哪些主流的解決方案和行業(yè)標(biāo)準(zhǔn)做法,各種方案有什么優(yōu)缺點(diǎn),不同的解決方法會(huì)帶來(lái)什么不同的影響,等等。
●第③部分 分布式的基石(第6~10章)
重點(diǎn)討論了不同架構(gòu)風(fēng)格是應(yīng)該在技術(shù)規(guī)范上統(tǒng)一,還是由應(yīng)用系統(tǒng)自行解決這個(gè)問(wèn)題,給出了解決思路、方法和常見(jiàn)工具。
●第④部分 不可變基礎(chǔ)設(shè)施(第11~15章)
重點(diǎn)講解了基礎(chǔ)設(shè)施不變性的目的、原理與實(shí)現(xiàn)途徑,包括虛擬化容器、容器間網(wǎng)絡(luò)、持久化存儲(chǔ)、資源與調(diào)度、服務(wù)網(wǎng)格等內(nèi)容。
●第⑤部分 技術(shù)方法論(第16章)
面向技術(shù)決策者集中討論了與分布式、微服務(wù)、架構(gòu)等相關(guān)的理論話題,將解決問(wèn)題的能力歸納、總結(jié)、升華為方法論。
全書以實(shí)踐為導(dǎo)向,一個(gè)案例貫穿全書,同時(shí)給出了基于Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda 五種架構(gòu)風(fēng)格的樣例工程。
(1)作者權(quán)威:
《深入理解Java虛擬機(jī)》作者周志明新作,資深架構(gòu)專家,遠(yuǎn)光軟件研究院院長(zhǎng)。
(2)9位專家推薦:
付曉巖(IBM副合伙人)、孫玄(奈學(xué)教育CEO)、鄭然(百度主任架構(gòu)師)、劉超(騰訊云T4解決方案專家)、潘新宇(集團(tuán)資深架構(gòu)師)等9位架構(gòu)專家聯(lián)袂推薦。
(3)5個(gè)維度全面講解:
從架構(gòu)演進(jìn)、架構(gòu)設(shè)計(jì)思維、分布式基石、不可變基礎(chǔ)設(shè)施、技術(shù)方法論5個(gè)維度全面探索如何構(gòu)建可靠的大型分布式系統(tǒng)。
(4)5種架構(gòu)風(fēng)格工程樣例:
同時(shí)給出了基于Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda 五種架構(gòu)風(fēng)格的樣例工程,代碼開(kāi)源在GitHub上。
(5) 注重實(shí)戰(zhàn):
一個(gè)綜合案例貫穿全書,將本書的核心知識(shí)點(diǎn)以及作者的經(jīng)驗(yàn)和思考融入其中。
(6) 關(guān)注華章計(jì)算機(jī),回復(fù)68391
獲取GitHub配套代碼工程項(xiàng)目地址
本書是一本以如何構(gòu)建一套可靠的大型分布式系統(tǒng)為敘述主線的技術(shù)手冊(cè)。筆者十多年來(lái)一直從事大型企業(yè)級(jí)軟件的架構(gòu)研發(fā)工作,較完整地經(jīng)歷了從早的大型單體系統(tǒng)到如今基于云原生基礎(chǔ)設(shè)施的架構(gòu)演變過(guò)程,希望借此機(jī)會(huì),系統(tǒng)性地整理相關(guān)知識(shí),查漏補(bǔ)缺,將它們都融入既有的知識(shí)框架之中,也希望能將這些知識(shí)與大家分享討論。筆者相信要深入理解一門技術(shù),不僅要去看、去讀、去想、去用,更要去說(shuō)、去寫。將自己認(rèn)為掌握了的知識(shí)敘述出來(lái),盡量將知識(shí)說(shuō)得條理清晰,讓他人聽(tīng)得明白,釋去心中疑惑,同時(shí)把自己的觀點(diǎn)交予別人審視,乃至質(zhì)疑,在此過(guò)程之中,自己也會(huì)挖掘出很多潛藏在已知背后的未知。
【如何閱讀本書】
本書一共分為演進(jìn)中的架構(gòu)、架構(gòu)師的視角、分布式的基石、不可變基礎(chǔ)設(shè)施和技術(shù)方法論五部分,每一部分都有相對(duì)明確的主題與目標(biāo),建議按順序閱讀各部分以獲得更有邏輯性的閱讀體驗(yàn)。不過(guò)每部分內(nèi)各章節(jié)之間并沒(méi)有明顯的前后依賴關(guān)系,讀者從任何一個(gè)感興趣的章節(jié)開(kāi)始閱讀都可以。
筆者并沒(méi)有假定本書的所有讀者都在架構(gòu)方面具備特別專業(yè)的技術(shù)水平,因此在講解各個(gè)知識(shí)點(diǎn)時(shí),會(huì)力求在保證邏輯完整、描述準(zhǔn)確的前提下,盡量用通俗的語(yǔ)言和案例去講述架構(gòu)中與開(kāi)發(fā)關(guān)系為密切的內(nèi)容。但本書的主題畢竟是軟件架構(gòu),這就不可避免地需要讀者有一定的技術(shù)基礎(chǔ)。本書依然主要面向中、高級(jí)程序員群體,一些常用的開(kāi)發(fā)框架、類庫(kù)和語(yǔ)法等基礎(chǔ)知識(shí)點(diǎn),均假設(shè)讀者已有所了解。書中雖然會(huì)涉及這些工具、類庫(kù)、框架的使用案例,但本書并不是它們的操作指南,只是借助它們?nèi)ブv解技術(shù)原理。
學(xué)習(xí)任何知識(shí)都不應(yīng)該脫離實(shí)踐去空談理論。為了講清楚不同架構(gòu)風(fēng)格下的工程實(shí)現(xiàn)差異,也為了盡量少在書中貼代碼,將寶貴的版面空間節(jié)省出來(lái),筆者在GitHub上分別建立了基于Spring Boot、Spring Cloud、Kubernetes、Istio和AWS Lambda的五種架構(gòu)風(fēng)格的樣例工程。如果你閱讀之前對(duì)架構(gòu)并沒(méi)有太深刻的理解,建議先閱讀一遍本書附錄A的內(nèi)容。如果你是一名駕駛初學(xué)者,合理的學(xué)習(xí)路徑應(yīng)該是先把汽車發(fā)動(dòng),然后慢慢行駛起來(lái),而不是先從引擎動(dòng)力原理變速箱構(gòu)造入手去深刻地了解一輛汽車。計(jì)算機(jī)技術(shù)也是同理,先從運(yùn)行程序開(kāi)始,看看效果,搭建好開(kāi)發(fā)、調(diào)試環(huán)境,對(duì)即將學(xué)習(xí)的內(nèi)容先有一個(gè)整體的認(rèn)知是很有好處的。
后,筆者再簡(jiǎn)要介紹下本書每一部分的讀者對(duì)象、目標(biāo)和價(jià)值。
●部分 演進(jìn)中的架構(gòu)
這部分只有第1章,適合所有開(kāi)發(fā)者,但尤其推薦剛剛從單體架構(gòu)向微服務(wù)架構(gòu)轉(zhuǎn)型的開(kāi)發(fā)者閱讀。
部分既是全書的緒論,也是對(duì)后續(xù)將用到的大量名詞概念所做的鋪墊。這部分沒(méi)有談?wù)撨^(guò)于具體的技術(shù),只是著重介紹了軟件開(kāi)發(fā)歷史中多種主流架構(gòu)出現(xiàn)的契機(jī)、解決的問(wèn)題以及帶來(lái)的新缺陷。
●第二部分 架構(gòu)師的視角
這部分包括第2~5章,適合所有技術(shù)架構(gòu)師、系統(tǒng)設(shè)計(jì)與開(kāi)發(fā)人員,主要討論與風(fēng)格無(wú)關(guān)的架構(gòu)知識(shí)。
架構(gòu)師這個(gè)詞的外延非常寬泛,不同語(yǔ)境中有不同含義。本書中的技術(shù)架構(gòu)師特指企業(yè)架構(gòu)中面向技術(shù)模型的系統(tǒng)設(shè)計(jì)者,這意味著討論范圍不會(huì)涉及貼近企業(yè)戰(zhàn)略、業(yè)務(wù)流程的系統(tǒng)分析、信息戰(zhàn)略設(shè)計(jì)等內(nèi)容,而是聚焦于貼近一線研發(fā)人員的技術(shù)方案設(shè)計(jì)者。這部分將介紹一名架構(gòu)師應(yīng)該在架構(gòu)設(shè)計(jì)時(shí)思考哪些問(wèn)題,有哪些主流的解決方案和行業(yè)標(biāo)準(zhǔn)做法,各種方案有什么優(yōu)缺點(diǎn),不同的解決方法會(huì)帶來(lái)什么不同的影響,等等,以達(dá)到將架構(gòu)設(shè)計(jì)這種聽(tīng)起來(lái)抽象的工作具體化、具象化的目的。
作為后續(xù)實(shí)踐的基礎(chǔ),第二部分的內(nèi)容與具體的架構(gòu)風(fēng)格無(wú)關(guān),討論的是普適的架構(gòu)技術(shù)與使用技巧。無(wú)論你是否關(guān)注微服務(wù)、云原生這些概念,無(wú)論你從事架構(gòu)設(shè)計(jì)還是編碼開(kāi)發(fā),了解這里所列的基礎(chǔ)知識(shí),都是有實(shí)用價(jià)值的。
●第三部分 分布式的基石
這部分包括第6~10章,主要面向使用分布式架構(gòu)的開(kāi)發(fā)人員。
只要選擇了分布式架構(gòu),無(wú)論是SOA、微服務(wù)、服務(wù)網(wǎng)格或者其他架構(gòu)風(fēng)格,涉及與遠(yuǎn)程服務(wù)的交互時(shí),服務(wù)的注冊(cè)發(fā)現(xiàn)、跟蹤治理、負(fù)載均衡、故障隔離、認(rèn)證授權(quán)、伸縮擴(kuò)展、傳輸通信、事務(wù)處理等一系列問(wèn)題都是不可避免的。不同的架構(gòu)風(fēng)格,其區(qū)別是到底要在技術(shù)規(guī)范上提供統(tǒng)一的解決方案,由應(yīng)用系統(tǒng)自行解決,還是在基礎(chǔ)設(shè)施層面將這類問(wèn)題隔離掉。第三部分將重點(diǎn)討論這類問(wèn)題的解決思路、方法和常見(jiàn)工具。
●第四部分 不可變基礎(chǔ)設(shè)施
這部分包括第11~15章,主要面向基礎(chǔ)設(shè)施的運(yùn)維人員、技術(shù)平臺(tái)的開(kāi)發(fā)人員。
不可變基礎(chǔ)設(shè)施這個(gè)概念由來(lái)已久。2012年Martin Fowler設(shè)想的鳳凰服務(wù)器一與2013年Chad Fowler正式提出的不可變基礎(chǔ)設(shè)施二,都闡明了基礎(chǔ)設(shè)施不變性帶來(lái)的益處。在云原生基金會(huì)(Cloud Native Computing Foundation,CNCF)所定義的云原生概念中,不可變基礎(chǔ)設(shè)施被提升到與微服務(wù)平級(jí)的重要程度,此時(shí)它已不再局限于方便運(yùn)維、程序升級(jí)和部署的手段,而是升華為向應(yīng)用代碼隱藏分布式架構(gòu)復(fù)雜度、讓分布式架構(gòu)得以成為一種可普遍推廣的普適架構(gòu)風(fēng)格的必要前提。在云原生時(shí)代、后微服務(wù)時(shí)代,軟件與硬件之間的界線已經(jīng)徹底模糊,無(wú)論是基礎(chǔ)設(shè)施的運(yùn)維人員,抑或是技術(shù)平臺(tái)的開(kāi)發(fā)人員,都有必要深入理解基礎(chǔ)設(shè)施不變性的目的、原理與實(shí)現(xiàn)途徑。
●第五部分 技術(shù)方法論
這部分包括第16章,主要面向企業(yè)中重要技術(shù)的決策者。
本書的主體內(nèi)容是務(wù)實(shí)的,偏重具體技術(shù),而非方向理論。但在第16章會(huì)集中討論幾點(diǎn)與分布式、微服務(wù)、架構(gòu)等相關(guān)的相對(duì)務(wù)虛的話題。
筆者認(rèn)為,對(duì)于一個(gè)技術(shù)人員,成長(zhǎng)的主要驅(qū)動(dòng)力是實(shí)踐,是在開(kāi)發(fā)程序、解決問(wèn)題中增長(zhǎng)知識(shí),再將知識(shí)歸納、總結(jié)、升華成為理論,所以筆者將本章安排到全書的末尾,也是希望大家能先去實(shí)踐,再談理論。同時(shí),筆者也認(rèn)為,對(duì)于一名研究人員或者企業(yè)中技術(shù)方向的決策者,理論與實(shí)踐都不可缺少,在涉及決策的場(chǎng)景中,成體系的理論知識(shí)甚至比實(shí)踐經(jīng)驗(yàn)還要關(guān)鍵,因?yàn)閳?zhí)行力再?gòu)?qiáng),也必須用在正確的方向上才有價(jià)值。如果你對(duì)自己的規(guī)劃是有朝一日從一名技術(shù)人員發(fā)展成研究或者管理人員,補(bǔ)充這部分知識(shí)是必不可少的。
周志明(博士)
人工智能與企業(yè)級(jí)研發(fā)資深專家,遠(yuǎn)光軟件研究院院長(zhǎng),阿里云MVP、騰訊云TVP、華為云MVP。在Java技術(shù)棧、微服務(wù)、云原生架構(gòu)等領(lǐng)域有深入研究。
開(kāi)源技術(shù)的積極倡導(dǎo)者和推動(dòng)者,QCon全球開(kāi)發(fā)者大會(huì)明星講師、極客時(shí)間布道師、InfoQ.CN專欄撰稿人,作為組織者或主講人,參與了多場(chǎng)線上、線下的技術(shù)布道活動(dòng)。
計(jì)算機(jī)技術(shù)作家,十年間出版過(guò)八部技術(shù)專著,口碑和銷量均得到業(yè)內(nèi)認(rèn)可,其中四本書在豆瓣上獲得了9.0分或以上的評(píng)價(jià)。如知名暢銷書《深入理解Java虛擬機(jī):JVM高級(jí)特性與實(shí)踐》目前已經(jīng)出至第3版,累計(jì)印刷超過(guò)50次,仍長(zhǎng)銷不衰,是中文計(jì)算機(jī)圖書領(lǐng)域公認(rèn)的、難得一見(jiàn)的佳作。
【部分 演進(jìn)中的架構(gòu)】
●第1章 服務(wù)架構(gòu)演進(jìn)史2
1.1 原始分布式時(shí)代2
1.2 單體系統(tǒng)時(shí)代5
1.3 SOA時(shí)代8
1.4 微服務(wù)時(shí)代12
1.5 后微服務(wù)時(shí)代16
1.6 無(wú)服務(wù)時(shí)代19
【第二部分 架構(gòu)師的視角】
●第2章 訪問(wèn)遠(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 三個(gè)基本問(wèn)題28
2.1.4 統(tǒng)一的RPC30
2.1.5 分裂的RPC32
2.2 REST設(shè)計(jì)風(fēng)格34
2.2.1 理解REST35
2.2.2 RESTful的系統(tǒng)37
2.2.3 RMM41
2.2.4 不足與爭(zhēng)議45
●第3章 事務(wù)處理48
3.1 本地事務(wù)49
3.1.1 實(shí)現(xiàn)原子性和持久性50
3.1.2 實(shí)現(xiàn)隔離性54
3.2 全局事務(wù)57
3.3 共享事務(wù)62
3.4 分布式事務(wù)64
3.4.1 CAP與ACID64
3.4.2 可靠事件隊(duì)列67
3.4.3 TCC事務(wù)69
3.4.4 SAGA事務(wù)72
●第4章 透明多級(jí)分流系統(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 均衡策略與實(shí)現(xiàn)106
4.6 服務(wù)端緩存107
4.6.1 緩存屬性108
4.6.2 緩存風(fēng)險(xiǎn)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)證的實(shí)現(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 密碼存儲(chǔ)和驗(yàn)證149
5.5 傳輸151
5.5.1 摘要、加密與簽名151
5.5.2 數(shù)字證書154
5.5.3 傳輸安全層157
5.6 驗(yàn)證160
【第三部分 分布式的基石】
●第6章 分布式共識(shí)166
6.1 Paxos168
6.1.1 Paxos的誕生169
6.1.2 算法流程169
6.1.3 工作實(shí)例172
6.2 Multi Paxos174
6.3 Gossip協(xié)議178
●第7章 從類庫(kù)到服務(wù)180
7.1 服務(wù)發(fā)現(xiàn)180
7.1.1 服務(wù)發(fā)現(xiàn)的意義181
7.1.2 可用與可靠182
7.1.3 注冊(cè)中心實(shí)現(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ù)容錯(cuò)198
8.1.1 容錯(cuò)策略199
8.1.2 容錯(cuò)設(shè)計(jì)模式201
8.2 流量控制209
8.2.1 流量統(tǒng)計(jì)指標(biāo)210
8.2.2 限流設(shè)計(jì)模式211
8.2.3 分布式限流215
●第9章 可靠通信217
9.1 零信任網(wǎng)絡(luò)217
9.1.1 零信任安全模型的特征218
9.1.2 Google的實(shí)踐探索220
9.2 服務(wù)安全222
9.2.1 建立信任222
9.2.2 認(rèn)證223
9.2.3 授權(quán)227
●第10章 可觀測(cè)性230
10.1 事件日志233
10.1.1 輸出233
10.1.2 收集與緩沖235
10.1.3 加工與聚合236
10.1.4 存儲(chǔ)與查詢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 存儲(chǔ)查詢248
10.3.3 監(jiān)控預(yù)警250
【第四部分 不可變基礎(chǔ)設(shè)施】
●第11章 虛擬化容器254
11.1 容器的崛起256
11.1.1 隔離文件:chroot256
11.1.2 隔離訪問(wèn):名稱空間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 開(kāi)放應(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章 持久化存儲(chǔ)314
13.1 Kubernetes存儲(chǔ)設(shè)計(jì)314
13.1.1 Mount和Volume316
13.1.2 靜態(tài)存儲(chǔ)分配318
13.1.3 動(dòng)態(tài)存儲(chǔ)分配322
13.2 容器存儲(chǔ)與生態(tài)325
13.2.1 Kubernetes存儲(chǔ)架構(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)先級(jí)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ū)動(dòng)力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ù)演示工程實(shí)踐383
附錄B 部署Kubernetes集群402