微服务学习之路(三)——实现RPC远程服务调用

RPC(Remote Producedure Call)调用原理:服务消费者称为客户端,服务提供者称为服务端,处于不同网络地址,需要建立网络连接。建立连接后,双方还必须按照某种约定的协议进行网络通讯——通讯协议。正常通讯后,为了减少传输数据大小,还要对数据进行压缩——数据序列化和反序列化。

  如何建立连接?服务端如何处理请求?数据传输采用什么协议?数据怎能序列化和反序列化?

一、客户端和服务端之间基于TCP协议建立网络常用两种途径。

1、HTTP通讯

2、Socket 通讯

  Socket通讯时基于TCP/IP协议的封装,建立一次Socket连接至少需要一对套接字,其中一个运行于客户端——ClientSocket;另外一个运行于服务器端——ServerSocket。

  Socket通讯分为四步:服务器监听、客户端请求、连接确认、数据传输

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

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

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

  * 数据传输:当ClientSocket和ServerSocket建立连接后,ClientSocket调用send()函数,ServerClient调用recevice()函数,ServerSocket处理请求后,调用send()函数,ClientSocket调用recevice()函数,就可以得到返回结果。

当网络不可靠,出现网络闪断,连接超时,服务器宕机等,通常处理手段有两种:

  * 链路存活检测:客户端需要定时发送心跳检测机制(一般通过ping请求)给客户端,如果服务器连续n次心跳检测或者超过规定的时间都没有回复消息,则认为此时连接已经失效,这个时候客户端就需要重新与服务端建立连接。

  * 段连重试:通常有多种情况会导致连接断开,比如客户端主动关闭、服务端宕机或者网络故障等。这个时候客户端就需要与服务器重新建立连接,但一般不能立刻完成重连,而时是要等待固定的间隔后再发起重连,避免服务端的连接回收不及时,而客户端瞬间重连的请求太多而把服务端的连接数占满。

 二、服务端如何处理请求

  * 同步阻塞方式(BIO)

  * 同步非阻塞方式(NIO)

  * 异步非阻塞方式(AIO)

三、数据改如何序列化和反序列化

  常见两类:文本类 XML/JSON;二进制类 PB/Thrift

  考虑三方面:

  * 支持数据结构类型的丰富度

  * 跨语言支持

  * 性能。PB序列化的压缩比和速度都要比JSON高很多,但可读性较差。

      

原文地址:https://www.cnblogs.com/gzhcsu/p/11389235.html