RPC 其实就是像 HTTP 一样的东西,请求和响应。

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

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

客户端和服务端如何建立网络连接?

HTTP

HTTP 通信是基于应用层 HTTP 协议的,而 HTTP 协议又是基于传输层 TCP 协议的。

HTTP 通信过程就是发起一次 HTTP 调用,而一次 HTTP 调用就会建立一个 TCP 连接,经历一次下图所示的“三次握手”的过程来建立连接。

image.png

完成请求后,再经历一次“四次挥手”的过程来断开连接。

image.png

Socket

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

image.png

处理异常的方法:

  • 链路存活检测:客户端需要定时地发送心跳检测消息(一般是通过 ping 请求)给服务端,如果服务端连续 n 次心跳检测或者超过规定的时间都没有回复消息,则认为此时链路已经失效,这个时候客户端就需要重新与服务端建立连接。
  • 断连重试:通常有多种情况会导致连接断开,比如客户端主动关闭、服务端宕机或者网络故障等。这个时候客户端就需要与服务端重新建立连接,但一般不能立刻完成重连,而是要等待固定的间隔后再发起重连,避免服务端的连接回收不及时,而客户端瞬间重连的请求太多而把服务端的连接数占满。

服务端如何处理请求?

通常来讲,有三种处理方式:

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

最后再花费一些精力去解决服务消费者和服务提供者之间的网络可靠性问题。

参考:

数据传输采用什么协议?

TCP 流的封包。

  • HTTP
  • Dubbo

通常协议契约包括两个部分:消息头和消息体。其中消息头存放的是协议的公共字段以及用户扩展字段,消息体存放的是传输数据的具体内容。

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

为什么要对数据进行序列化和反序列化呢?

  • 减小网络传输耗时
    • 带宽
    • 数据量
  • 解决内存中数据结构到字节序列的映射

序列化选择考虑因素:

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

总结

  • 通信框架。它主要解决客户端和服务端如何建立连接、管理连接以及服务端如何处理请求的问题。
  • 通信协议。它主要解决客户端和服务端采用哪种数据传输协议的问题。(应该是指业务上的通信协议)
  • 序列化和反序列化。它主要解决客户端和服务端采用哪种数据编解码的问题。