RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 。
文章插图
RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
- 应用级的服务框架:阿里的 Dubbo/Dubbox、google gRPC、Spring Boot/Spring Cloud 。
- 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON) 。
- 通信框架:MINA 和 Netty 。
下面重点介绍三种:
- gRPC:是 Google 公布的开源软件,基于最新的 HTTP 2.0 协议,并支持常见的众多编程语言 。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持 。
- Thrift:是 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架 。
- Dubbo:是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用 。协议和序列化框架都可以插拔是极其鲜明的特色 。
在一个典型 RPC 的使用场景中,包含了服务发现、负载、容错、网络传输、序列化等组件,其中“RPC 协议”就指明了程序如何进行网络传输和序列化 。
文章插图
图 1:完整 RPC 架构图
如下是 Dubbo 的设计架构图,分层清晰,功能复杂:
文章插图
图 2:Dubbo 架构图
RPC 核心功能
RPC 的核心功能是指实现一个 RPC 最重要的功能模块,就是上图中的”RPC 协议”部分:
文章插图
图 3:RPC 核心功能
一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等 。
文章插图
图 4:RPC 核心功能图
下面分别介绍核心 RPC 框架的重要组成:
- 客户端(Client):服务调用方 。
- 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端 。
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理 。
- 服务端(Server):服务的真正提供者 。
- Network Service:底层传输,可以是 TCP 或 HTTP 。
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) 开启服务端:
文章插图
开启客户端:
文章插图
Wireshark 抓包分析过程
客户端去往服务端:
- 客户端 IP:172.171.4.176
- 服务端 IP:172.171.5.95
文章插图
图 5:Request 抓包
服务端返回结果,字段返回值 Value,结果是 5:
文章插图
图 6:Response 抓包
在这两次网络传输中使用了 HTTP 协议,建立 HTTP 协议之间有 TCP 三次握手,断开 HTTP 协议时有 TCP 四次挥手 。
推荐阅读
- 程序员=青春饭”?不,程序员是一个具备长久生命力的职业
- 中药枕头哪种好
- |您以为钓鱼是“娱乐”?有时候它还是一个“悲伤”的故事
- 梦见收养了一个孩子表示什么 做梦梦见收养了一个女儿
- 红薯腊八粥
- 梦见一个钩上有很多鱼 梦见钩了很多鱼
- 在一个千万级的数据库查寻中,如何提高查询效率?
- 一个男人一旦提出离婚 男人比女人更害怕离婚
- 松茸蒸蛋羹
- 睡了一个比自己小9岁的男人靠谱吗,姐弟恋对女人生理好不好