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