五分鐘快速掌握RPC原理及實(shí)現(xiàn)
隨著公司規(guī)模的不斷擴(kuò)大,以及業(yè)務(wù)量的激增,單體應(yīng)用逐步演化為服務(wù)/微服務(wù)的架構(gòu)模式, 服務(wù)之間的調(diào)用大多采用rpc的方式調(diào)用,或者消息隊(duì)列的方式進(jìn)行解耦。幾乎每個(gè)大廠都會(huì)創(chuàng)建自己的rpc框架,或者基于知名的rpc框架進(jìn)行改造因此今天我們來(lái)講講rpc吧。
?RPC概述
RPC(Remote Procedure Call)即遠(yuǎn)程過程調(diào)用,也就是說(shuō)兩臺(tái)服務(wù)器A,B,一個(gè)應(yīng)用部署在A服務(wù)器上,想要調(diào)用B服務(wù)器上應(yīng)用提供的函數(shù)/方法,由于不在一個(gè)內(nèi)存空間,不能直接調(diào)用,需要通過網(wǎng)絡(luò)來(lái)表達(dá)調(diào)用的語(yǔ)義和傳達(dá)調(diào)用的數(shù)據(jù)。
RPC框架原理
在RPC框架中主要有三個(gè)角色:Provider、Consumer和Registry。如下圖所示:
節(jié)點(diǎn)角色說(shuō)明:
* Server: 暴露服務(wù)的服務(wù)提供方。
* Client: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
* Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。
RPC調(diào)用流程
1.調(diào)用客戶端句柄;執(zhí)行傳送參數(shù)
2.調(diào)用本地系統(tǒng)內(nèi)核發(fā)送網(wǎng)絡(luò)消息
3.消息傳送到遠(yuǎn)程主機(jī)
4.服務(wù)器句柄得到消息并取得參數(shù)
5.執(zhí)行遠(yuǎn)程過程
6.執(zhí)行的過程將結(jié)果返回服務(wù)器句柄
7.服務(wù)器句柄返回結(jié)果,調(diào)用遠(yuǎn)程系統(tǒng)內(nèi)核
8.消息傳回本地主機(jī)
9.客戶句柄由內(nèi)核接收消息
10.客戶接收句柄返回的數(shù)據(jù)
服務(wù)注冊(cè)&發(fā)現(xiàn)
服務(wù)提供者啟動(dòng)后主動(dòng)向注冊(cè)中心注冊(cè)機(jī)器ip、port以及提供的服務(wù)列表;
服務(wù)消費(fèi)者啟動(dòng)時(shí)向注冊(cè)中心獲取服務(wù)提供方地址列表,可實(shí)現(xiàn)軟負(fù)載均衡和Failover;
使用到的技術(shù)
1、動(dòng)態(tài)代理
生成 client stub和server stub需要用到 Java 動(dòng)態(tài)代理技術(shù) ,我們可以使用JDK原生的動(dòng)態(tài)代理機(jī)制,可以使用一些開源字節(jié)碼工具框架 如:CgLib、Javassist等。
2、序列化
為了能在網(wǎng)絡(luò)上傳輸和接收 Java對(duì)象,我們需要對(duì)它進(jìn)行 序列化和反序列化操作。
* 序列化:將Java對(duì)象轉(zhuǎn)換成byte[]的過程,也就是編碼的過程;
* 反序列化:將byte[]轉(zhuǎn)換成Java對(duì)象的過程;
可以使用Java原生的序列化機(jī)制,但是效率非常低,推薦使用一些開源的、成熟的序列化技術(shù),例如:protobuf、Thrift、hessian、Kryo、Msgpack
關(guān)于序列化工具性能比較可以參考:jvm-serializers
3、NIO
當(dāng)前很多RPC框架都直接基于netty這一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。
4、服務(wù)注冊(cè)中心
可選技術(shù):
* Redis
* Zookeeper
* Consul
* Etcd
JAVA中幾種常用的RPC框架介紹
Java中的RPC框架比較多,各有特色,廣泛使用的有RMI、Hessian、Dubbo等。
RPC還有一個(gè)特點(diǎn)就是能夠跨語(yǔ)言,本文只以JAVA語(yǔ)言里的RPC為例。
RMI(遠(yuǎn)程方法調(diào)用)
JAVA自帶的遠(yuǎn)程方法調(diào)用工具,不過有一定的局限性,畢竟是JAVA語(yǔ)言最開始時(shí)的設(shè)計(jì),后來(lái)很多框架的原理都基于RMI,RMI的使用如下:
對(duì)外接口
服務(wù)實(shí)現(xiàn)
RMI客戶端
開源的優(yōu)秀RPC框架
- 阿里巴巴 Dubbo:https://github.com/alibaba/dubbo
- 新浪微博 Motan:https://github.com/weibocom/motan
- gRPC:https://github.com/grpc/grpc
- rpcx :https://github.com/smallnest/rpcx
- Apache Thrift :https://thrift.apache.org/

浙公網(wǎng)安備 33010602011771號(hào)