RPC概述
RPC(Remote Procedure Call)即遠(yuǎn)程過程調(diào)用奏候,允許一臺(tái)計(jì)算機(jī)調(diào)用另一臺(tái)計(jì)算機(jī)上的程序得到結(jié)果,而代碼中不需要做額外的編程畔规,就像在本地調(diào)用一樣译株。
現(xiàn)在互聯(lián)網(wǎng)應(yīng)用的量級(jí)越來越大吉执,單臺(tái)計(jì)算機(jī)的能力有限,需要借助可擴(kuò)展的計(jì)算機(jī)集群來完成牲尺,分布式的應(yīng)用可以借助RPC來完成機(jī)器之間的調(diào)用卵酪。
RPC框架原理
在RPC框架中主要有三個(gè)角色:Provider、Consumer和Registry谤碳。如下圖所示:
節(jié)點(diǎn)角色說明:
* Server: 暴露服務(wù)的服務(wù)提供方溃卡。
* Client: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
* Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心蜒简。
RPC調(diào)用流程
RPC基本流程圖:
一次完整的RPC調(diào)用流程(同步調(diào)用瘸羡,異步另說)如下:
1)服務(wù)消費(fèi)方(client)調(diào)用以本地調(diào)用方式調(diào)用服務(wù);
2)client stub接收到調(diào)用后負(fù)責(zé)將方法搓茬、參數(shù)等組裝成能夠進(jìn)行網(wǎng)絡(luò)傳輸?shù)南Ⅲw犹赖;
3)client stub找到服務(wù)地址,并將消息發(fā)送到服務(wù)端卷仑;
4)server stub收到消息后進(jìn)行解碼峻村;
5)server stub根據(jù)解碼結(jié)果調(diào)用本地的服務(wù);
6)本地服務(wù)執(zhí)行并將結(jié)果返回給server stub系枪;
7)server stub將返回結(jié)果打包成消息并發(fā)送至消費(fèi)方雀哨;
8)client stub接收到消息,并進(jìn)行解碼;
9)服務(wù)消費(fèi)方得到最終結(jié)果雾棺。
RPC框架的目標(biāo)就是要2~8這些步驟都封裝起來膊夹,讓用戶對(duì)這些細(xì)節(jié)透明。
服務(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
編程實(shí)踐
本人基于 Netty4 + Zookeeper + protostuff + Spring 實(shí)現(xiàn)了一個(gè)簡(jiǎn)單仑最、高效的RPC框架Mango:https://github.com/TiFG/mango扔役,歡迎大家fork/star。
開源的優(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/