1. 程式人生 > >【轉】Java學習---快速掌握RPC原理及實現

【轉】Java學習---快速掌握RPC原理及實現

消費者 阿裏 局限 kryo nes 很多 cal 網絡 href

【原文】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 動態代理技術

,我們可以使用JDK原生的動態代理機制,可以使用一些開源字節碼工具框架 如:CgLib、Javassist等。

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原理及實現