從零開始實現RPC框架 - RPC原理及實現


 

最近被人問到RPC相關的東西~突然發現還是有很多原理沒有清楚,所以要好好系統的學習一下RPC以及它的原理

先大致了解一下RPC的大概,原文:https://blog.csdn.net/top_code/article/details/54615853

-----------------------------------------------------------------------------------------------------------------------

 

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

編程實踐

本人基於 Netty4 + Zookeeper + protostuff + Spring 實現了一個簡單、高效的RPC框架Mangohttps://github.com/TiFG/mango,歡迎大家fork/star。

開源的優秀RPC框架


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM