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