这两天在学习公司一牛人写的RPC框架,一直都对RPC的概念很模糊,现在稍微清晰了些。
 
rpc定义:RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
 
我理解的是在应用中要想对集群中所有的机器状况有了解,就要有一台机器知道集群中的所有机器的情况,这台就是server了,其他的都是agent。agent要知道谁是server,包括ip和端口,server要事先主动暴露ip、端口还有注册的服务。这样agent主动周期发送心跳并携带本机的相关参数到server,server接收请求并处理,返回相应数据。当然中间需要一致的协议,目前我们使用的是msgpack。
 
以下是阅读代码时的记录,类名及相关参数是基于源码的。
server端:
class RPCServer实例化时启动一个http server应该是监控server 处理情况的(下面处理过程中更新的handleStatus)
RPCServer启动前要注册服务,类名或者是moudle.class,这个也就是client端调用时的service和method,可以注册多个。注册的服务是放到RPCServer实例的serviceMap字典中,key是service名称,value是service实例。
然后RPCServer启动,通过eventlet.server监听某个端口及绑定处理客户端链接的方法---handle
 
handle的处理:
1.更新handleStatus活动连接数
2.实例化一个eventlet.GreenPool池
3.循环:
     从暴露的端口中读取client的数据,更新handleStatus接收字节数,反序列化并从greenpool中取一个协程处理,直到端口中没有数据为止
     协程处理是采用线程安全的方式,调用相应的处理方式---从RPCServer启动前注册服务的字典serviceMap中找,找到
     就调用方法处理message,并序列化返回的结果给client,更新handleStatus返回字节数。
4.最后更新handleStatus活动连接数 减1
 
handleStatus主要为http server提供RPCServer的处理状态的
 
agent(client)端:
client是要知道server的地址及监听端口,还有注册的服务的,client启动时实例化一个Session实例(用来保存发送到server的信息,实际应该是监控请求发送是否完成),每发送一次请求到server都会在client端的这个实例的_request_table(一个字典)中设置本次请求的msg_id,值为Future,Future是用来监控返回是否成功的【self.session.set(msgid, request.future)】
然后序列化(msgpack)请求信息 包括请求id,service,method等,放到一个client维护的队列中,这个队列是client启动时就实例化的,同时还启动了三个协程
pool.spawn_n(self.read_greenlet)
pool.spawn_n(self.write_greenlet)
pool.spawn_n(self.heartbeat_greenlet)
read_greenlet:监听server端的响应(死循环)
write_greenlet:从队列获取请求并发送到server(死循环)
heartbeat_greenlet:心跳

 
---完

我理解的RPC的更多相关文章

  1. 理解REST和RPC

    REST 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 网站开发,完全可以采用软件开发的模式.但是传统上,软件和网络是两个不同的领域,很少有交集:软件开发主要针对单机环境,网络则主要研究 ...

  2. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  3. RPC 的概念模型与实现解析

    今天分布式应用.云计算.微服务大行其道,作为其技术基石之一的 RPC 你了解多少?一篇 RPC 的技术总结文章,数了下 5k+ 字,略长,可能也不适合休闲的碎片化时间阅读,可以先收藏抽空再细读:) 全 ...

  4. RPC原理详解

    RPC 功能目标 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性. 为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分 ...

  5. RPC介绍

    转载http://blog.csdn.net/mindfloating/article/details/39474123/ 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 ...

  6. 深入浅出 RPC - 浅出篇+深入篇

    摘自: http://blog.csdn.net/mindfloating/article/details/39473807 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 ...

  7. 深入浅出 RPC - 深入篇

    <深入篇>我们主要围绕 RPC 的功能目标和实现考量去展开,一个基本的 RPC 框架应该提供什么功能,满足什么要求以及如何去实现它? RPC 功能目标 RPC 的主要功能目标是让构建分布式 ...

  8. RPC 的概念模型与实现解析(转)

    今天分布式应用.云计算.微服务大行其道,作为其技术基石之一的 RPC 你了解多少?一篇 RPC 的技术总结文章,数了下 5k+ 字,略长,可能也不适合休闲的碎片化时间阅读,可以先收藏抽空再细读:) 全 ...

  9. 浅析RPC概念框架

    本文原封不动的来至于csdn MindWind,原文请见 RPC:RPC 的全称是 Remote Procedure Call 是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一 ...

随机推荐

  1. Nginx+Keepalived主备负载均衡

    实验环境及软件版本: CentOS版本:    6.6(2.6.32.-504.el6.x86_64) nginx版本:     nginx-1.6.2 keepalived版本:keepalived ...

  2. python特性property

    通常,访问类和实例属性的时候,将返回所存储的相关值,也就是直接和类(实例的)的__dict__打交道.若果要规范这些访问和设值方式的话, 一种方法是数据描述符,另一种就是python内置的数据描述符协 ...

  3. centos6.5 mysql配置整理

    安装 // 安装mysql yum -y install mysql-server //设置开机启动 chkconfig mysqld on //启动MySql服务 service mysqld st ...

  4. vs2013 上传碰到的问题:“输入的不是有效的 Base-64 字符串 ”

    action 代码: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create( ImageStoreModels images ...

  5. 一步步学习ASP.NET MVC3 (12)——FileResult

    请注明转载地址:http://www.cnblogs.com/arhat 忙了两天,本来老魏昨天就应该写出新的文章,但是由于昨天雨夹雪而且加上昨天晚上加了班,到家都没饭吃了,一看时间都9点了,什么饭店 ...

  6. Almeza MultiSet Pro(批量安装程序) V8.7.6中文特别版

    Almeza MultiSet Pro(批量安装程序)是一款非常实用的工具.它能够帮你批量地安装常用的软件.这将解决每次重装系统后能够快速方便地重装常用软件.使用这款软件不需要编写程序,还可以在安装过 ...

  7. Firefly官方教程之Distributed使用文档

    原地址:http://bbs.gameres.com/thread_224191.html distributed使用文档1.distributed说明该模块主要封装了各个服务进程间进行通信的方法.n ...

  8. CSS 背景-CSS background

    这里有个很好的样式学习网站:http://www.divcss5.com/rumen/r125.shtml 一.Css background背景语法   -   TOP CSS背景基础知识 CSS 背 ...

  9. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-004- 处理上传文件

    一.用 MultipartFile 1.在html中设置<form enctype="multipart/form-data">及<input type=&quo ...

  10. 在C++中子类继承和调用父类的构造函数方法

    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需 ...