rpc框架是什么?
RPC 的全稱是 Remote Procedure Call 是一種進程間通信方式。它允許程序調用另一個地址空間(通常是共享網絡的另一臺機器上)的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即無論是調用本地接口/服務的還是遠程的接口/服務,本質上編寫的調用代碼基本相同。
RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)
RPC 是一個請求響應模型??蛻舳税l起請求,服務器返回響應(類似于Http的工作方式)
RPC 在使用形式上像調用本地函數(或方法)一樣去調用遠程的函數(或方法)。
rpc框架有哪些?常用開源 RPC 框架有哪些?
跟語言平臺綁定的開源 RPC 框架主要有下面幾種。
Dubbo:國內最早開源的 RPC 框架,由阿里巴巴公司開發并于 2011 年末對外開源,僅支持 Java 語言。
Motan:微博內部使用的 RPC 框架,于 2016 年對外開源,僅支持 Java 語言。
Tars:騰訊內部使用的 RPC 框架,于 2017 年對外開源,僅支持 C++ 語言。
Spring Cloud:國外 Pivotal 公司 2014 年對外開源的 RPC 框架,僅支持 Java 語言
而跨語言平臺的開源 RPC 框架主要有以下幾種。
gRPC:Google 于 2015 年對外開源的跨語言 RPC 框架,支持多種語言。
Thrift:最初是由 Facebook 開發的內部系統跨語言的 RPC 框架,2007 年貢獻給了 Apache 基金,成為 Apache 開源項目之一,支持多種語言。
hprose:一個MIT開源許可的新型輕量級跨語言跨平臺的面向對象的高性能遠程動態通訊中間件。它支持眾多語言:nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl, Golang 。
rpc框架的實現原理
在RPC框架中主要有三個角色:Provider、Consumer和Registry。
節點角色說明:
* Server: 暴露服務的服務提供方。
* Client: 調用遠程服務的服務消費方。
* Registry: 服務注冊與發現的注冊中心。
RPC調用流程
RPC基本流程圖:
一次完整的RPC調用流程(同步調用,異步另說)如下:
1)服務消費方(client)調用以本地調用方式調用服務;
2)client stub接收到調用后負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;
3)client stub找到服務地址,并將消息發送到服務端;
4)server stub收到消息后進行解碼;
5)server stub根據解碼結果調用本地的服務;
6)本地服務執行并將結果返回給server stub;
7)server stub將返回結果打包成消息并發送至消費方;
8)client stub接收到消息,并進行解碼;
9)服務消費方得到最終結果。
使用到的技術
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