本書作者具有豐富的分布式服務(wù)框架、平臺(tái)中間件的架構(gòu)設(shè)計(jì)和實(shí)踐經(jīng)驗(yàn),主導(dǎo)設(shè)計(jì)的華為分布式服務(wù)框架已經(jīng)在全球數(shù)十個(gè)國家成功商用。書中依托工作實(shí)踐,從分布式服務(wù)框架的架構(gòu)設(shè)計(jì)原理到實(shí)踐經(jīng)驗(yàn)總結(jié),涵蓋了服務(wù)化架構(gòu)演進(jìn)、訂閱發(fā)布、路由策略、集群容錯(cuò)和服務(wù)治理等多個(gè)專題,全方位剖析服務(wù)框架的設(shè)計(jì)原則和原理,結(jié)合大量實(shí)踐案例與讀者分享作者對(duì)分布式服務(wù)框架設(shè)計(jì)和運(yùn)維的體會(huì)。同時(shí),對(duì)基于Docker部署微服務(wù)以及基于微服務(wù)架構(gòu)開發(fā)、部署和運(yùn)維業(yè)務(wù)系統(tǒng)進(jìn)行了詳細(xì)介紹。
1、微服務(wù)是當(dāng)前非常熱的技術(shù)關(guān)鍵詞之一,那么微服務(wù)如何落地呢?首先要實(shí)現(xiàn)服務(wù)化,微服務(wù)架構(gòu)是一種服務(wù)化架構(gòu)風(fēng)格!斗植际椒⻊(wù)框架原理與實(shí)踐》對(duì)如何構(gòu)建分布式服務(wù)化系統(tǒng),提供了原理分析、關(guān)鍵技術(shù)、開發(fā)案例以及業(yè)界技術(shù)對(duì)比,非常系統(tǒng)化,不論是學(xué)習(xí)分布式服務(wù)技術(shù)還是深入大型互聯(lián)網(wǎng)架構(gòu)都非常實(shí)用。2、《分布式服務(wù)框架原理與實(shí)踐》作者李林鋒多年來在華為一直從事核心代碼的架構(gòu)設(shè)計(jì)和開發(fā),屬于實(shí)戰(zhàn)型架構(gòu)師,這本書集合了他多年的架構(gòu)思路,書中內(nèi)容組織清晰,圖例詳實(shí),非常便于理解與吸收。3、《分布式服務(wù)框架原理與實(shí)踐》首先分析了作為一個(gè)分布式服務(wù)框架所需具備的能力,包括服務(wù)注冊(cè)中心、服務(wù)調(diào)用、服務(wù)路由、服務(wù)發(fā)布/灰度發(fā)布等;接著分析了服務(wù)底層如何有效地進(jìn)行通信,包括通信框架、序列化/反序列化及協(xié)議棧等;然后分析了服務(wù)如何做到高可靠性及高安全性等重要特性;*后也闡述了從服務(wù)化如何向微服務(wù)演進(jìn)。干貨滿滿!
李林鋒,現(xiàn)任華為PaaS平臺(tái)架構(gòu)師,8年Java NIO通信框架、平臺(tái)中間件架構(gòu)設(shè)計(jì)和開發(fā)經(jīng)驗(yàn),主導(dǎo)設(shè)計(jì)和開發(fā)的華為分布式服務(wù)框架已經(jīng)在全球數(shù)十個(gè)國家成功商用。精通Netty、Mina、RPC框架、企業(yè)ESB總線、分布式服務(wù)框架等技術(shù),《Netty權(quán)威指南》作者,公司總裁技術(shù)創(chuàng)新獎(jiǎng)獲得者。
微博、微信:Nettying
微信公眾號(hào):Netty之家
第1 章 應(yīng)用架構(gòu)演進(jìn) ...................................................................................... 1
1.1 傳統(tǒng)垂直應(yīng)用架構(gòu) .................................................................................. 2
1.1.1 垂直應(yīng)用架構(gòu)介紹 ............................................................................. 2
1.1.2 垂直應(yīng)用架構(gòu)面臨的挑戰(zhàn) .................................................................. 4
1.2 RPC 架構(gòu) ....................................................................................................... 6
1.2.1 RPC 框架原理 .................................................................................... 6
1.2.2 *簡(jiǎn)單的RPC 框架實(shí)現(xiàn) .................................................................... 8
1.2.3 業(yè)界主流RPC 框架 .......................................................................... 14
1.2.4 RPC 框架面臨的挑戰(zhàn) ....................................................................... 17
1.3 SOA 服務(wù)化架構(gòu) ......................................................................................... 18
1.3.1 面向服務(wù)設(shè)計(jì)的原則........................................................................ 18
1.3.2 服務(wù)治理 .......................................................................................... 19
1.4 微服務(wù)架構(gòu) .................................................................................................. 21
1.4.1 什么是微服務(wù) ................................................................................... 21
1.4.2 微服務(wù)架構(gòu)對(duì)比SOA ....................................................................... 22
1.5 總結(jié) ............................................................................................................. 23
第2 章 分布式服務(wù)框架入門 .................................................................................... 25
2.1 分布式服務(wù)框架誕生背景 ........................................................................... 26
2.1.1 應(yīng)用從集中式走向分布式 ................................................................ 26?
2.1.2 亟需服務(wù)治理 ................................................................................... 28
2.2 業(yè)界分布式服務(wù)框架介紹 ........................................................................... 29
2.2.1 阿里Dubbo ....................................................................................... 30
2.2.2 **HSF .......................................................................................... 33
2.2.3 亞馬遜Coral Service ........................................................................ 35
2.3 分布式服務(wù)框架設(shè)計(jì) ................................................................................... 36
2.3.1 架構(gòu)原理 .......................................................................................... 36
2.3.2 功能特性 .......................................................................................... 37
2.3.3 性能特性 .......................................................................................... 39
2.3.4 可靠性 .............................................................................................. 39
2.3.5 服務(wù)治理 .......................................................................................... 40
2.4 總結(jié) ............................................................................................................. 41
第3 章 通信框架 ..................................................................................................... 42
3.1 關(guān)鍵技術(shù)點(diǎn)分析 ........................................................................................... 43
3.1.1 長(zhǎng)連接還是短連接 ........................................................................... 43
3.1.2 BIO 還是NIO ................................................................................... 43
3.1.3 自研還是選擇開源NIO 框架 ........................................................... 46
3.2 功能設(shè)計(jì) ...................................................................................................... 47
3.2.1 服務(wù)端設(shè)計(jì) ....................................................................................... 48
3.2.2 客戶端設(shè)計(jì) ....................................................................................... 50
3.3 可靠性設(shè)計(jì) .................................................................................................. 53
3.3.1 鏈路有效性檢
8.2.2 異步服務(wù)調(diào)用
基于JDK的Future機(jī)制,可以非常方便地實(shí)現(xiàn)異步服務(wù)調(diào)用,JDK的Future接口定義如圖8-5所示。
JDK原生的Future主要用于異步操作,它代表了異步操作的執(zhí)行結(jié)果,用戶可以通過調(diào)用它的get方法獲取結(jié)果。如果當(dāng)前操作沒有執(zhí)行完,get操作將阻塞調(diào)用線程。
在實(shí)際項(xiàng)目中,往往會(huì)擴(kuò)展JDK的Future,提供Future-Listener機(jī)制,它支持主動(dòng)獲取和被動(dòng)異步回調(diào)通知兩種模式,適用于不同的業(yè)務(wù)場(chǎng)景。
以Netty的Future接口定義為例,新增了監(jiān)聽器管理接口,監(jiān)聽器主要用于異步通知回調(diào)。
異步服務(wù)調(diào)用的工作流程如下:
1) 消費(fèi)者調(diào)用服務(wù)端發(fā)布的接口,接口調(diào)用由分布式服務(wù)框架包裝成動(dòng)態(tài)代理,發(fā)起遠(yuǎn)程服務(wù)調(diào)用。
2) 通信框架異步發(fā)送請(qǐng)求消息,如果沒有發(fā)生I/O異常,返回。
3) 請(qǐng)求消息發(fā)送成功后,I/O線程構(gòu)造Future對(duì)象,設(shè)置到RPC上下文中。
4) 用戶線程通過RPC上下文獲取Future對(duì)象。
5) 構(gòu)造Listener對(duì)象,將其添加到Future中,用于服務(wù)端應(yīng)答異步回調(diào)通知。
6) 用戶線程返回,不阻塞等待應(yīng)答。
7) 服務(wù)端返回應(yīng)答消息,通信框架負(fù)責(zé)反序列化等。
8) I/O線程將應(yīng)答設(shè)置到Future對(duì)象的操作結(jié)果中。
9) Future對(duì)象掃描注冊(cè)的監(jiān)聽器列表,循環(huán)調(diào)用監(jiān)聽器的operationComplete方法,將結(jié)果通知給監(jiān)聽器,監(jiān)聽器獲取到結(jié)果之后,繼續(xù)后續(xù)業(yè)務(wù)邏輯的執(zhí)行,異步服務(wù)調(diào)用結(jié)束。
需要指出的是,還有另外一種異步服務(wù)調(diào)用形式,就是不添加Listener,用戶連續(xù)發(fā)起N次服務(wù)調(diào)用,然后依次從RPC上下文中獲取Future對(duì)象,*終再主動(dòng)get結(jié)果,業(yè)務(wù)線程阻塞,相比于老的同步服務(wù)調(diào)用,它的阻塞時(shí)間更短,其工作原理如圖8-8所示。
異步服務(wù)調(diào)用的代碼示例如下:
xxxService1.xxxMethod(Req);
Future f1 = RpcContext.getContext().getFuture();
xxxService2.xxxMethod(Req);
Future f2 = RpcContext.getContext().getFuture();
Object xxResult1 = f1.get(3000);
Object xxResult2 = f2.get(3000); }
假如xxxService1和xxxService2發(fā)布成異步服務(wù),則調(diào)用xxxMethod之后當(dāng)前業(yè)務(wù)線程不阻塞,立即返回null。用戶不能直接使用它的返回值,而是通過當(dāng)前線程上下文RPCContext獲取異步操作結(jié)果Future。獲取到Future之后繼續(xù)發(fā)起其他異步服務(wù)調(diào)用,然后獲取另一個(gè)Future……*后,通過Future的get方法集中獲取結(jié)果。無論有多少個(gè)Future,采用此種方式用戶線程*長(zhǎng)阻塞時(shí)間為耗時(shí)*長(zhǎng)的Future,即T = Max t(future1....N)。如果采用同步服務(wù)調(diào)用,用戶線程的阻塞時(shí)間T = t(future1) + t(future2) + ……+ t(futureN)。
異步服務(wù)調(diào)用相比于同步服務(wù)調(diào)用有兩個(gè)優(yōu)點(diǎn):
◎ 化串行為并行,提升服務(wù)調(diào)用效率,減少業(yè)務(wù)線程阻塞時(shí)間。
◎ 化同步為異步,避免業(yè)務(wù)線程阻塞。
由于每次服務(wù)調(diào)用都是同步阻塞,三個(gè)服務(wù)調(diào)用總耗時(shí)為T = T1 + T2 + T3。下面我們看下采用異步服務(wù)調(diào)用之后的優(yōu)化效果。
采用異步服務(wù)調(diào)用模式,*后調(diào)用三個(gè)服務(wù)異步操作結(jié)果Future的get方法同步等待應(yīng)答,它的總執(zhí)行時(shí)間T = Max(T1, T2, T3),相比于同步服務(wù)調(diào)用,性能提升效果非常明顯。
第二種基于Future-Listener的純異步服務(wù)調(diào)用,它的代碼示例如下:
xxxService1.xxxMethod(Req);
Future f1 = RpcContext.getContext().getFuture();
Listener l = new xxxListener();
f1.addListener(l);
......后續(xù)代碼省略 }
基于Future-Listener的異步服務(wù)調(diào)用相比于Future-get模式更好,但是在實(shí)際使用中有一定的局限性,具體的使用限制留給讀者自己思考。