一、RPC通信
1、什么是RPC?
RPC(Remote Procedure Call)远程过程调用,允许像调用本地服务一样调用远程服务。在整个过程中,RPC 会隐藏具体的通信细节。RPC是一种通信方式,可以通过HTTP来实现,也可以通过socket自己实现一套协议来实现。
2、为什么要使用RPC?
经常会听别人提起 B/S ( Browser/Server,浏览器 / 服务器) 架构。在这种架构中,被调用方(服务器)有一个开放的接口,然后调用方(用户)通过 Browser 使用这个接口,来间接调用被调用方相应的服务,从而实现远程调用。但是,B/S 架构是基于 HTTP 协议实现的,每次调用接口时,都需要先进行 HTTP 请求,发起http请求的代码呢?比如httpClient.sendRequest…之类的。这样既繁琐又浪费时间,不适用于有低时延要求的大规模分布式系统,所以能不能简单一下,像本地方法调用一样,去发起远程调用,让使用者感知不到远程调用的过程。RPC主要解决的两个问题,如下:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
3、RPC相关的概念
3.1、IDL定义提供的接口与消息
跨语言平台PRC框架,根据IDL(Interface Description Language接口描述语言)定义服务端提供的接口与通信所使用的消息。编译时通过protobuf工具编译成对应的代码,生成的代码与业务代码编译到一起。
3.2、序列化与反序列化
网络协议传输的内容是二进制流,调用者发送请求时,RPC框架会把要传递的消息(即C语言里面的一个结构体)序列化成二进制流。数据到达服务端后,会把二进制流转换成消息(消息的结构是约定好的)。序列化和反序列化解决了调用方和被调用方之间的数据传输格式问题,但要想序列化后的数据能在网络中顺利传输,还需要有相应的网络协议,比如 TCP、UDP 等,因此就需要有一个底层通信层。目前,大部分 RPC 框架采用的是 TCP 协议。
3.3、客户端
客户端根据服务端信息(服务ID+实例ID)查询到服务端地址(IP+端口),根据服务端地址信息向对应的服务端发送请求
3.4、服务端
服务端提供者会向注册中心注册自己提供的服务(schema)