想要完成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等,具体采用哪种方式,主要取决于以下几个因素。
- 支持数据结构类型的丰富度
- 跨语言支持
- 性能