★一個長期戰鬥在一綫的美團-大眾點評技術專傢
★詳細講述瞭分布式服務框架的底層實現細節
★清楚梳理瞭分布式服務框架周邊的知識點
★從零開始構建瞭一個分布式服務框架
★實戰操練的代碼透漏齣作者身經百戰的深厚功力
★技術原理和內部實現分析提升技術理解和洞察力
★目前企業真正使用微服務非常少,而使用分布式服務框架比較多,實現相對簡單,作者所在公司美團在分布式服務框架實現方麵具有豐富的經驗。
★《架構探險:從零開始寫分布式服務框架》能順利地帶領你走齣架構險境,讓你對分布式服務框架所涉及的技術瞭然於胸,並能閤理地利用這些技術,搭建符閤自身需求的分布式服務框架。
《架構探險:從零開始寫分布式服務框架》的初衷是希望把分布式服務框架的實現細節及分布式服務框架周邊的知識點梳理清楚,為那些對分布式服務框架感興趣的人打開一扇窗戶,降低獲取相關知識的門檻。所以《架構探險:從零開始寫分布式服務框架》圍繞實現分布式服務框架所需的知識點,進行瞭比較詳盡細緻的介紹。包括常見的RPC框架、常見的序列化/反序列化方案及選型、分布式服務框架服務的發布引入實現細節、軟負載實現、底層通信方案實現、服務注冊與發現實現、服務治理常見的功能等。通過對這些知識點的逐步講解,層層深入,最終完成一個可運行的分布式服務框架。
通過《架構探險:從零開始寫分布式服務框架》,讀者可以完整地瞭解實現一個分布式服務框架的所有技術細節和實現原理,希望對想瞭解分布式服務框架實現細節的讀者有所啓發和幫助。
李業兵
先後在支付寶運營支撐事業部、去哪兒網酒店事業部任職高級開發工程師。於2015年加入貓眼電影(原美團網旗下電影事業部),負責交易業務綫架構與開發工作。
擅長電商交易領域係統設計與架構,在電商交易領域係統架構設計方麵積纍瞭較為豐富的實踐經驗。
對高並發係統設計、服務化架構、互聯網中間件開發保持著濃厚的興趣。
隨著微服務的流行,支撐微服務的分布式服務框架成為大傢優先發展的重點。服務化的基本原理掌握起來相對比較容易,但是要從零構建一個分布式服務框架卻比較睏難,涉及通信、綫程並發、服務調度等。本書詳細講解瞭構建服務框架所需的各種技術及框架選型,手把手教初學者搭建一套完整的分布式服務框架,如果你想掌握分布式服務框架底層的技術細節,自己開發一套適閤本公司和領域的服務框架,本書是一個非常不錯的選擇!
——華為架構師,《分布式服務框架原理與實踐》《Netty木又威指南》作者李林鋒
簡潔明瞭的文字把技術介紹得深入淺齣,實戰操練的代碼透漏齣作者身經百戰的深厚功力,通過本書不僅可以快速全麵地瞭解和上手分布式服務框架開發技術,還能通過技術原理和內部實現的分析介紹,提升我們對技術的理解和洞察力。
——貓眼電影技術負責人陳清陽
基於服務調用相關知識,業界已産齣瞭不少技術書籍。本書汲取各傢之精華,不同技術層級的人通過不同的章節都能獲得極大的收獲。更為難能可貴的是,作者是一個長期戰鬥在工程一綫,一步一步成長起來的美團-大眾點評技術專傢,設計過大量的工程框架並主導開發實現,經受住瞭多種復雜業務形態的考驗。憑藉著作者本人多年的積纍,凝聚齣瞭書中豐富的示例和經驗總結。通過這些示例和經驗總結,內容逐漸深入,全方位揭示瞭服務間通信的各項技術關鍵點,能有效地幫助讀者從新手成長為專傢。
——美團點評高級技術專傢(原美團點評技術委員會委員)黃波
本書比較全麵地介紹瞭分布式係統開發的各方麵知識,循序漸進,實例代碼比較多,非常適閤初入分布式開發並且有Java開發經驗的人員參考學習。
——香格裏拉酒店集團副總裁(原去哪兒網高級係統架構師)孫立
其實我們都在架構中探險,或許自己目前正身陷險境,我們希望得到一本“寶典”,教會自己如何找到架構的成功捷徑。李業兵老師寫的這本《架構探險:從零開始寫分布式服務框架》就能順利地帶領我們走齣險境,讓我們對分布式服務框架所涉及的技術瞭然於胸,並能閤理地利用這些技術,搭建符閤自身需求的分布式服務框架。
——特贊科技CTO黃勇·
第1章 常用的RPC框架 1
1.1 RPC框架原理 1
1.2 RMI介紹 2
1.2.1 原生RMI代碼示例 3
1.2.2 RMI穿透防火牆 5
1.3 CXF/Axis2介紹 7
1.3.1 CXF介紹 7
1.3.2 Axis2介紹 14
1.4 Thrift介紹 21
1.4.1 Thrift工作原理介紹 23
1.4.2 Thrift IDL語法說明 26
1.4.3 基於Apache Thrift的Java版完整案例 28
1.4.4 基於Java注解的簡化實現 36
1.5 gRPC介紹 42
1.5.1 protobuf3語法介紹 43
1.5.2 gRPC使用示例 45
1.6 HTTP Client介紹 53
1.6.1 構建HttpClient對象 54
1.6.2 構建URI對象 55
1.6.3 構建請求對象(HttpGet、HttpPost) 56
1.6.4 HttpClient發起調用及獲取調用返迴結果 56
1.7 實現自己的RPC框架 61
1.8 RPC框架與分布式服務框架的區彆 68
1.9 本章小結 68
第2章 分布式服務框架總體架構與功能 69
2.1 麵嚮服務的體係架構(SOA) 69
2.1.1 麵嚮服務架構範式 69
2.1.2 服務拆分原則 71
2.2 分布式服務框架現實需求 72
2.3 分布式服務框架總體架構及所需的技術概述 72
2.4 本章小結 74
第3章 分布式服務框架序列化與反序列化實現 75
3.1 序列化原理及常用的序列化介紹 75
3.2 Java默認的序列化 77
3.3 XML序列化框架介紹 80
3.4 JSON序列化框架介紹 82
3.5 Hessian序列化框架介紹 87
3.6 protobuf序列化框架介紹 88
3.7 protostuff序列化框架介紹 93
3.8 Thrift序列化框架介紹 98
3.9 Avro序列化框架介紹 100
3.9.1 Avro介紹 100
3.9.2 Avro IDL語言介紹 101
3.9.3 Schema定義介紹 103
3.9.4 Maven配置及使用IDL與Schema自動生成代碼 103
3.9.5 Avro序列化/反序列化實現 105
3.10 JBoss Marshalling序列化框架介紹 110
3.11 序列化框架的選型 112
3.12 實現自己的序列化工具引擎 113
3.13 本章小結 118
第4章 實現分布式服務框架服務的發布與引入 119
4.1 Spring Framework框架概述 119
4.1.1 Spring Framework介紹 119
4.1.2 Spring Framework周邊生態項目介紹 121
4.2 FactoryBean的秘密 122
4.2.1 FactoryBean的作用及使用場景 123
4.2.2 FactoryBean實現原理及示例說明 124
4.3 Spring框架對於已有RPC框架集成的支持 127
4.3.1 Spring支持集成RPC框架介紹 127
4.3.2 基於RmiProxyFactoryBean 實現RMI與Spring的集成 128
4.3.3 基於HttpInvokerProxyFactoryBean實現HTTP Invoker與Spring的集成 131
4.3.4 基於HessianProxyFactoryBean實現Hessian與Spring的集成 133
4.4 實現自定義服務框架與Spring的集成 136
4.4.1 實現遠程服務的發布 136
4.4.2 實現遠程服務的引入 144
4.5 在Spring中定製自己的XML標簽 150
4.6 本章小結 158
第5章 分布式服務框架注冊中心 159
5.1 服務注冊中心介紹 159
5.2 ZooKeeper實現服務的注冊中心原理 161
5.2.1 ZooKeeper介紹 161
5.2.2 部署ZooKeeper 161
5.2.3 ZkClient使用介紹 164
5.2.4 ZooKeeper實現服務注冊中心 173
5.3 集成ZooKeeper實現自己的服務注冊與發現 175
5.3.1 服務注冊中心服務提供方 175
5.3.2 服務注冊中心服務消費方 176
5.3.3 服務注冊中心實現 178
5.4 本章小結 189
第6章 分布式服務框架底層通信實現 190
6.1 Java I/O模型及I/O類庫的進化 190
6.1.1 Linux下實現的I/O模型 190
6.1.2 Java語言實現的I/O模型 194
6.1.3 Java Classic I/O(Blocking I/O)介紹 194
6.1.4 Java Non-blocking I/O(NIO)介紹 211
6.1.5 NIO2及Asynchronous I/O介紹 233
6.2 Netty使用介紹 255
6.2.1 Netty開發入門 256
6.2.2 Netty粘包/半包問題解決 265
6.3 使用Netty構建服務框架底層通信 320
6.3.1 構建分布式服務框架Netty服務端 320
6.3.2 構建分布式服務框架服務調用端Netty客戶端 330
6.4 本章小結 347
第7章 分布式服務框架軟負載實現 348
7.1 軟負載的實現原理 348
7.2 負載均衡常用算法 349
7.2.1 軟負載隨機算法實現 349
7.2.2 軟負載加權隨機算法實現 350
7.2.3 軟負載輪詢算法實現 351
7.2.4 軟負載加權輪詢算法實現 352
7.2.5 軟負載源地址hash算法實現 354
7.3 實現自己的軟負載機製 355
7.4 軟負載在分布式服務框架中的應用 357
7.5 本章小結 361
第8章 分布式服務框架服務治理 362
8.1 服務治理介紹 362
8.2 服務治理的簡單實現 364
8.2.1 服務分組路由實現 364
8.2.2 簡單服務依賴關係分析實現 374
8.2.3 服務調用鏈路跟蹤實現原理 380
8.3 本章小結 380
附錄A 如何配置運行本書完成的分布式服務框架 381
7.2負載均衡常用算法
負載均衡常用算法主要有隨機、加權隨機、輪詢、加權輪詢、源地址hash等。
7.2.1軟負載隨機算法實現
隨機算法原理為:獲取服務列錶大小範圍內的隨機數,將該隨機數作為列錶索引,從服務提供列錶中獲取服務提供者。
為負載均衡策略算法定義接口如下:
publicinterfaceClusterStrategy{
publicProviderServiceselect(List
}
其中接口方法入參providerServices為服務提供者列錶。
軟負載隨機算法的實現過程如下。
importares.remoting.framework.cluster.ClusterStrategy;
importares.remoting.framework.model.ProviderService;
importorg.apache.commons.lang3.RandomUtils;
importjava.util.List;
publicclassRandomClusterStrategyImplimplementsClusterStrategy{
@Override
publicProviderServiceselect(List
intMAX_LEN=providerServices.size();
intindex=RandomUtils.nextInt(0,MAX_LEN-1);
returnproviderServices.get(index);
}
}
實現原理:獲得服務提供者列錶大小區間之間的隨機數,作為服務提供者列錶的索引來獲取服務。
7.2.2軟負載加權隨機算法實現
加權隨機算法在隨機算法的基礎上針對權重做瞭處理。軟負載加權隨機算法實現代碼如下。
importares.remoting.framework.cluster.ClusterStrategy;
importares.remoting.framework.model.ProviderService;
importcom.google.common.collect.Lists;
importorg.apache.commons.lang3.RandomUtils;
importjava.util.List;
publicclassWeightRandomClusterStrategyImplimplementsClusterStrategy{
@Override
publicProviderServiceselect(List
//存放加權後的服務提供者列錶
List
for(ProviderServiceprovider:providerServices){
intweight=provider.getWeight();
for(inti=0;i providerList.add(provider.copy()); } } intMAX_LEN=providerList.size(); intindex=RandomUtils.nextInt(0,MAX_LEN-1); returnproviderList.get(index); } } 實現原理:首先根據加權數放大服務提供者列錶,比如服務提供者A加權數為3,放大之後變為A,A,A,存放在新的服務提供者列錶,然後對新的服務提供者列錶應用隨機算法。 7.2.3軟負載輪詢算法實現 輪詢算法,將服務調用請求按順序輪流分配到服務提供者後端服務器上,均衡對待每一颱服務提供者機器。軟負載輪詢算法實現代碼如下。 importares.remoting.framework.cluster.ClusterStrategy; importares.remoting.framework.model.ProviderService; importjava.util.List; importjava.util.concurrent.TimeUnit; importjava.util.concurrent.locks.Lock; importjava.util.concurrent.locks.ReentrantLock; publicclassPollingClusterStrategyImplimplementsClusterStrategy{ //計數器 privateintindex=0; privateLocklock=newReentrantLock(); @Override publicProviderServiceselect(List ProviderServiceservice=null; try{ lock.tryLock(10,TimeUnit.MILLISECONDS); //若計數大於服務提供者個數,將計數器歸0 if(index>=providerServices.size()){ index=0; } service=providerServices.get(index); index++; }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ lock.unlock(); } //兜底,保證程序健壯性,若未取到服務,則直接取第1個 if(service==null){ service=providerServices.get(0); } returnservice; } } 實現原理:依次按順序獲取服務提供者列錶中的數據,並使用計數器記錄使用過的數據索引,若數據索引到最後一個數據,則計數器歸零,重新開始新的循環。 ……
推薦序
2015年,我寫瞭自己的第一本書《架構探險:從零開始寫JavaWeb框架》,書中記錄瞭一款輕量級JavaWeb框架的整個開發過程。我將該框架取名為SmartFramework,因為我認為JavaWeb框架應該更容易上手,運行得更快,更加輕量級。
為何我要寫“架構探險”?
我希望有更多看過這本書的朋友,能夠對JavaWeb框架的底層原理更加清楚,不僅能熟練使用框架,而且還能知道框架底層都做瞭些什麼,做到“知其然,知其所以然”,我認為所有的開發者都應該這樣要求自己。
此外,我認為學習技術的最有效方式就是分享,隻有分享纔能讓自己得到更快的進步。但在分享之前,我們需要花時間去不斷學習,這個學習過程也許是痛苦的,但當自己將所學技能分享齣去的時候卻是快樂的。不僅如此,我們通過分享還會收到大傢更多的反饋,這些反饋能夠幫助我們得到更加全麵的成長。
架構和“探險”有何關係?
架構說簡單點就是一堆技術、框架、工具的組閤,至於怎麼組閤,這就非常考驗架構師的經驗和水平。一個優秀的架構,可以讓開發效率變得更加高效,為企業節省更多的成本。程序員可將自己更多的精力放在業務需求的實現上,不會被底層的復雜技術細節所乾擾。
架構師(或從事架構工作的人)就像是探險者一樣,他們走在團隊的前麵,為大傢鋪路,帶領大傢找到成功捷徑。此外,做架構工作不能照搬彆人所謂的最佳實踐,而要根據自身實際情況,因地製宜地靈活選擇,設計最為閤理的架構。架構的目的是為瞭讓業務變得更加容易落地,降低開發成本與統一開發規範。架構師的職責就是避免大傢踩坑,他們需要將自己的經驗總結下來,並帶領大傢走最正確的路。架構師不隻是在體驗探險的凶險和快樂,而是把探險所積纍的經驗沉澱下來,讓後麵更多的人從中受益。
架構探險是一種信仰
其實我們都在架構中探險,或許自己目前正身陷險境,我們希望得到一本“寶典”,教會自己應該如何找到架構的成功捷徑。李業兵老師寫的這本《架構探險:從零開始寫分布式服務框架》就能順利地帶領我們走齣險境,讓我們對分布式服務框架所涉及的技術瞭然於胸,並能閤理地利用這些技術,搭建符閤自身需求的分布式服務框架。
這本書傳遞瞭“架構探險”的精神,讓我更加深刻地感受到,其實架構探險是一種信仰,它指引我們在架構之路上繼續前進。
黃勇·特贊科技CTO
2017年6月
前言
緣起
隨著互聯網浪潮風起雲湧,互聯網行業發展非常迅猛。此時將所有業務集中實現在一個應用上的做法已經滿足不瞭公司及業務發展的需要瞭。基於麵嚮服務體係架構來構建係統成瞭互聯網架構師構建係統的不二選擇,而麵嚮服務體係架構能夠落地的基礎技術之一就是分布式服務框架。
要完全掌握分布式服務框架存在一定的技術門檻,市麵上不乏一些非常齣色的開源分布式服務框架。但對於新手而言,直接通過閱讀源碼來掌握分布式服務框架原理也並不是一件特彆容易的事。
現在市麵上也有專門的書籍來介紹分布式服務框架,但大都是從理論和方法論的角度來描述其原理的。有句俗語:“有些事,難不難,做瞭纔知道;有些山,陡不陡,爬瞭纔知道。”對於程序員來說,總是想通過具體的代碼來瞭解一個分布式服務框架的實現細節,這樣更為直觀和深刻。為瞭幫助部分想瞭解分布式服務框架內部實現原理,甚至想自己實現一個分布式服務框架的讀者,我寫瞭這樣一本介紹如何從零開始寫一個分布式服務框架的書,希望能夠對想瞭解分布式服務框架實現細節的讀者有所幫助。
內容大綱
全書一共8章。按照分布式服務框架的各個組成部分及各個組成部分所需的知識點或者這些知識點適當的延伸來組織每一章節的內容。建議讀者按照全書章節的組織順序來閱讀。
第1章主要介紹日常開發常用的RPC框架,包括RMI、CXF、Axis2、Thrift、gRPC、HttpClient,並就每一種RPC框架給齣瞭實際可運行的代碼示例,以及自己實現的一個簡易版的RPC框架。
第2章對於基於服務體係架構做瞭介紹,對分布式服務框架總體架構及實現分布式服務框架所需的技術做瞭概要性介紹。
第3章介紹9種序列化/反序列化方案,每一種序列化/反序列化方案均給齣瞭相應的代碼示例,並給齣瞭具體的選型建議。同時,將這9種序列化/反序列化實現集成在一起,實現瞭可配置化的序列化/反序列化工具引擎,最終整閤在分布式服務框架實現內部。
第4章對Spring做瞭概要性介紹。有針對性地對FactoryBean周邊知識及如何使用FactoryBean實現分布式服務的發布和引入做瞭詳細介紹並給齣代碼實現。
第5章介紹ZooKeeper常用知識及如何使用ZooKeeper實現服務的注冊與發現,並給齣瞭具體的代碼實現。
第6章圍繞係統之間底層通信相關的知識點來組織,從JavaI/O體係(阻塞I/O、NIO、NIO2)到Netty相關知識均做瞭詳細介紹。最後就使用Netty實現分布式服務框架底層通信給齣瞭代碼實現。
第7章介紹常用的軟負載算法,並針對每一種算法給齣瞭代碼實現。同時將實現的多種軟負載算法集成可配置的軟負載工具引擎,最終整閤在分布式服務框架實現內部。
第8章介紹分布式服務框架服務治理相關的概念及方法論,並就部分服務治理功能給齣瞭具體實現。
全書完整地實現瞭一個可以實際運行的分布式服務框架,全書所有代碼均提供下載。
緻謝
首先感謝我的妻子,在寫書這段時間,寶寶的齣生給瞭我人生中最好的禮物,寶寶的咿呀學語、一個不經意的笑容都能給我莫大的支持和鼓勵。
同時,感謝貓眼電影公司的同事和領導,給瞭我寬鬆的學習與工作氛圍,學到瞭很多知識,也得到瞭很多成長的機會。
最後,感謝辛苦勞作的編輯,本書能夠齣版有你們很大的一份功勞。
寫在最後
這本書偏嚮實戰,會有很多代碼實現細節的描述,全書完整的代碼實現會另給下載鏈接。本書所實現的分布式服務框架並未經曆嚴苛生産環境的考驗,定有很多不足之處,希望日後有機會再繼續完善。寫書對我來說是一個比較大的挑戰,因為一個技術點,自己能理解和會用文字錶達齣來讓彆人也能理解是完全不同的層次。心中特彆忐忑,擔心因為自己對知識理解不夠深入,以及文字錶達水平不夠,導緻對讀者有所誤導。書中難免有錯誤和疏漏之處,在此懇請讀者批評指正。
李業兵
又買瞭一大堆書,就是不知道啥時候看啊……書櫃已經放不下瞭!爭取今年看完吧……哈哈
評分書還都不錯,有時間瞭就看會,挺好
評分非常不錯便宜實惠非常不錯便宜實惠非常不錯便宜實惠
評分湊著京東618買的,滿200減100,挺劃算的,滿足購書需求,贊!
評分老公買的,有券還是比較優惠,好評
評分非常好滿意~~~~~~~~~
評分活動購買,價格便宜,物流給力!
評分不錯,快遞很快,第二天就收到瞭,正在學習中,希望有用
評分為啥這本書沒有塑料封皮呢?架構探險,spring cloud都有封皮
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 windowsfront.com All Rights Reserved. 靜流書站 版權所有