平臺(tái)RPC框架介紹

2021-12-13 15:59 更新

原文出處:http://weibo.com/p/1001643875439147097368


dd

作者:

課程大綱

一、RPC簡(jiǎn)介

RPC協(xié)議具有語(yǔ)言無(wú)關(guān)、通信協(xié)議無(wú)關(guān)在大中型分布式系統(tǒng)中,遠(yuǎn)程服務(wù)調(diào)用是十分關(guān)鍵的環(huán)節(jié)。RPC由于具有語(yǔ)言無(wú)關(guān)、簡(jiǎn)單高效等特點(diǎn),在遠(yuǎn)程服務(wù)調(diào)用中有著廣泛應(yīng)用。本文將簡(jiǎn)單介紹一下RPC的基本概念,以及微博平臺(tái)RPC服務(wù)框架的基本原理和使用方式。

1、什么是RPC?

RPC(Remote Procedure Call)指遠(yuǎn)程過(guò)程調(diào)用,是一種通過(guò)網(wǎng)絡(luò)調(diào)用遠(yuǎn)程過(guò)程(或方法)的協(xié)議。RPC是基于Client/Server模式,Client端攜帶必要參數(shù)調(diào)用Server端的方法,并獲取Server端返回的方法執(zhí)行結(jié)果。

、高效可靠等特點(diǎn),非常適合作為分布式計(jì)算、分布式服務(wù)等遠(yuǎn)程交互的基礎(chǔ)協(xié)議。RPC協(xié)議一般包括協(xié)議消息處理、網(wǎng)絡(luò)傳輸兩個(gè)部分,一個(gè)簡(jiǎn)單的rpc調(diào)用過(guò)程如下圖: 

當(dāng)Client調(diào)用遠(yuǎn)程的方法時(shí),先將要調(diào)用的方法名、參數(shù)等信息按RPC協(xié)議轉(zhuǎn)換為RPC消息,然后再通過(guò)某種傳輸協(xié)議(TCP、HTTP等)將RPC消息傳輸?shù)絊erver端。Server端接到請(qǐng)求后將RPC消息按協(xié)議轉(zhuǎn)換為調(diào)用請(qǐng)求,并執(zhí)行方法,將執(zhí)行后的結(jié)果按類(lèi)似的過(guò)程返回給Client端,完成一次RPC調(diào)用。

2、RPC與HTTP、RMI等遠(yuǎn)程通信方式比較

1)、RMI與RPC:

RMI(Remote Method Invocation)是指java語(yǔ)言中的遠(yuǎn)程方法調(diào)用,RMI中的每個(gè)方法都具有方法簽名,RMI客戶(hù)端和服務(wù)器端通過(guò)方法簽名進(jìn)行遠(yuǎn)程方法調(diào)用。RMI只能在java語(yǔ)言中使用,可以把RMI看作面向?qū)ο蟮膉ava RPC。

2)、HTTP與RPC

HTTP(HyperText Transfer Protocol)是應(yīng)用層通信協(xié)議,使用標(biāo)準(zhǔn)語(yǔ)義訪(fǎng)問(wèn)指定資源(圖片、接口等),網(wǎng)絡(luò)中的中轉(zhuǎn)服務(wù)器能識(shí)別協(xié)議內(nèi)容。HTTP協(xié)議是一種資源訪(fǎng)問(wèn)協(xié)議,通過(guò)HTTP協(xié)議也可以完成遠(yuǎn)程請(qǐng)求并返回請(qǐng)求結(jié)果。HTTP的優(yōu)點(diǎn)是簡(jiǎn)單、易用,可理解性好、并且與語(yǔ)言無(wú)關(guān);HTTP協(xié)議的缺點(diǎn)是協(xié)議頭比較重,一般請(qǐng)求到具體服務(wù)器的鏈路較長(zhǎng)(可能會(huì)有dns解析、nginx代理等)。

相對(duì)于HTTP來(lái)說(shuō),通信層只是RPC協(xié)議的一部分,RPC可以使用TCP或者HTTP等作為通信協(xié)議。除了通信協(xié)議,RPC還包括請(qǐng)求序列化協(xié)議,一般RPC框架還會(huì)包括一些調(diào)度管理能力。RPC相對(duì)于HTTP的優(yōu)點(diǎn)是能夠提供調(diào)度、管理能力,使用RPC服務(wù)的自動(dòng)化程度比較高,性能也十分優(yōu)秀。缺點(diǎn)就是相對(duì)復(fù)雜,學(xué)習(xí)成本稍高。

下面就以平臺(tái)的RPC框架Motan為例,介紹一下RPC服務(wù)的基本實(shí)現(xiàn)及使用方式。

二、Motan RPC服務(wù)框架

1、RPC服務(wù)框架

一般RPC協(xié)議中僅僅包含了client與server之間點(diǎn)對(duì)點(diǎn)的調(diào)用,在實(shí)際的使用當(dāng)中,還需要考慮服務(wù)的發(fā)現(xiàn)與服務(wù)注銷(xiāo)、提供服務(wù)的多臺(tái)server的負(fù)載均衡、服務(wù)的高可用等等一系列的問(wèn)題。

目前業(yè)界比較成熟的RPC框架有阿里開(kāi)源的Dubbo、Facebook開(kāi)源的Thrift,以及Avro、Hetty、Grpc等等,其中Thrift、Avro、Hetty、Grpc等都是性能優(yōu)秀的RPC框架,偏重于跨語(yǔ)言序列化傳輸、在序列化方式、協(xié)議擴(kuò)展、同步異步調(diào)用等方面有各自不同的優(yōu)點(diǎn),但在RPC服務(wù)管理方面功能較少,在分布式服務(wù)應(yīng)用時(shí)還需要進(jìn)行一些輔助開(kāi)發(fā)。Dubbo則是一個(gè)比較完備的服務(wù)治理框架,能夠提供高性能、透明化的RPC調(diào)用,并且擁有強(qiáng)大的服務(wù)管理功能。Dubbo雖然功能強(qiáng)大,但是整個(gè)框架有些過(guò)重,應(yīng)用起來(lái)略微復(fù)雜。

考慮到微服務(wù)化、動(dòng)態(tài)服務(wù)治理等需求,并結(jié)合自身業(yè)務(wù)高并發(fā)、服務(wù)性能、穩(wěn)定性要求較高等特點(diǎn),微博平臺(tái)開(kāi)發(fā)了自己的Motan RPC框架。Motan偏重于簡(jiǎn)潔實(shí)用的服務(wù)治理功能和優(yōu)秀的RPC協(xié)議擴(kuò)展能力,既可以提供高效的RPC遠(yuǎn)程調(diào)用,又能提供服務(wù)發(fā)現(xiàn)、服務(wù)高可用(High Available)、負(fù)載均衡、服務(wù)監(jiān)控、管理等服務(wù)治理功能。通過(guò)SPI機(jī)制提供強(qiáng)大的擴(kuò)展能力,可以支持不同的RPC協(xié)議、傳輸協(xié)議。Motan能夠無(wú)縫支持Spring配置方式使用RPC服務(wù),通過(guò)簡(jiǎn)單、靈活的配置就可以提供或使用RPC服務(wù)。通過(guò)使用Motan框架,可以十分方便的進(jìn)行服務(wù)拆分、分布式服務(wù)部署。

2、MotanRPC框架中的三個(gè)角色

在Motan框架中,RPC服務(wù)調(diào)用是由三個(gè)角色的交互完成的。首先需要一個(gè)服務(wù)的提供方Service(也可以叫做Provider),Service對(duì)外提供各種可以遠(yuǎn)程調(diào)用的方法(Method);另外一個(gè)角色叫Client(也可以叫做Referer或Consumer),Client需要使用Service提供的遠(yuǎn)程服務(wù)。如果僅有這兩個(gè)角色,還不能實(shí)現(xiàn)自動(dòng)化的RPC服務(wù),還需要第三個(gè)角色--注冊(cè)中心Registry,Registry是用來(lái)提供服務(wù)發(fā)現(xiàn)功能的。

當(dāng)Service準(zhǔn)備對(duì)外提供一個(gè)RPC服務(wù)時(shí),首先需要跟Registry進(jìn)行服務(wù)注冊(cè)。當(dāng)Client需要使用RPC服務(wù)時(shí),則需要跟Registry訂閱RPC服務(wù),Registry會(huì)把對(duì)應(yīng)服務(wù)信息給Client,并且在服務(wù)信息變更時(shí),及時(shí)通知Client。Client根據(jù)Registry提供的服務(wù)信息,請(qǐng)求具體的一臺(tái)能夠提供指定RPC服務(wù)的服務(wù)器,完成遠(yuǎn)程調(diào)用。Service、Client、Registry這三個(gè)角色的交互如下圖:

例如,Server1這臺(tái)服務(wù)器跟Registry注冊(cè)了“S”這個(gè)RPC服務(wù),Registry就保存了“Server1提供S服務(wù)”這樣一條信息。Server2也可以提供“S”服務(wù),也向Register注冊(cè)了“S”服務(wù)。這時(shí)Register中的信息變成了“Server1和Server2都提供S服務(wù)”。當(dāng)Client1需要使用S服務(wù)了,它向Register訂閱了S服務(wù),Register告訴Client1:“Server1和Server2都提供S服務(wù)”,Client1根據(jù)某個(gè)策略選擇了調(diào)用Server1的S服務(wù)完成了RPC調(diào)用。后來(lái),Server1不在提供S服務(wù)了,Register把這個(gè)變化告訴給了Client1,Client1就不再使用Server1的S服務(wù),而是使用Server2的S服務(wù)完成RPC調(diào)用。

java語(yǔ)言在使用Motan時(shí),Client與Service通過(guò)java接口類(lèi)來(lái)進(jìn)行RPC調(diào)用。例如Service端實(shí)現(xiàn)了com.weibo.demo.TestService接口,  Client可以通過(guò)Motan來(lái)使用這個(gè)接口類(lèi)中聲明的方法。

3、Motan RPC調(diào)用流程

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

     其中register模塊用來(lái)和注冊(cè)中心進(jìn)行交互,包括注冊(cè)服務(wù)、訂閱服務(wù)、服務(wù)變更通知、服務(wù)心跳發(fā)送等功能;transport模塊用來(lái)進(jìn)行遠(yuǎn)程通信;serialize模塊將rpc請(qǐng)求中的參數(shù)、結(jié)果等對(duì)象進(jìn)行序列化與反序列化,即進(jìn)行對(duì)象與字節(jié)流的互相轉(zhuǎn)換;protocol模塊用來(lái)進(jìn)行RPC服務(wù)的描述和RPC服務(wù)的配置管理;cluster模塊包含一組可以提供RPC服務(wù)的具體Server,實(shí)際請(qǐng)求時(shí)會(huì)根據(jù)不同的HA與負(fù)載均衡策略在一組Server中選擇一個(gè)可用的發(fā)起遠(yuǎn)程調(diào)用。各模塊的詳細(xì)情況將在下一節(jié)進(jìn)行介紹。

三、Motan中各角色介紹

1、Registry

Motan可以支持多種Registry模塊,例如zookeeper、consul等都可以作為注冊(cè)中心使用,默認(rèn)的Registry模塊使用平臺(tái)開(kāi)發(fā)的Vintage配置服務(wù)。Vintage是一個(gè)基于redis的輕量級(jí)KV存儲(chǔ)系統(tǒng),能夠提供命名空間服務(wù)、服務(wù)注冊(cè)、服務(wù)訂閱等功能。Vintage中的服務(wù)是以分組(Group)保存的,一般一個(gè)分組以機(jī)房+業(yè)務(wù)線(xiàn)進(jìn)行命名,如yf-user-rpc。一個(gè)分組中包含若干的Service,一個(gè)Service即表示java中的一個(gè)接口類(lèi),能夠提供其中的多個(gè)方法。

每個(gè)Service下有一組能夠提供對(duì)應(yīng)服務(wù)的Server,每個(gè)Server在向Registry注冊(cè)后,會(huì)定時(shí)發(fā)送心跳,向Registry匯報(bào)健康狀態(tài)。Server通過(guò)心跳開(kāi)關(guān)的開(kāi)啟與關(guān)閉,可以控制是否對(duì)外提供RPC服務(wù)。

Client端訂閱Service后,會(huì)從Registry中得到能夠提供對(duì)應(yīng)Service的一組Server,Client把這一組Server看作一個(gè)提供服務(wù)的cluster。當(dāng)cluster中的Server發(fā)生變更時(shí),Client端的register模塊會(huì)通知Client進(jìn)行更新。

2、Motan Service

Service端在啟動(dòng)RPC服務(wù)時(shí)的主要步驟如下:

1)、首先通過(guò)配置文件生成對(duì)應(yīng)的protocol信息,包括對(duì)外提供服務(wù)的端口、服務(wù)名稱(chēng)、工作線(xiàn)程數(shù)等等

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

3)、打開(kāi)并監(jiān)聽(tīng)聲明的RPC服務(wù)端口。此時(shí)服務(wù)處于已經(jīng)注冊(cè),但未正式提供服務(wù)的狀態(tài)。

4)、服務(wù)驗(yàn)證通過(guò)后,打開(kāi)心跳開(kāi)關(guān),Server會(huì)定時(shí)向Vintage注冊(cè)中心匯報(bào)健康狀態(tài),此時(shí)就能正式對(duì)外提供RPC服務(wù)了。

在Service端提供服務(wù)后,由transport模塊負(fù)責(zé)監(jiān)聽(tīng)rpc服務(wù)的端口,并接收client端發(fā)送過(guò)來(lái)的RPC請(qǐng)求。一次完整的Service端處理RPC請(qǐng)求流程如下:

1)、監(jiān)聽(tīng)RPC服務(wù)端口,由transport模塊接收RPC request,transport模塊默認(rèn)是使用Netty nio通過(guò)TCP長(zhǎng)鏈接方式與Client進(jìn)行通信。transport模塊收到請(qǐng)求后將請(qǐng)求轉(zhuǎn)交給serialize模塊進(jìn)行解析。

2)、serialize模塊默認(rèn)使用Hession對(duì)RPC請(qǐng)求進(jìn)行解碼,將請(qǐng)求由字節(jié)流轉(zhuǎn)化為java對(duì)象。

3)、fliter模塊會(huì)根據(jù)請(qǐng)求的參數(shù)做一下過(guò)濾策略,例如調(diào)用統(tǒng)計(jì)、日志、請(qǐng)求限制等。

4)、protocol負(fù)責(zé)解析通過(guò)filter后的請(qǐng)求對(duì)象,根據(jù)協(xié)議分析出請(qǐng)求想要調(diào)用的方法及參數(shù),然后找到提供對(duì)應(yīng)服務(wù)的具體對(duì)象。

5)、具體服務(wù)對(duì)象通過(guò)反射機(jī)制完成服務(wù)中方法的調(diào)用并返回處理結(jié)果。

6)、返回結(jié)果通過(guò)filter后,在通過(guò)serialize模塊將結(jié)果對(duì)象轉(zhuǎn)換為字節(jié)流,由transport模塊發(fā)送給Client端,完成一次RPC請(qǐng)求的處理。

3、Motan Client

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

1)、與Service端一樣,首先會(huì)通過(guò)配置文件生成對(duì)應(yīng)的protocol信息。

2)、向Registry訂閱所需的RPC服務(wù),獲取提供對(duì)應(yīng)服務(wù)的全部Server,這一組Server和HA策略模塊、負(fù)載均衡模塊一起組成了一個(gè)cluster。

3)、對(duì)每個(gè)Server建立初始鏈接。

在Client完成了初始化流程后,在調(diào)用RPC服務(wù)時(shí),會(huì)有一個(gè)選擇Server的過(guò)程,當(dāng)Server選定后的處理過(guò)程跟Server端類(lèi)似。Client調(diào)用RPC的流程如下圖:

1)、當(dāng)進(jìn)行RPC請(qǐng)求時(shí),會(huì)首先通過(guò)HA模塊選擇一種高可用策略,例如快速失敗、失敗選擇其他Server重試等策略,各種策略的參數(shù)可以根據(jù)需要進(jìn)行設(shè)置。

2)、然后會(huì)通過(guò)負(fù)載均衡模塊從一組提供服務(wù)的Server中選擇一個(gè)可用的Server。負(fù)載均衡的策略包括一致性哈希、輪詢(xún)、并發(fā)度、權(quán)重等等。

3)、選出Server后,就對(duì)這個(gè)Server進(jìn)行RPC請(qǐng)求,圖中的netty client是用來(lái)進(jìn)行點(diǎn)對(duì)點(diǎn)的RPC請(qǐng)求,包含了protocol、serialize、transport模塊,請(qǐng)求的處理流程與Service端的流程基本一致,也是通過(guò)serialize模塊轉(zhuǎn)換請(qǐng)求對(duì)象,transport模塊來(lái)進(jìn)行通信。

四、Motan實(shí)戰(zhàn)

1、Motan RPC基本使用方式

Motan RPC是按接口提供和調(diào)用服務(wù),以java服務(wù)為例,一般由服務(wù)提供方聲明服務(wù)的接口類(lèi),并同時(shí)提供一個(gè)默認(rèn)的RPC Client調(diào)用配置,然后將接口類(lèi)與默認(rèn)的Client配置xml文件一起封裝成jar包。服務(wù)提供方和服務(wù)使用方共同引入這個(gè)jar包,服務(wù)提供方對(duì)接口類(lèi)進(jìn)行實(shí)現(xiàn)并對(duì)外提供RPC服務(wù);服務(wù)使用方加載默認(rèn)Client端配置文件,直接使用RPC服務(wù)。

除了xml配置方式外,Motan也支持API方式,因?yàn)閤ml配置方式比較靈活,并且與spring配置加載完全兼容,一般推薦使用xml方式配置Motan服務(wù)。下面就以xml配置方式分別介紹使用Motan提供、調(diào)用RPC服務(wù)的具體步驟。

2、使用Motan提供RPC服務(wù)

使用Motan提供RPC服務(wù)大致需要如下幾步:

1)、聲明RPC接口類(lèi),并實(shí)現(xiàn)該接口類(lèi)。

2)、引入Motan相關(guān)jar包。

3)、配置服務(wù)端xml配置。

4)、部署、啟動(dòng)服務(wù),驗(yàn)證服務(wù)。

5)、打開(kāi)心跳開(kāi)關(guān),正式提供RPC服務(wù)

一份基礎(chǔ)的Service端xml配置如下:  

Motan使用了自定義的xml schema,在xml中需要引入對(duì)應(yīng)的schema。Motan的xml配置中包括registry、protocol、service、referer幾個(gè)部分,其中registry與protocol是Service端與Client端都要使用的。

registry配置了注冊(cè)中心相關(guān)的屬性,包括注冊(cè)中心ip、prot、超時(shí)等;protocol配置了RPC服務(wù)相關(guān)的屬性,如工作線(xiàn)程數(shù)、請(qǐng)求超時(shí)、消息長(zhǎng)度等;basicService配置了不同服務(wù)的公共屬性,當(dāng)一個(gè)工程對(duì)外提供多個(gè)RPC Service的時(shí)候,可以把這些Service的公共屬性配置在basicService中;service則配置了具體的服務(wù)屬性,包括對(duì)外提供服務(wù)的端口、對(duì)外提供服務(wù)的具體服務(wù)實(shí)現(xiàn)類(lèi)bean等。

除了這些基礎(chǔ)屬性外,每個(gè)配置標(biāo)簽下還支持大量的高級(jí)屬性,如訪(fǎng)問(wèn)控制、filter策略等等,這里就不在一一講解了。

3、使用Motan調(diào)用RPC服務(wù)

使用Motan RPC服務(wù)就相對(duì)簡(jiǎn)單一些,一般服務(wù)提供方已經(jīng)給出了默認(rèn)的client配置,只需要在項(xiàng)目中加載xml配置,就可以像使用本地的spring bean一樣直接使用RPC服務(wù)了。步驟如下:

1)、引入Motan相關(guān)jar包及RPC服務(wù)接口jar包。

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

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

Client端基本配置如下:

其中registry、protocol部分與Service端的配置一致。basicRefer配置是多個(gè)RPC服務(wù)時(shí)的公共配置,例如請(qǐng)求超時(shí)控制、服務(wù)端異常是否拋出等;referer表示對(duì)服務(wù)實(shí)現(xiàn)類(lèi)的遠(yuǎn)程引用,配置了使用的服務(wù)接口類(lèi)等屬性。

如果想使用自定義的Client端配置,也可以按schema中的屬性單獨(dú)配置xml,加載后就可以生效。另外在Client端還可以進(jìn)行一些更細(xì)化的配置包括對(duì)一個(gè)接口類(lèi)中不同方法的詳細(xì)配置,可以根據(jù)具體的業(yè)務(wù)場(chǎng)景進(jìn)行配置。

五、總結(jié)

     RPC服務(wù)在分布式系統(tǒng)中有著越來(lái)越廣泛的應(yīng)用,本文簡(jiǎn)單介紹了RPC的基本概念、平臺(tái)RPC框架Motan的基本結(jié)構(gòu)、Motan中的三個(gè)角色的交互流程以及基本的使用方式。通過(guò)簡(jiǎn)單配置就能夠使用RPC服務(wù)了。當(dāng)然,如果需要對(duì)RPC服務(wù)進(jìn)行更精細(xì)的控制,可以通過(guò)schema中的特定屬性進(jìn)行配置或者使用不同擴(kuò)展模塊來(lái)實(shí)現(xiàn)。

六、課后思考

1、遠(yuǎn)程服務(wù)的不同調(diào)用方式、RPC與HTTP的區(qū)別以及適用的場(chǎng)景。

2、Motan RPC框架中的三個(gè)角色及各角色之間的交互過(guò)程。

3、RPC請(qǐng)求的調(diào)用過(guò)程。

------------------新兵訓(xùn)練營(yíng)簡(jiǎn)介------------------

微博平臺(tái)新兵訓(xùn)練營(yíng)活動(dòng)是微博平臺(tái)內(nèi)部組織的針對(duì)新入職同學(xué)的團(tuán)隊(duì)融入培訓(xùn)課程,目標(biāo)是團(tuán)隊(duì)融入,包括人的融入,氛圍融入,技術(shù)融入。當(dāng)前已經(jīng)進(jìn)行4期活動(dòng),很多學(xué)員迅速成長(zhǎng)為平臺(tái)技術(shù)骨干。

微博平臺(tái)是非常注重團(tuán)隊(duì)成員融入與成長(zhǎng)的團(tuán)隊(duì),在這里有人幫你融入,有人和你一起成長(zhǎng),也歡迎小伙伴們加入微博平臺(tái),歡迎私信咨詢(xún)。

------------------講師簡(jiǎn)介------------------

張雷,@rayzhang0603 微博平臺(tái)及大數(shù)據(jù)部——平臺(tái)研發(fā)高級(jí)系統(tǒng)研發(fā)工程師,2012年7月畢業(yè)于太原科技大學(xué),13年加入微博平臺(tái),先后負(fù)責(zé)開(kāi)放平臺(tái)、粉服開(kāi)發(fā)者、MotanRPC等后端服務(wù)架構(gòu)工作,有著豐富的系統(tǒng)的架構(gòu)設(shè)計(jì)與優(yōu)化經(jīng)驗(yàn)。新兵訓(xùn)練營(yíng)第二期學(xué)員。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)