【轉】Java學習---快速掌握RPC原理及實現
【原文】https://www.toutiao.com/i6592365493435236872/
?RPC概述
RPC(Remote Procedure Call)即遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。
RPC框架原理
在RPC框架中主要有三個角色:Provider、Consumer和Registry。如下圖所示:
節點角色說明:
* Server: 暴露服務的服務提供方。
* Client: 調用遠程服務的服務消費方。
* Registry: 服務註冊與發現的註冊中心。
RPC調用流程
1.調用客戶端句柄;執行傳送參數
2.調用本地系統內核發送網絡消息
3.消息傳送到遠程主機
4.服務器句柄得到消息並取得參數
5.執行遠程過程
6.執行的過程將結果返回服務器句柄
7.服務器句柄返回結果,調用遠程系統內核
8.消息傳回本地主機
9.客戶句柄由內核接收消息
10.客戶接收句柄返回的數據
服務註冊&發現
服務提供者啟動後主動向註冊中心註冊機器ip、port以及提供的服務列表;
服務消費者啟動時向註冊中心獲取服務提供方地址列表,可實現軟負載均衡和Failover;
使用到的技術
1、動態代理
生成 client stub和server stub需要用到 Java 動態代理技術
2、序列化
為了能在網絡上傳輸和接收 Java對象,我們需要對它進行 序列化和反序列化操作。
* 序列化:將Java對象轉換成byte[]的過程,也就是編碼的過程;
* 反序列化:將byte[]轉換成Java對象的過程;
可以使用Java原生的序列化機制,但是效率非常低,推薦使用一些開源的、成熟的序列化技術,例如:protobuf、Thrift、hessian、Kryo、Msgpack
關於序列化工具性能比較可以參考:jvm-serializers
3、NIO
當前很多RPC框架都直接基於netty這一IO通信框架,比如阿裏巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。
4、服務註冊中心
可選技術:
* Redis
* Zookeeper
* Consul
* Etcd
JAVA中幾種常用的RPC框架介紹
Java中的RPC框架比較多,各有特色,廣泛使用的有RMI、Hessian、Dubbo等。
RPC還有一個特點就是能夠跨語言,本文只以JAVA語言裏的RPC為例。
RMI(遠程方法調用)
JAVA自帶的遠程方法調用工具,不過有一定的局限性,畢竟是JAVA語言最開始時的設計,後來很多框架的原理都基於RMI,RMI的使用如下:
對外接口
服務實現
RMI客戶端
開源的優秀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/
【轉】Java學習---快速掌握RPC原理及實現