深入理解Apache Dubbo與實戰(zhàn)
定 價:79 元
- 作者:詣極
- 出版時間:2019/7/1
- ISBN:9787121366345
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP316.4
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書首先介紹Dubbo的簡史、后續(xù)的規(guī)劃和整體架構(gòu)大圖;接著介紹Dubbo環(huán)境配置,并基于Dubbo開發(fā)*款應用程序;然后介紹Dubbo內(nèi)置的常用注冊中心的實現(xiàn)原理,Dubbo擴展點加載的原理和實現(xiàn),Dubbo的啟動、服務暴露、服務消費和優(yōu)雅停機的機制,Dubbo中RPC協(xié)議細節(jié)、編解碼和服務調(diào)用實現(xiàn)原理,Dubbo集群容錯、路由和負載均衡機制,Dubbo的擴展點相關(guān)知識,Dubbo高級特性的實現(xiàn)和原理,Dubbo常用的Filter的實現(xiàn)原理,Dubbo中新增etcd3注冊中心的實戰(zhàn)內(nèi)容和Dubbo服務治理平臺的相關(guān)知識;*后介紹Dubbo未來生態(tài)和Dubbo Mesh的相關(guān)知識。
與官方文檔不同,官方文檔側(cè)重講解使用方法,《深入理解Apache Dubbo與實戰(zhàn)》主要側(cè)重于詳細解讀Dubbo框架工作原理和底層機制,并結(jié)合少量核心源碼進行講解。在原理的基礎上,展示一些動手擴展Dubbo特性的實戰(zhàn)場景,并對Dubbo的發(fā)展方向Dubbo Mesh做了一些探索。
序一
近年來,隨著業(yè)務規(guī)模的發(fā)展和復雜度的增加,傳統(tǒng)的單體應用已經(jīng)很難適應業(yè)務迭代的訴求,越來越多的公司開始進行服務化的改造。很高興看到Apache Dubbo被許多公司采用,作為服務化改造的基礎架構(gòu)進行演進。這里面就包括了許多互聯(lián)網(wǎng)公司、國字頭的大型企業(yè),以及金融行業(yè)的巨頭公司。Apache Dubbo因為良好的設計和擴展性受到許多開發(fā)者的歡迎,然而當開發(fā)者需要深入了解Dubbo底層的架構(gòu)設計和實現(xiàn)的時候,往往會有些不知所措。網(wǎng)上也有很多愛好者撰寫的源碼分析等文章,雖有所有啟發(fā)和裨益,但總覺得不夠成體系。令人遺憾的是,市面上始終缺乏一本完整的、體系化的對Apache Dubbo進行深入原理剖析的書。
本書的出現(xiàn)填補了這一空白,本書由淺入深,娓娓道來。既有對Dubbo基本概念的講解、底層原理的分析,同時又不乏生動的實戰(zhàn)內(nèi)容。作為進階的內(nèi)容,對擴展點、過濾器,以及Dubbo的高級特性,都有深入淺出的介紹。非常適合想了解Dubbo,對Dubbo內(nèi)部實現(xiàn)感興趣的讀者閱讀。
我和本書作者因為共同參與Dubbo社區(qū)而認識,彼時Dubbo剛剛加入Apache基金會進行孵化。在參與社區(qū)開發(fā)的過程中,經(jīng)常有過深入的交流,在此過程中,本書作者所展現(xiàn)出來的對Dubbo內(nèi)核機制透徹的理解,以及對細節(jié)的準確把握,讓我受益匪淺。正式因為本書作者出色的貢獻,他也成為Dubbo加入Apache孵化器之后首個committer(提交者,對代碼具有提交權(quán)限),后續(xù)更是成為首個PMC Member(項目管理委員會成員,對項目發(fā)展具有決定性的投票權(quán))。由他提筆來撰寫本書,我認為再合適不過。在閱讀本書的過程中,我收獲頗豐。
工欲善其事,必先先利器。希望更多的讀者因為本書而受益,也希望有更多的人閱讀本書之后,了解Dubbo,參與到社區(qū)中,一起把社區(qū)發(fā)展得越來越好。
寫在Dubbo從Apache基金會畢業(yè)之際。
張乎興,阿里云技術(shù)專家,
Apache Member,Apache Dubbo/Tomcat PMC Member
序二
過去十多年互聯(lián)網(wǎng)產(chǎn)業(yè)的高速發(fā)展,在給社會帶來深刻變革的同時,也催生了服務架構(gòu)的演進:從傳統(tǒng)的單體應用到面向服務的SOA,再到現(xiàn)今主流的微服務架構(gòu),而Apache Dubbo就是微服務領域中的先行者和佼佼者。
Apache Dubbo是阿里巴巴于于2011年開源的一款高性能Java RPC框架,開源伊始就在業(yè)界產(chǎn)生了很大的影響,被大量公司廣泛使用,甚至在很多公司自研的RPC框架中也能看到不少Dubbo的影子,可以說Dubbo在國內(nèi)服務化體系演進過程中扮演了一個非常重要的角色。雖然中間經(jīng)歷了幾年時間的沉寂,不過2017年阿里巴巴又重啟了對Dubbo的開源維護,受到了社區(qū)的廣泛歡迎,社區(qū)活躍度也隨之迅速提升,Dubbo也正在從一個微服務領域的高性能RPC框架,逐步演變?yōu)橐粋完整的微服務生態(tài)。
之前由于工作關(guān)系,對Dubbo有過比較深入的研究,在閱讀Dubbo的源碼過程中,深深體會到了作者的匠心設計和深厚功底。我們知道服務往往是一家公司技術(shù)體系中最核心的部分,是整個業(yè)務的基石,所以作為一款涵蓋了服務交互全過程的通用RPC框架,就必須能非常簡單、無侵入地支持業(yè)務對服務調(diào)用過程中的各個階段做擴展和定制,比如通信協(xié)議、序列化格式、路由策略、負載均衡、監(jiān)控運維等。而Dubbo通過微內(nèi)核設計、SPI擴展的方式完美地解決了這一難題,不管是Dubbo自身的特性,還是業(yè)務方的擴展,都統(tǒng)一通過SPI來實現(xiàn),在Dubbo內(nèi)核面前都是一等公民,從而保證了框架自身的可持續(xù)性和穩(wěn)定性。有特殊需求的業(yè)務或公司可以在不修改一行Dubbo源碼的情況下加載自己的擴展或接入自己的產(chǎn)品和運維體系,這一點非常值得我們學習。
和詣極認識也是源于Dubbo,他是Apache Dubbo項目的PMC,為Dubbo貢獻了很多有價值的特性,如HTTP2協(xié)議、etcd注冊中心等,現(xiàn)在有幸成為同事,對他也有了更深的了解。在我看來,他是一個很純粹的技術(shù)人,熟讀眾多開源框架的源碼并對其原理了然于胸,對技術(shù)也充滿了熱情,能在工作非常飽和的情況下堅持完成本書的寫作,可見一斑。受其熱情感染,所以當收到邀請為本書作序時,我也是毫不猶豫地就答應了。
收到書稿后第一時間細細通讀了一遍,本書作為第一本體系化講解Apache Dubbo的書籍,深入淺出地解釋了Dubbo的工作原理,配以源碼級解析,向讀者展現(xiàn)了一款優(yōu)秀的分布式中間件的設計用心和實現(xiàn)細節(jié),非常適合有志于成為優(yōu)秀架構(gòu)師的技術(shù)愛好者細細閱讀和品味。同時本書在Dubbo的協(xié)議設計、編解碼原理、線程模型等方面也做了深度剖析,使讀者不僅知其然也能知其所以然,有助于理解分布式環(huán)境下的服務通信范式,對問題排查也會有很大益處。所以在此向大家推薦本書,相信不管是初學者還是有多年經(jīng)驗的資深工程師,通過閱讀本書,都會有所收獲。
宋順,螞蟻金服高級技術(shù)專家
開源配置中心Apollo作者
前言
本書的由來
在Apache Dubbo(以下簡稱Dubbo)重新開源之前,Dubbo已經(jīng)被很多公司廣泛用于生產(chǎn)環(huán)境并獲得了良好的反饋,很多公司內(nèi)部也會建立私有分支自己維護,其中Dubbox就是基于Dubbo分支進行擴展并二次維護的。重新開源后,社區(qū)維護的Dubbo版本進行了大量bug fix和特性支持,收到了大量Dubbo用戶的支持和參與。編寫本書的想法是在開源后提出來的,因此本書取名《深入理解Apache Dubbo與實戰(zhàn)》。
我最早接觸Dubbo是2015年在參與云基礎設施建設和微服務框架搭建時,那時的Dubbo基本是分布式系統(tǒng)的不二之選。我在使用過程中遇到了不少問題,不得不通過調(diào)試Dubbo源碼來解決。在源碼調(diào)試過程中,我逐漸理解Dubbo的設計理念,越發(fā)驚嘆其架構(gòu)設計的巧妙,正所謂:優(yōu)秀的設計萬里挑一。
后來我加入另外一家公司擔任架構(gòu)師,在基礎架構(gòu)組負責中間件與框架的研發(fā),也是基于Dubbo等框架做二次開發(fā)。此時,我與本書另一位作者詣極成為同事,我們志趣相投,也為編寫本書埋下了伏筆。
2017年,Dubbo經(jīng)歷了數(shù)年的停滯后,終于又重啟維護。我還依稀記得阿里巴巴公司宣布的那天詣極的興奮狀,詣極是首批投入Apache Dubbo開源工作中去的開發(fā)者,期間為Apache Dubbo貢獻了眾多特性,如HTTP 2、etcd注冊中心等,現(xiàn)在已經(jīng)成為Apache Dubbo PMC。
Dubbo在重啟維護后,短時間內(nèi)有了大量的更新。此時我正就職于螞蟻金服,每天苦于繁重的CRUD。我發(fā)現(xiàn)市面上沒有一本系統(tǒng)講解Dubbo的書籍,Dubbo相關(guān)的資料大都是一些博客文章,并且內(nèi)容也相對陳舊。于是我慫恿詣極與我一起寫這本書,作為這些年來工作的一個總結(jié),他也欣然答應。
然后就是歷時半年的寫作過程,一波三折。中途有一些朋友加入,又因為各種不可抗拒的原因退出。我和詣極平時的工作都非常飽和,又要關(guān)注開源工作,常常焦頭爛額。道雖邇,不行不至;事雖小,不為不成。時間是一點一點擠出來的,最終我們還是堅持完成了本書,并且沒有偏離原計劃太多。由于時間緊迫和能力有限,本書的內(nèi)容難免有錯漏,讀者的勘誤可以發(fā)送到以下電子郵箱:
yiji@apache.org或315157973@qq.com。
面向的讀者
由于Dubbo重啟維護后,官方的使用文檔已經(jīng)非常詳細,本書如果再講使用方法就沒有太多的意義,所以一開始就按源碼解析、設計原理說明的方向定位,因此需要讀者有一定的基礎。涉及源碼的講解,注定會有很多地方枯燥乏味,我們在編寫的時候也盡量用自己的語言去提煉總結(jié),讓讀者可以少看代碼。
在開始動筆編寫本書時,Apache Dubbo 2.7正在開發(fā)中,考慮到代碼的穩(wěn)定性,我們最終決定基于公開發(fā)布的2.6.5版本(release)來寫。當本書快完成的時候,Apache Dubbo 2.7正式發(fā)布了。因此,本書的內(nèi)容并不是基于最新的代碼的,寫書的速度永遠比不上框架更新的速度,也希望讀者能夠諒解。
本書內(nèi)容
第1章主要介紹Dubbo的簡史、后續(xù)的規(guī)劃和整體架構(gòu)大圖。
第2章主要介紹Dubbo的環(huán)境配置和基于Dubbo開發(fā)第一款應用程序。
第3章主要介紹Dubbo內(nèi)置的常用注冊中心的實現(xiàn)原理。
第4章主要介紹Dubbo擴展點加載的原理和實現(xiàn)。
第5章主要介紹Dubbo的配置解析、服務暴露、服務消費和優(yōu)雅停機的機制。
第6章主要介紹Dubbo的RPC協(xié)議細節(jié)、編解碼和服務調(diào)用的實現(xiàn)原理。
第7章主要介紹Dubbo的集群容錯、路由和負載均衡機制。
第8章主要介紹Dubbo擴展點的相關(guān)知識。
第9章主要介紹Dubbo高級特性的實現(xiàn)和原理。
第10章主要介紹Dubbo過濾器的實現(xiàn)原理。
第11章主要介紹Dubbo中新增的etcd3注冊中心的實戰(zhàn)內(nèi)容。
第12章主要介紹Dubbo服務治理平臺的相關(guān)知識。
第13章主要介紹Dubbo的未來生態(tài)和Dubbo Mesh相關(guān)知識。
致謝
首先感謝我的領導與同事,也感謝我的團隊,你們給了我很大的幫助。
然后要感謝我妻子,在我寫作期間,她承擔了家里的大小事務,讓我可以有更多的時間投入寫作。如果沒有妻子的支持,那么這本書我肯定是無法完成的。
商宗海,花名詣極,開源Dubbo核心開發(fā)者之一。曾就職于阿里巴巴、金蝶中國,F(xiàn)就職于有贊科技,擔任Dubbo框架技術(shù)負責人,參與中間件開發(fā),長期活躍在Dubbo社區(qū)。
目錄
第1章 Dubbo高性能RPC通信框架1
1.1 應用架構(gòu)演進過程1
1.1.1 單體應用1
1.1.2 分布式應用3
1.2 Dubbo簡介6
1.2.1 Dubbo的發(fā)展歷史7
1.2.2 Dubbo是什么7
1.2.3 Dubbo解決什么問題9
1.2.4 誰在使用Dubbo10
1.2.5 Dubbo后續(xù)的規(guī)劃11
1.3 Dubbo總體大圖11
1.3.1 Dubbo總體分層11
1.3.2 Dubbo核心組件12
1.3.3 Dubbo總體調(diào)用過程13
1.4 小結(jié)15
第2章 開發(fā)第一款Dubbo應用程序16
2.1 配置開發(fā)環(huán)境16
2.1.1 下載并安裝JDK17
2.1.2 下載并安裝IDE17
2.1.3 下載并配置Maven18
2.1.4 下載并配置ZooKeeper18
2.1.5 使用IDEA調(diào)試Dubbo源碼18
2.2 基于XML配置實現(xiàn)21
2.2.1 編寫Echo服務器21
2.2.2 編寫Echo客戶端24
2.3 基于注解實現(xiàn)26
2.3.1 基于注解編寫Echo服務器26
2.3.2 基于注解編寫Echo客戶端28
2.4 基于API實現(xiàn)30
2.4.1 基于API編寫Echo服務器30
2.4.2 基于API編寫Echo客戶端31
2.5 構(gòu)建并運行32
2.6 小結(jié)34
第3章 Dubbo注冊中心35
3.1 注冊中心概述35
3.1.1 工作流程36
3.1.2 數(shù)據(jù)結(jié)構(gòu)37
3.1.3 ZooKeeper原理概述37
3.1.4 Redis原理概述39
3.2 訂閱/發(fā)布40
3.2.1 ZooKeeper的實現(xiàn)40
3.2.2 Redis的實現(xiàn)44
3.3 緩存機制48
3.3.1 緩存的加載49
3.3.2 緩存的保存與更新50
3.4 重試機制50
3.5 設計模式51
3.5.1 模板模式51
3.5.2 工廠模式52
3.6 小結(jié)54
第4章 Dubbo擴展點加載機制55
4.1 加載機制概述55
4.1.1 Java SPI56
4.1.2 擴展點加載機制的改進57
4.1.3 擴展點的配置規(guī)范59
4.1.4 擴展點的分類與緩存60
4.1.5 擴展點的特性61
4.2 擴展點注解62
4.2.1 擴展點注解:@SPI62
4.2.2 擴展點自適應注解:@Adaptive63
4.2.3 擴展點自動激活注解:@Activate65
4.3 ExtensionLoader的工作原理66
4.3.1 工作流程66
4.3.2 getExtension的實現(xiàn)原理67
4.3.3 getAdaptiveExtension的實現(xiàn)原理70
4.3.4 getActivateExtension的實現(xiàn)原理73
4.3.5 ExtensionFactory的實現(xiàn)原理73
4.4 擴展點動態(tài)編譯的實現(xiàn)76
4.4.1 總體結(jié)構(gòu)77
4.4.2 Javassist動態(tài)代碼編譯78
4.4.3 JDK動態(tài)代碼編譯79
4.5 小結(jié)80
第5章 Dubbo啟停原理解析81
5.1 配置解析81
5.1.1 基于schema設計解析82
5.1.2 基于XML配置原理解析85
5.1.3 基于注解配置原理解析91
5.2 服務暴露的實現(xiàn)原理97
5.2.1 配置承載初始化97
5.2.2 遠程服務的暴露機制97
5.2.3 本地服務的暴露機制105
5.3 服務消費的實現(xiàn)原理106
5.3.1 單注冊中心消費原理106
5.3.2 多注冊中心消費原理113
5.3.3 直連服務消費原理114
5.4 優(yōu)雅停機原理解析115
5.5 小結(jié)116
第6章 Dubbo遠程調(diào)用117
6.1 Dubbo調(diào)用介紹117
6.2 Dubbo協(xié)議詳解119
6.3 編解碼器原理122
6.3.1 Dubbo協(xié)議編碼器123
6.3.2 Dubbo協(xié)議解碼器128
6.4 Telnet調(diào)用原理136
6.4.1 Telnet指令解析原理136
6.4.2 Telnet實現(xiàn)健康監(jiān)測140
6.5 ChannelHandler141
6.5.1 核心Handler和線程模型141
6.5.2 Dubbo請求響應Handler145
6.5.3 Dubbo心跳Handler148
6.6 小結(jié)150
第7章 Dubbo集群容錯151
7.1 Cluster層概述151
7.2 容錯機制的實現(xiàn)153
7.2.1 容錯機制概述153
7.2.2 Cluster接口關(guān)系155
7.2.3 Failover策略157
7.2.4 Failfast策略158
7.2.5 Failsafe策略158
7.2.6 Failback策略159
7.2.7 Available策略160
7.2.8 Broadcast策略160
7.2.9 Forking策略161
7.3 Directory的實現(xiàn)162
7.3.1 總體實現(xiàn)162
7.3.2 RegistryDirectory的實現(xiàn)163
7.4 路由的實現(xiàn)166
7.4.1 路由的總體結(jié)構(gòu)166
7.4.2 條件路由的參數(shù)規(guī)則167
7.4.3 條件路由的實現(xiàn)168
7.4.4 文件路由的實現(xiàn)169
7.4.5 腳本路由的實現(xiàn)170
7.5 負載均衡的實現(xiàn)171
7.5.1 包裝后的負載均衡171
7.5.2 負載均衡的總體結(jié)構(gòu)173
7.5.3 Random負載均衡175
7.5.4 RoundRobin負載均衡176
7.5.5 LeastActive負載均衡178
7.5.6 一致性Hash負載均衡179
7.6 Merger的實現(xiàn)181
7.6.1 總體結(jié)構(gòu)181
7.6.2 MergeableClusterInvoker機制183
7.7 Mock185
7.7.1 Mock常見的使用方式185
7.7.2 Mock的總體結(jié)構(gòu)186
7.7.3 Mock的實現(xiàn)原理187
7.8 小結(jié)189
第8章 Dubbo擴展點190
8.1 Dubbo核心擴展點概述190
8.1.1 擴展點的背景191
8.1.2 擴展點整體架構(gòu)191
8.2 RPC層擴展點192
8.2.1 Proxy層擴展點192
8.2.2 Registry層擴展點194
8.2.3 Cluster層擴展點195
8.3 Remote層擴展點198
8.3.1 Protocol層擴展點199
8.3.2 Exchange層擴展點202
8.3.3 Transport層擴展點203
8.3.4 Serialize層擴展點206
8.4 其他擴展點207
第9章 Dubbo高級特性210
9.1 Dubbo高級特性概述210
9.2 服務分組和版本211
9.3 參數(shù)回調(diào)214
9.4 隱式參數(shù)217
9.5 異步調(diào)用218
9.6 泛化調(diào)用219
9.7 上下文信息220
9.8 Telnet操作221
9.9 Mock調(diào)用224
9.10 結(jié)果緩存226
9.11 小結(jié)226
第10章 Dubbo過濾器227
10.1 Dubbo過濾器概述227
10.1.1 過濾器的使用228
10.1.2 過濾器的總體結(jié)構(gòu)228
10.2 過濾器鏈初始化的實現(xiàn)原理231
10.3 服務提供者過濾器的實現(xiàn)原理233
10.3.1 AccessLogFilter的實現(xiàn)原理233
10.3.2 ExecuteLimitFilter的實現(xiàn)原理234
10.3.3 ClassLoaderFilter的實現(xiàn)原理235
10.3.4 ContextFilter的實現(xiàn)原理237
10.3.5 ExceptionFilter的實現(xiàn)原理237
10.3.6 TimeoutFilter的實現(xiàn)原理238
10.3.7 TokenFilter的實現(xiàn)原理238
10.3.8 TpsLimitFilter的實現(xiàn)原理239
10.4 消費者過濾器的實現(xiàn)原理240
10.4.1 ActiveLimitFilter的實現(xiàn)原理240
10.4.2 ConsumerContextFilter的實現(xiàn)原理242
10.4.3 DeprecatedFilter的實現(xiàn)原理242
10.4.4 FutureFilter的實現(xiàn)原理243
10.5 小結(jié)243
第11章 Dubbo注冊中心擴展實踐245
11.1 etcd背景介紹245
11.2 etcd數(shù)據(jù)結(jié)構(gòu)設計246
11.3 構(gòu)建可運行的注冊中心248
11.3.1 擴展Transporter實現(xiàn)248
11.3.2 擴展RegistryFactory實現(xiàn)249
11.3.3 新增JEtcdClient實現(xiàn)250
11.3.4 擴展FailbackRegistry實現(xiàn)260
11.3.5 編寫單元測試263
11.4 搭建etcd集群并在Dubbo中運行263
11.4.1 單機啟動etcd264
11.4.2 集群啟動etcd265
11.5 小結(jié)266
第12章 Dubbo服務治理平臺267
12.1 服務治理平臺總體結(jié)構(gòu)267
12.2 服務治理平臺的實現(xiàn)原理269
12.3 小結(jié)273
第13章 Dubbo未來展望274
13.1 Dubbo未來生態(tài)274
13.1.1 開源現(xiàn)狀274
13.1.2 后續(xù)發(fā)展275
13.2 云原生281
13.2.1 面臨的挑戰(zhàn)281
13.2.2 Service Mesh簡介283
13.2.3 Dubbo Mesh284
13.3 小結(jié)285