zoukankan      html  css  js  c++  java
  • 微服务学习之路(三)——实现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高很多,但可读性较差。

          

  • 相关阅读:
    hive函数总结
    python判断文件和目录是否存在
    python中的参数
    写hive db的两种方法
    python中argparse模块的使用
    python数据持久存储:pickle模块的使用
    python读文件
    mysql 将时间戳直接转换成日期时间
    shell日期的应用
    [转]SQL UNION 和 UNION ALL 操作符
  • 原文地址:https://www.cnblogs.com/gzhcsu/p/11389235.html
Copyright © 2011-2022 走看看