• 我理解的RPC


    这两天在学习公司一牛人写的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:心跳
     
    ---完
  • 相关阅读:
    「初级篇」跟我一起学docker(二)--核心概念和安装
    程序员有哪些借口可以让自己写出低质量的代码?
    「初级篇」跟我一起学docker(一)--认识
    后端程序猿怎么提高技术?提高编码质量?
    河南这么大的省,也所谓的准一线,为什么IT行业就是发展不起来呢?
    JAVA使用Gson解析json数据,实例
    JAVA equals 和 “==”的异同
    JAVA WEB 对返回数据进行按中文名称首字母A~Z升序排序
    JAVA验证数字的正则表达式,来一发
    【转】Java.util.ArrayList.set()方法实例
  • 原文地址:https://www.cnblogs.com/zeng-wei/p/3669660.html
Copyright © 2020-2023  润新知