这两天在学习公司一牛人写的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. python--multiprocessing多进程总结

    由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用的多进程包multiproces ...

  2. django 中的延迟加载技术,python中的lazy技术

    ---恢复内容开始--- 说起lazy_object,首先想到的是django orm中的query_set.fn.Stream这两个类. query_set只在需要数据库中的数据的时候才 产生db ...

  3. B树及2-3树的python实现

    B树(或称B-树)是一种适用于外查找的树,它是一种平衡的多叉树. 阶为M的B树具有下列结构特征: 1.树的根或者是一片树叶,或者其儿子数在2和M之间. 2.除根节点外的所有非树叶节点儿子数在┌M/2┐ ...

  4. ASP.NET 学习小记 -- “迷你”MVC实现(2)

    Controller的激活 ASP.NET MVC的URL路由系统通过注册的路由表对HTTO请求进行解析从而得到一个用户封装路由数据的RouteData对象,而这个过程是通过自定义的UrlRoutin ...

  5. 2014年辛星完全解读Javascript第一节

    ***************概述*************** 1.Javascript是一种原型化继承的基于对象的动态类型的脚本语言,它区分大小写,主要运行在客户端,用户即使响应用户的操作并进行数 ...

  6. 开发设计模式(三)策略模式(Strategy Pattern)

    转自http://blog.sina.com.cn/s/blog_89d90b7c01017zrr.html 下面的环境是unity3d,用C#进行编码,当然有人会说这是在乱用模式,U3D不一定适合使 ...

  7. About Interface

      http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners   Interface can't have thi ...

  8. POJ 1236 Network of Schools[连通分量]

    题目链接:http://poj.org/problem?id=1236题目大意:给出N台电脑,电脑间单向连通传送文件问题1.网络中最少放几个文件保证所有电脑都能接受到文件问题2.最少向网络中加几条线保 ...

  9. *[codility]ArrayInversionCount

    http://codility.com/demo/take-sample-test/arrayinversioncount 求逆序对数,归并排序并记录逆序次数. // you can also use ...

  10. simplemodal — jquery弹出窗体插件

    方式一:使用jquery-1.7.1.min.js(1.9.1的版本我试过了,不行) + jquery_modal.js的方式 文件:        testModel.css: /* Overlay ...