什么是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 中传回客户端。

最新文章

  1. 修改HTML5 input placeholder 颜色及修改失效的解决办法
  2. MySQL 分组后,统计记录条数
  3. 清除WebLogic8.1缓存
  4. 基于jQuery的简易瀑布流实现
  5. ajax状态码
  6. BZOJ 4027 兔子与樱花
  7. GridControl 继承写法修改自己的GridControl
  8. Castle IOC容器构建配置详解(一)
  9. 多校1005 HDU5785 Interesting (manacher)
  10. bzoj1820
  11. tomcat 项目部署问题
  12. zend framework 1 安装教程
  13. 访问 IIS 元数据库失败
  14. Android类似Periscope点赞效果
  15. -webkit-box-orient: vertical; 在webpack上失效
  16. react和vue的不同
  17. spring Date格式问题
  18. 【Spring】入门HelloWorld
  19. Android为TV端助力 自定义view中findViewById为空的解决办法
  20. php的Allowed memory size of 134217728 bytes exhausted问题解决办法

热门文章

  1. 九度OJ 1016:火星A+B (进制转换)
  2. bmdiff snappy lzw gzip
  3. 【题解】NOI2015软件包管理器
  4. 20170326 ABAP调用外部webservice 问题
  5. 常用js方法函数
  6. ansible2
  7. 【栈】日志分析(BSOJ2981)
  8. ss命令能识别的TCP状态的关键字
  9. Apache CGI 配置
  10. Nginx中如何限制某个IP同一时间段的访问次数