[轉]新兵訓練營系列課程——平臺RPC框架介紹

原文:http://weibo.com/p/1001643875439147097368java

 

課程大綱nginx

一、RPC簡介redis

1.1 什麼是RPCspring

1.2 RPC與其餘遠程調用方式比較後端

二、Motan RPC框架服務器

2.1 RPC服務框架網絡

2.2 Motan RPC框架中的角色架構

2.3 Motan RPC的調用流程併發

三、Motan RPC中各角色介紹負載均衡

3.1 註冊中心

3.2 RPC Service

3.3 RPC Client

四、Motan實戰

4.1 Motan的使用方式

4.2 使用Motan提供RPC服務

4.3 使用Motan調用RPC服務

五、總結

六、課後思考

1、RPC簡介

RPC協議具備語言無關、通訊協議無關在大中型分佈式系統中,遠程服務調用是十分關鍵的環節。RPC因爲具備語言無關、簡單高效等特色,在遠程服務調用中有着普遍應用。本文將簡單介紹一下RPC的基本概念,以及微博平臺RPC服務框架的基本原理和使用方式。

一、什麼是RPC?

RPC(Remote Procedure Call)指遠程過程調用,是一種經過網絡調用遠程過程(或方法)的協議。RPC是基於Client/Server模式,Client端攜帶必要參數調用Server端的方法,並獲取Server端返回的方法執行結果。

、高效可靠等特色,很是適合做爲分佈式計算、分佈式服務等遠程交互的基礎協議。RPC協議通常包括協議消息處理、網絡傳輸兩個部分,一個簡單的rpc調用過程以下圖: 

當Client調用遠程的方法時,先將要調用的方法名、參數等信息按RPC協議轉換爲RPC消息,而後再經過某種傳輸協議(TCP、HTTP等)將RPC消息傳輸到Server端。Server端接到請求後將RPC消息按協議轉換爲調用請求,並執行方法,將執行後的結果按相似的過程返回給Client端,完成一次RPC調用。

二、RPC與HTTP、RMI等遠程通訊方式比較

1)、RMI與RPC:

RMI(Remote Method Invocation)是指java語言中的遠程方法調用,RMI中的每一個方法都具備方法簽名,RMI客戶端和服務器端經過方法簽名進行遠程方法調用。RMI只能在java語言中使用,能夠把RMI看做面向對象的java RPC。

2)、HTTP與RPC

HTTP(HyperText Transfer Protocol)是應用層通訊協議,使用標準語義訪問指定資源(圖片、接口等),網絡中的中轉服務器能識別協議內容。HTTP協議是一種資源訪問協議,經過HTTP協議也能夠完成遠程請求並返回請求結果。HTTP的優勢是簡單、易用,可理解性好、而且與語言無關;HTTP協議的缺點是協議頭比較重,通常請求到具體服務器的鏈路較長(可能會有dns解析、nginx代理等)。

相對於HTTP來講,通訊層只是RPC協議的一部分,RPC可使用TCP或者HTTP等做爲通訊協議。除了通訊協議,RPC還包括請求序列化協議,通常RPC框架還會包括一些調度管理能力。RPC相對於HTTP的優勢是可以提供調度、管理能力,使用RPC服務的自動化程度比較高,性能也十分優秀。缺點就是相對複雜,學習成本稍高。

下面就以平臺的RPC框架Motan爲例,介紹一下RPC服務的基本實現及使用方式。

2、Motan RPC服務框架

一、RPC服務框架

通常RPC協議中僅僅包含了client與server之間點對點的調用,在實際的使用當中,還須要考慮服務的發現與服務註銷、提供服務的多臺server的負載均衡、服務的高可用等等一系列的問題。

目前業界比較成熟的RPC框架有阿里開源的Dubbo、Facebook開源的Thrift,以及Avro、Hetty、Grpc等等,其中Thrift、Avro、Hetty、Grpc等都是性能優秀的RPC框架,偏重於跨語言序列化傳輸、在序列化方式、協議擴展、同步異步調用等方面有各自不一樣的優勢,但在RPC服務管理方面功能較少,在分佈式服務應用時還須要進行一些輔助開發。Dubbo則是一個比較完備的服務治理框架,可以提供高性能、透明化的RPC調用,而且擁有強大的服務管理功能。Dubbo雖然功能強大,可是整個框架有些太重,應用起來略微複雜。

考慮到微服務化、動態服務治理等需求,並結合自身業務高併發、服務性能、穩定性要求較高等特色,微博平臺開發了本身的Motan RPC框架。Motan偏重於簡潔實用的服務治理功能和優秀的RPC協議擴展能力,既能夠提供高效的RPC遠程調用,又能提供服務發現、服務高可用(High Available)、負載均衡、服務監控、管理等服務治理功能。經過SPI機制提供強大的擴展能力,能夠支持不一樣的RPC協議、傳輸協議。Motan可以無縫支持Spring配置方式使用RPC服務,經過簡單、靈活的配置就能夠提供或使用RPC服務。經過使用Motan框架,能夠十分方便的進行服務拆分、分佈式服務部署。

二、MotanRPC框架中的三個角色

在Motan框架中,RPC服務調用是由三個角色的交互完成的。首先須要一個服務的提供方Service(也能夠叫作Provider),Service對外提供各類能夠遠程調用的方法(Method);另一個角色叫Client(也能夠叫作Referer或Consumer),Client須要使用Service提供的遠程服務。若是僅有這兩個角色,還不能實現自動化的RPC服務,還須要第三個角色--註冊中心Registry,Registry是用來提供服務發現功能的。

當Service準備對外提供一個RPC服務時,首先須要跟Registry進行服務註冊。當Client須要使用RPC服務時,則須要跟Registry訂閱RPC服務,Registry會把對應服務信息給Client,而且在服務信息變動時,及時通知Client。Client根據Registry提供的服務信息,請求具體的一臺可以提供指定RPC服務的服務器,完成遠程調用。Service、Client、Registry這三個角色的交互以下圖:

例如,Server1這臺服務器跟Registry註冊了「S」這個RPC服務,Registry就保存了「Server1提供S服務」這樣一條信息。Server2也能夠提供「S」服務,也向Register註冊了「S」服務。這時Register中的信息變成了「Server1和Server2都提供S服務」。當Client1須要使用S服務了,它向Register訂閱了S服務,Register告訴Client1:「Server1和Server2都提供S服務」,Client1根據某個策略選擇了調用Server1的S服務完成了RPC調用。後來,Server1不在提供S服務了,Register把這個變化告訴給了Client1,Client1就再也不使用Server1的S服務,而是使用Server2的S服務完成RPC調用。

java語言在使用Motan時,Client與Service經過java接口類來進行RPC調用。例如Service端實現了com.weibo.demo.TestService接口,  Client能夠經過Motan來使用這個接口類中聲明的方法。

三、Motan RPC調用流程

Motan框架中Registry、Service、Client三個角色包含的模塊以及各模塊的交互流程以下:

     其中register模塊用來和註冊中心進行交互,包括註冊服務、訂閱服務、服務變動通知、服務心跳發送等功能;transport模塊用來進行遠程通訊;serialize模塊將rpc請求中的參數、結果等對象進行序列化與反序列化,即進行對象與字節流的互相轉換;protocol模塊用來進行RPC服務的描述和RPC服務的配置管理;cluster模塊包含一組能夠提供RPC服務的具體Server,實際請求時會根據不一樣的HA與負載均衡策略在一組Server中選擇一個可用的發起遠程調用。各模塊的詳細狀況將在下一節進行介紹。

3、Motan中各角色介紹

一、Registry

Motan能夠支持多種Registry模塊,例如zookeeper、consul等均可以做爲註冊中心使用,默認的Registry模塊使用平臺開發的Vintage配置服務。Vintage是一個基於redis的輕量級KV存儲系統,可以提供命名空間服務、服務註冊、服務訂閱等功能。Vintage中的服務是以分組(Group)保存的,通常一個分組以機房+業務線進行命名,如yf-user-rpc。一個分組中包含若干的Service,一個Service即表示java中的一個接口類,可以提供其中的多個方法。

每一個Service下有一組可以提供對應服務的Server,每一個Server在向Registry註冊後,會定時發送心跳,向Registry彙報健康狀態。Server經過心跳開關的開啓與關閉,能夠控制是否對外提供RPC服務。

Client端訂閱Service後,會從Registry中獲得可以提供對應Service的一組Server,Client把這一組Server看做一個提供服務的cluster。當cluster中的Server發生變動時,Client端的register模塊會通知Client進行更新。

二、Motan Service

Service端在啓動RPC服務時的主要步驟以下:

1)、首先經過配置文件生成對應的protocol信息,包括對外提供服務的端口、服務名稱、工做線程數等等

2)、向Vintage(即Registry)註冊RPC服務,包括提供服務的protocol信息、Server的ip、提供服務的端口等。

3)、打開並監聽聲明的RPC服務端口。此時服務處於已經註冊,但未正式提供服務的狀態。

4)、服務驗證經過後,打開心跳開關,Server會定時向Vintage註冊中心彙報健康狀態,此時就能正式對外提供RPC服務了。

在Service端提供服務後,由transport模塊負責監聽rpc服務的端口,並接收client端發送過來的RPC請求。一次完整的Service端處理RPC請求流程以下:

1)、監聽RPC服務端口,由transport模塊接收RPC request,transport模塊默認是使用Netty nio經過TCP長連接方式與Client進行通訊。transport模塊收到請求後將請求轉交給serialize模塊進行解析。

2)、serialize模塊默認使用Hession對RPC請求進行解碼,將請求由字節流轉化爲java對象。

3)、fliter模塊會根據請求的參數作一下過濾策略,例如調用統計、日誌、請求限制等。

4)、protocol負責解析經過filter後的請求對象,根據協議分析出請求想要調用的方法及參數,而後找到提供對應服務的具體對象。

5)、具體服務對象經過反射機制完成服務中方法的調用並返回處理結果。

6)、返回結果經過filter後,在經過serialize模塊將結果對象轉換爲字節流,由transport模塊發送給Client端,完成一次RPC請求的處理。

三、Motan Client

Motan Client端的初始化流程以下:

1)、與Service端同樣,首先會經過配置文件生成對應的protocol信息。

2)、向Registry訂閱所需的RPC服務,獲取提供對應服務的所有Server,這一組Server和HA策略模塊、負載均衡模塊一塊兒組成了一個cluster。

3)、對每一個Server創建初始連接。

在Client完成了初始化流程後,在調用RPC服務時,會有一個選擇Server的過程,當Server選定後的處理過程跟Server端相似。Client調用RPC的流程以下圖:

1)、當進行RPC請求時,會首先經過HA模塊選擇一種高可用策略,例如快速失敗、失敗選擇其餘Server重試等策略,各類策略的參數能夠根據須要進行設置。

2)、而後會經過負載均衡模塊從一組提供服務的Server中選擇一個可用的Server。負載均衡的策略包括一致性哈希、輪詢、併發度、權重等等。

3)、選出Server後,就對這個Server進行RPC請求,圖中的netty client是用來進行點對點的RPC請求,包含了protocol、serialize、transport模塊,請求的處理流程與Service端的流程基本一致,也是經過serialize模塊轉換請求對象,transport模塊來進行通訊。

4、Motan實戰

一、Motan RPC基本使用方式

Motan RPC是按接口提供和調用服務,以java服務爲例,通常由服務提供方聲明服務的接口類,並同時提供一個默認的RPC Client調用配置,而後將接口類與默認的Client配置xml文件一塊兒封裝成jar包。服務提供方和服務使用方共同引入這個jar包,服務提供方對接口類進行實現並對外提供RPC服務;服務使用方加載默認Client端配置文件,直接使用RPC服務。

除了xml配置方式外,Motan也支持API方式,由於xml配置方式比較靈活,而且與spring配置加載徹底兼容,通常推薦使用xml方式配置Motan服務。下面就以xml配置方式分別介紹使用Motan提供、調用RPC服務的具體步驟。

二、使用Motan提供RPC服務

使用Motan提供RPC服務大體須要以下幾步:

1)、聲明RPC接口類,並實現該接口類。

2)、引入Motan相關jar包。

3)、配置服務端xml配置。

4)、部署、啓動服務,驗證服務。

5)、打開心跳開關,正式提供RPC服務

一份基礎的Service端xml配置以下:  

Motan使用了自定義的xml schema,在xml中須要引入對應的schema。Motan的xml配置中包括registry、protocol、service、referer幾個部分,其中registry與protocol是Service端與Client端都要使用的。

registry配置了註冊中心相關的屬性,包括註冊中心ip、prot、超時等;protocol配置了RPC服務相關的屬性,如工做線程數、請求超時、消息長度等;basicService配置了不一樣服務的公共屬性,當一個工程對外提供多個RPC Service的時候,能夠把這些Service的公共屬性配置在basicService中;service則配置了具體的服務屬性,包括對外提供服務的端口、對外提供服務的具體服務實現類bean等。

除了這些基礎屬性外,每一個配置標籤下還支持大量的高級屬性,如訪問控制、filter策略等等,這裏就不在一一講解了。

三、使用Motan調用RPC服務

使用Motan RPC服務就相對簡單一些,通常服務提供方已經給出了默認的client配置,只須要在項目中加載xml配置,就能夠像使用本地的spring bean同樣直接使用RPC服務了。步驟以下:

1)、引入Motan相關jar包及RPC服務接口jar包。

2)、加載RPC接口jar包中的默認xml配置

3)、直接使用xml中聲明的refer bean。

Client端基本配置以下:

其中registry、protocol部分與Service端的配置一致。basicRefer配置是多個RPC服務時的公共配置,例如請求超時控制、服務端異常是否拋出等;referer表示對服務實現類的遠程引用,配置了使用的服務接口類等屬性。

若是想使用自定義的Client端配置,也能夠按schema中的屬性單獨配置xml,加載後就能夠生效。另外在Client端還能夠進行一些更細化的配置包括對一個接口類中不一樣方法的詳細配置,能夠根據具體的業務場景進行配置。

5、總結

     RPC服務在分佈式系統中有着愈來愈普遍的應用,本文簡單介紹了RPC的基本概念、平臺RPC框架Motan的基本結構、Motan中的三個角色的交互流程以及基本的使用方式。經過簡單配置就可以使用RPC服務了。固然,若是須要對RPC服務進行更精細的控制,能夠經過schema中的特定屬性進行配置或者使用不一樣擴展模塊來實現。

6、課後思考

一、遠程服務的不一樣調用方式、RPC與HTTP的區別以及適用的場景。

二、Motan RPC框架中的三個角色及各角色之間的交互過程。

三、RPC請求的調用過程。

------------------新兵訓練營簡介------------------

微博平臺新兵訓練營活動是微博平臺內部組織的針對新入職同窗的團隊融入培訓課程,目標是團隊融入,包括人的融入,氛圍融入,技術融入。當前已經進行4期活動,不少學員迅速成長爲平臺技術骨幹。

微博平臺是很是注重團隊成員融入與成長的團隊,在這裏有人幫你融入,有人和你一塊兒成長,也歡迎小夥伴們加入微博平臺,歡迎私信諮詢。

------------------講師簡介------------------

張雷,@rayzhang0603 微博平臺及大數據部——平臺研發高級系統研發工程師,2012年7月畢業於太原科技大學,13年加入微博平臺,前後負責開放平臺、粉服開發者、MotanRPC等後端服務架構工做,有着豐富的系統的架構設計與優化經驗。新兵訓練營第二期學員。

相關文章
相關標籤/搜索