目录

一 rpc概述

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

二 rpc执行过程

七层网络模型如下:

  • 第一层:应用层。定义了用于在网络中进行通信和传输数据的接口;

  • 第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等;

  • 第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断;

  • 第四层:传输层。管理着网络中的端到端的数据传输;

  • 第五层:网络层。定义网络设备间如何传输数据;

  • 第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输;

  • 第七层:物理层。这一层主要就是传输这些二进制数据

实际应用过程中,五层协议结构里面是没有表示层和会话层的。应该说它们和应用层合并了。

RPC与web请求类似,都是客户端向远端服务器请求服务返回结果,但是web请求使用的网络协议是http高层协议,而rpc所使用的协议多为网络层的TCP协议,减少了信息的包装,加快了处理速度。

在OSI网络通信模型中,RPC跨越了传输层和应用层,使得开发包括网络分布式多程序在内的应用程序更加容易。运行时,一次客户机对服务器的RPC调用,步骤如下:

  • 1 调用客户端句柄,传送参数

  • 2 调用本地系统内核发送网络消息

  • 3 消息传送到远程主机

  • 4 服务器句柄得到消息并得到参数

  • 5 执行远程过程

  • 6 返回执行结果给服务器句柄

  • 7 服务器句柄返回结果,调用远程系统内核

  • 8 消息传回本地主机

  • 9 客户句柄由内核接收消息

  • 10 客户接收句柄返回的数据

三 rpc架构

一个完整的RPC架构里面包含了四个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根。分别说说这几个组件:

  • 客户端(Client):服务的调用方。

  • 服务端(Server):真正的服务提供者。

  • 客户端存根:存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。

  • 服务端存根:接收客户端发送过来的消息,将消息解包,并调用本地的方法。

调用过程如图:

四 rpc的实现

常见的rpc实现有:

  • go原生rpc:go的rpc包封装了rpc相关实现,但Go的RPC它只支持Go开发的服务器与客户端之间的交互,因为在内部,它们采用了Gob来编码

  • grpc:Google开源的rpc实现,基于最新的HTTP2.0协议,并支持常见的众多编程语言

  • thrift:Facebook开源的跨语言的服务开发框架,它有一个代码生成器来对它所定义的IDL定义文件自动生成服务代码框架。用户只要在其之前进行二次开发就行,对于底层的RPC通讯等都是透明的

  • dubbo:阿里开源的rpc框架,远程接口是基于Java Interface,依托于spring框架,可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

  • HSF:淘宝系内部rpc框架