RPC原理与实践(一)----RPC原理与实现(Thrift版)

  什么是RPC?为什么要使用RPC?

    1. 首先什么是RPC,RPC全称Remote Process Call,远程过程调用,现在几乎所有的公司都在使用RPC这种架构,诸如YOUTUBE使用的Thrift,Baidu的BaiduRPC等等,并且RPC也是分布式计算的基础。首先我们应该明白RPC是干什么的?顾名思义,远程过程调用,远程可以说明是一种c/s架构,过程调用可以说明调用的是一些方法。
    2. 为什么要使用RPC,其实这个问题可以从一个公司的发展历程来了解。最开始一个公司开发了一个产品,这个产品QPS并不是很高,业务逻辑也不复杂,运算量也很小,这个时候一台服务器就可以运行这个产品(如图一)。慢慢的使用这个产品的人越来越多,QPS提高了,同时产品的业务也变得越来越复杂,一台服务器已经无法完成这个工作了,因此我们需要搭建多台服务器同时运行(如图二)。比如:一台服务器负责用户信息的维护,一台负责用户接收用户请求,一台服务进行请求处理返回。这样由于一个产品存在很多个服务器,我们应该如何来调用这些机器上面提供的服务呢?这就是RPC由来。

    图一图二

3. 上面我们了解到rpc的一个大致的含义,下面我们来看看RPC都有一些什么组成部分,由于是C/S架构,所以必须存在的是Client,Server。在调用的时候会涉及到参数传递,所以我们需要使用序列化技术。C/S之间需要进行网络传输,所以需要考虑传输协议的问题。这就是大致的组成,我们可以围绕以下这张图来进行学习。下面我们分别讲解以上几个模块的作用:

      • Client: 获取Server端导出的RPC接口,并序列化参数,进行协议封装,发起请求
      • Server:  导出RPC接口
      • 序列化: 负责将参数进行编码
      • 协议: 负责进行网络传输

    4. 下面我们以Thrift HelloWorld版本来介绍RPC在实现过程中的具有细节:

      • thrift客户端时序图:大图

      

       我们大致讲解一下这个过程: HelloClient -->create socket -->open socket --> create protocol -->create client -->wite message(参数等) -->flush(发起请求) --> get result --> read result;大致的过程就是这样。程序调用了 Hello.Client       的 helloVoid 方法,在 helloVoid 方法中,通过 send_helloVoid 方法发送对服务的调用请求,通过 recv_helloVoid 方法接收服务处理请求后返回的结果。

 

      • Client server端时序图:大图

                 其实这个过程与上面Client的类似,程序调用了 TThreadPoolServer 的 serve 方法后,server 进入阻塞监听状态,其阻塞在 TServerSocket 的 accept 方法上。当接收到来自客户端的消息后,服务器发起一个新线程处理这个消息请求,原线程再次进入阻塞状态。在新线程中,服务器通过 TBinaryProtocol 协议读取消息内容,调用 HelloServiceImpl 的 helloVoid 方法,并将结果写入 helloVoid_result 中传回客户端。

posted @ 2016-11-18 15:40  奋斗中的屌丝  阅读(2468)  评论(0编辑  收藏  举报