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

RPC原理与实践(一)----RPC原理与实现(Thrift版)的更多相关文章

  1. Redis核心原理与实践--字符串实现原理

    Redis是一个键值对数据库(key-value DB),下面是一个简单的Redis的命令: > SET msg "hello wolrd" 该命令将键"msg&q ...

  2. Redis核心原理与实践--列表实现原理之ziplist

    列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入.弹出数据,可以充当栈和队列的角色. > LPUSH fruit apple (integer) 1 > RPUSH ...

  3. Redis核心原理与实践--列表实现原理之quicklist结构

    在上一篇文章<Redis列表实现原理之ziplist结构>,我们分析了ziplist结构如何使用一块完整的内存存储列表数据. 同时也提出了一个问题:如果链表很长,ziplist中每次插入或 ...

  4. 分布式开放消息系统(RocketMQ)的原理与实践(转)

    转自:http://www.jianshu.com/p/453c6e7ff81c 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回 ...

  5. 20165223《网络对抗技术》Exp3 免杀原理与实践

    目录 -- 免杀原理与实践 免杀原理与实践 本次实验任务 基础知识问答 免杀扫描引擎 实验内容 正确使用msf编码器,msfvenom生成jar等文件,veil-evasion,加壳工具,使用shel ...

  6. 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...

  7. 2018-2019-2 网络对抗技术 20165232 Exp2 后门原理与实践

    2018-2019-2 网络对抗技术 20165232 Exp2 后门原理与实践 1. 后门原理与实践实验说明及预备知识 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 ( ...

  8. 2018-2019-2 网络对抗技术 20165311 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165311 Exp3 免杀原理与实践 免杀原理及基础问题回答 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil- ...

  9. 2018-2019-2 《网络对抗技术》Exp2 后门原理与实践

    2018-2019-2 <网络对抗技术>Exp2 后门原理与实践 1. 后门原理与实践实验说明及预备知识 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0. ...

  10. 2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...

随机推荐

  1. kafka source type

    https://flume.apache.org/FlumeUserGuide.html # example.conf: A single-node Flume configuration # Nam ...

  2. Optimistic concurrency control

    Optimistic concurrency control https://en.wikipedia.org/wiki/Optimistic_concurrency_control Optimist ...

  3. flask的请求上下文源码解读

    一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...

  4. Django 之 Paginator 分页功能

    Django Paginator Django 分页官方文档  https://docs.djangoproject.com/en/1.10/topics/pagination/ 此分页方法没有限制显 ...

  5. zabbix 监控 haproxy 记录

    1. 当配置好后,遇到 Value should be a JSON object. 该如何是好? sudo 文件增加: zabbix ALL=(ALL) NOPASSWD: ALL haproxy ...

  6. python处理txt文件的一种情况

    在txt文本中,以换行符作为标记分段处理txt文件中的内容的方法: with open(path, 'r', encoding='utf-8') as f: for line in f: if lin ...

  7. 纯CSS3实现淡入淡出下拉菜单

    纯CSS3实现淡入淡出下拉菜单是一款比较简单清新的CSS3教程下拉菜单,这款下拉菜单是垂直方向的,点击主菜单项可以展开和折叠子菜单,在展开折叠的过程中伴随着淡入淡出的动画效果 源代码:http://w ...

  8. ASM磁盘组mount一例

    环境信息: oracle10gRAC  +  RHEL5.8 问题现象: db1服务器crs服务正常,ASM的data磁盘组处于dismount状态.db2集群服务正常. SQL> select ...

  9. COM对象创建过程

    在客户端需要调用COM组件时,通常调用windowAPI函数: STDAPI CoCreateInstance( REFCLSID rclsid, //创建的Com对象的类标识符(CLSID) LPU ...

  10. kmp算法模板及理解

    kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式 ...