如何实现RPC远程服务调用

想要完成RPC调用,需要解决四个问题:

  • 客户端与服务端如何建立网络连接
  • 服务端如何处理请求
  • 数据传输采用什么协议
  • 数据该如何序列化和反序列化

1.客户端与服务端如何建立网络连接

  • HTTP通信
    HTTP通信是基于应用层HTTP协议的,而HTTP协议又是基于TCP协议的。一次HTTP通信过程就是发起一次HTTP调用,而一次HTTP调用就会建立一个TCP连接,经历一次下图所示的“三次握手”的
    过程。
    这里写图片描述

完成请求后,再经历一次“四次握手”的过程来断开连接。
这里写图片描述

  • Socket通信
    Socket通信是基于TCP/IP协议的封装,建立一次Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket;另外一个运行于服务器端,称为ServerSocket。就像下图描述的,Socket
    通信的过程分为四个步骤:服务器监听,客户端请求,连接确认,数据传输。
    这里写图片描述

  • 服务器监听:ServiceSocket通过调用bind()函数绑定某个具体的端口,然后调用listen()函数实时监控网路状态,等待客户端的连接请求。

  • 客户端请求:ClientSocket调用connect()函数向ServiceSocket绑定的地址和端口发起连接请求。

  • 服务端连接确认:当ServiceSocket监听到或者接收到ClientSocket的连接请求时,调用accept()函数响应ClientSocket的请求,同客户端建立连接。

  • 数据传输:当ClientSocket和ServiceSocket建立连接后,ClientSocket调用Send()函数,ServiceSocket调用Receive函数,ServerSocket处理完请求后,调用send()函数,ClientSocket调用receive()函数,就可以得到返回的结果。

当遇到网络闪断,连接超时,服务器宕机等各种异常,通常的处理手段有两种。

  • 链路存活检测:客户端发送心跳检测信息给服务端,服务端通过检测心跳判断链路存活状态。
  • 断连重试:

2.服务端如何处理请求?

  • 同步阻塞方式(BIO)
  • 同步非阻塞方式(NIO)
  • 异步非阻塞方式(AIO)

3.数据传输采用什么协议?
最常用的有HTTP协议,通常协议契约包括两个部分:消息头和消息体。
消费头存放的是协议的公共字段以及用户的扩展字段,消息体存放的是传输数据的具体内容。

4.数据该如何序列化和反序列化?

一般数据在网络中进行传输前,都要在发送方一端对数据进行编码,经过网络传输到另一端,再对数据进行解码,这个过程就是序列化和反序列化。
为什么要对数据进行序列化和反序列化呢?
要知道网络传输的耗时取决于网络带宽的大小和数据的传输量。要加快网络传输,要么提高带宽,要么减少数据量。而对数据编码的目的就是减少数据量。
常见的序列化的方式分为两类:文本类如XML/JSON等,二进制类如PB/Thrift等,具体采用哪种方式,主要取决于以下几个因素。

  • 支持数据结构类型的丰富度
  • 跨语言支持
  • 性能

猜你喜欢

转载自blog.csdn.net/weixin_43136566/article/details/82492535