RPC基本原理及實現
RPC概述
RPC(Remote Procedure Call)即遠端過程呼叫,允許一臺計算機呼叫另一臺計算機上的程式得到結果,而程式碼中不需要做額外的程式設計,就像在本地呼叫一樣。
現在網際網路應用的量級越來越大,單臺計算機的能力有限,需要藉助可擴充套件的計算機叢集來完成,分散式的應用可以藉助RPC來完成機器之間的呼叫。
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)服務消費方得到最終結果。
RPC框架的目標就是要2~8這些步驟都封裝起來,讓使用者對這些細節透明。
服務註冊&發現
服務提供者啟動後主動向註冊中心序號產生器器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
程式設計實踐
Ricky_Fung基於 Netty4 + Zookeeper + protostuff + Spring 實現了一個簡單、高效的RPC框架Mango:https://github.com/TiFG/mango,歡迎大家fork/star。
開源的優秀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/
相關文章
- RPC基本原理以及如何用Netty來實現RPCRPCNetty
- Dubbo-RPC基本原理RPC
- 聊聊 TokenBucket 限流器的基本原理及實現
- 簡述RPC原理實現RPC
- Go語言實現RPCGoRPC
- Node + js實現大檔案分片上傳基本原理及實踐(一)JS
- go語言實現自己的RPC:go rpc codecGoRPC
- Go 實現簡易 RPC 框架GoRPC框架
- Promise實現的基本原理(一)Promise
- Promise實現的基本原理(二)Promise
- SPA路由實現的基本原理路由
- 從零實現一個RPC框架系列文章(二):11個類實現簡單RPCRPC框架
- 幾行程式碼實現RPC框架行程RPC框架
- netty 實現簡單的rpc呼叫NettyRPC
- Java講解RPC的基本實現JavaRPC
- RPC核心實現原理-動態代理RPC
- Rpc-實現Zookeeper註冊中心RPC
- Java RPC原理及Dubbo的實踐應用JavaRPC
- Hadoop系列番外篇之一文搞懂Hadoop RPC框架及細節實現HadoopRPC框架
- SpringCloud Alibaba實戰(12:引入Dubbo實現RPC呼叫)SpringGCCloudRPC
- 徒手擼框架--實現 RPC 遠端呼叫框架RPC
- Java使用Netty實現簡單的RPCJavaNettyRPC
- 一不小心實現了RPCRPC
- 使用 httputils + protostuff 實現高效能 rpcHTTPRPC
- 什麼是RPC ? 用PHP如何實現?RPCPHP
- [從RPC到Go-Micro 壹]Go語言實現RPC程式設計RPCGoC程式程式設計
- go-slice實現的使用和基本原理Go
- 微服務治理平臺的RPC方案實現微服務RPC
- 從零開始實現一個RPC框架(四)RPC框架
- 從零開始實現一個RPC框架(零)RPC框架
- 從零開始實現一個RPC框架(二)RPC框架
- 從零開始實現一個RPC框架(五)RPC框架
- RPC模式的介紹以及簡單的實現RPC模式
- 從零開始實現一個RPC框架(一)RPC框架
- 使用併發工具實現 RPC 呼叫流量控制RPC
- Golang快速實現一個簡單RPC服務GolangRPC
- 從零開始實現一個RPC框架(三)RPC框架
- 自己用 Netty 實現一個簡單的 RPCNettyRPC