花了一个星期,我终于把RPC框架整明白了

RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 。
 

花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
  • 应用级的服务框架:阿里的 Dubbo/Dubbox、google gRPC、Spring Boot/Spring Cloud 。
  • 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON) 。
  • 通信框架:MINA 和 Netty 。
目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等 。
下面重点介绍三种:
  • gRPC:是 Google 公布的开源软件,基于最新的 HTTP 2.0 协议,并支持常见的众多编程语言 。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持 。
  • Thrift:是 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架 。
用户只要在其之上进行二次开发就行,应用对于底层的 RPC 通讯等都是透明的 。不过这个对于用户来说需要学习特定领域语言这个特性,还是有一定成本的 。
  • Dubbo:是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用 。协议和序列化框架都可以插拔是极其鲜明的特色 。
完整的 RPC 框架
在一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC 协议”就指明了程序如何进行网络传输和序列化 。
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
图 1:完整 RPC 架构图
如下是 Dubbo 的设计架构图,分层清晰,功能复杂:
 
花了一个星期,我终于把RPC框架整明白了

文章插图
图 2:Dubbo 架构图
 
 
RPC 核心功能
RPC 的核心功能是指实现一个 RPC 最重要的功能模块,就是上图中的”RPC 协议”部分:
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
图 3:RPC 核心功能
一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等 。
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
图 4:RPC 核心功能图
下面分别介绍核心 RPC 框架的重要组成:
  • 客户端(Client):服务调用方 。
  • 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端 。
  • 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理 。
  • 服务端(Server):服务的真正提供者 。
  • Network Service:底层传输,可以是 TCP 或 HTTP 。
Python 自带 RPC Demo
Server.py:
from SimpleXMLRPCServer import SimpleXMLRPCServer def fun_add(a,b):totle = a + breturn totle if __name__ == '__main__':s = SimpleXMLRPCServer(('0.0.0.0', 8080)) #开启xmlrpcservers.register_function(fun_add) #注册函数fun_addprint "server is online..."s.serve_forever() #开启循环等待 Client.py:
from xmlrpclib import ServerProxy #导入xmlrpclib的包 s = ServerProxy("http://172.171.5.205:8080") #定义xmlrpc客户端 print s.fun_add(2,3) 开启服务端:
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
开启客户端:
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
Wireshark 抓包分析过程
客户端去往服务端:
  • 客户端 IP:172.171.4.176
  • 服务端 IP:172.171.5.95
通信使用 HTTP 协议,XML 文件传输格式 。传输的字段包括:方法名 methodName,两个参数 2,3 。
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
图 5:Request 抓包
服务端返回结果,字段返回值 Value,结果是 5:
 
花了一个星期,我终于把RPC框架整明白了

文章插图
 
 
图 6:Response 抓包
在这两次网络传输中使用了 HTTP 协议,建立 HTTP 协议之间有 TCP 三次握手,断开 HTTP 协议时有 TCP 四次挥手 。


推荐阅读