`
febird
  • 浏览: 247004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

febird.rpc 实现技术

阅读更多

使用C++模板实现不需要IDLRPC

 

IDL的数据定义由几个宏定义实现:

 

RPC_DECLARE_MF(FunName, ArgList)

声明函数,ArgList必须带括号

BEGIN_RPC_ADD_MF_EX(ThisClass,ClassName)

BEGIN_RPC_ADD_MF(ThisClass)

开始注册函数

EX后缀可以使用指定的名字作为类名称

RPC_ADD_MF(FunName)

注册一个函数

END_RPC_ADD_MF()

结束注册

 

用起来很类似于微软MFC中的消息映射声明。

 

实现上有过几次改动:

初始完成

l  每个ClientStub都有一个Stub的引用和一个真实的Stub实例

l  Server端的Servant对象没有名字,用到哪个类,自动创建一个该类对象

l  参数序列化时,除非明确指定rpc_in/rpc_out/rpc_inout,否则都是双向传送

l  第一次调用远程函数时使用名字调用,以后都使用ID调用

l  只有同步调用(Client等待Server返回)

第二次改动

l  使用模板偏特化,自动推导参数的传送方式

l  实现了异步调用

目前状态

l  Server端可以有GlobaleScopeSessionScope对象

l  Global对象在Server整个运行期间都存在【除非显式删除】

l  Session对象仅在一个会话中有效,会话结束就被删除

l  Client可以创建、查询GlobaleScopeSessionScopeServant

l  Client/Server本身也使用这种rpc声明方式(rpc_interface.h

l  Server启动时可以注册一些驻留的GlobaleScope对象,这些对象由用户创建后调用rpc_server.add_servant(obj,name)注册

 

通信对象也被看做一个SessionScope对象,在客户端,这个对象由rpc_client表示,在服务端,由RpcSession表示。这个对象的ID1,连接建立起来之后,两端就都把自己放入SessionScope对象池。这样,就可以方便地使用rpc_interface.h中定义的函数。这个过程相当于自己的bootstrap。但是,在Server上销毁RpcSession对象时,需要先把自己从SessionScope对象池中删除,然后再销毁SessionScope对象池中的所有对象。

client.h[.cpp]

rpc客户端实现

server.h[.cpp]

rpc服务端实现

rpc_basic.h

rpc基本类型定义

client_io.h

客户端io

server_io.h

服务端io

rpc_interface.h

客户端/服务端接口定义

arg_traits.h

推导rpc参数,函数原型推导为rpc io参数

pp_arglist_type.h

arglist

偏特化,用来配合boost.pp生成模板代码

pp_client_stub.h

客户端桩函数

pp_server_stub.h

服务端桩函数

 

函数参数的推导(以T为未修饰类型):

T

rpc_in<T>

输入参数,只被传入,不被传出

const T

rpc_in<T>

const T&

rpc_in<T>

const T*

rpc_in<T>

T&

rpc_inout<T>

输入/输出参数,既被传入,又被传出

T*

rpc_out<T>

输出参数,不被传入,只被传出

remote_object

的派生类另外处理

只传把对象ID作为输入参数传递

 

要做这个推导的原因是:C++在传递参数时,T会隐式转换成T&或者const T&,如果T是一个临时对象(std::string getstr() 的返回值),可能会转化成const T&,如果不是临时变量(如void fun(int x)中的x),会推导为T&,从而,在将它传给输入输出函数时会引发不确定性。而通过推导,可以区分T的所有不同修饰,从而在输入输出时做到正确识别。

 

实现上,能放在.cpp中实现的,都尽量放在.cpp中,不能在.cpp中实现的,才放在.h中。rpc_clientrpc_server都可以通过模板参数来修改Input/Output的方式,目前可用的是二进制,也许将来可以使用文本(如XML rpcJsonRPC)。

 

 

 

项目地址:http://code.google.com/p/febird

分享到:
评论

相关推荐

    febird C++ 库(附带所有源码)

    febird.rpc is a C++ remote procedure call without an IDL supporting, it based on the serialization framework. febird.rpc provide convenient usage and fast performance, and an uniform coding style. ...

    rpc-Remote Procedure Call源码2

    远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

    图解迪杰斯特拉(Dijkstra)最短路径算法.docx

    一、最短路径的概念及应用 在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第 一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对 于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。 而最短路径这个词不用过多解释,就是其字面意思: 在图中,对于非带权无向图而言, 从源点到终点 边最少的路径(也就是 BFS 广度优先的方法); 而对于带权图而言, 从源点到终点权值之和最少的 路径叫最短路径; 最短路径应用:道路规划; 我们最关心的就是如何用代码去实现寻找最短路径, 通过实现最短路径有两种算法:Dijkstra 迪杰斯 特拉算法和 Floyd 弗洛伊德算法, 接下来我会详细讲解 Dijkstra 迪杰斯特拉算法;

    基于faster-rcnn实现的行人检测算法python源码+项目说明+详细注释.zip

    基于faster-rcnn实现的行人检测算法python源码+项目说明+详细注释.zip 使用方法: 1.编译安装faster-rcnn的python接口,代码在:https://github.com/rbgirshick/py 2.下载训练好的caffe模型,百度云链接为:https://pan.baidu.com/s/1w479QUUAwLBS2AJbc-eXIA,将下载的模型文件放到faster-rcnn文件夹的data/faster_rcnn_models文件夹中 3.将本项目中的文件夹替换安装好的faster-rcnn源码中的文件夹 4.使用tools文件夹下的测试脚本运行demo:python person_detect.py

    jsp基于Web的可维护的数据库浏览器(源代码+论文+答辩PPT).zip

    jsp基于Web的可维护的数据库浏览器(源代码+论文+答辩PPT)

    node-v12.7.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    unet + pytorch 数据科学碗2018-python源码.zip

    unet + pytorch 数据科学碗2018-python源码.zip

    1999-2020年各地级市实际利用外资数据.xlsx

    数据预览链接:https://pan.baidu.com/s/17y5tiSmC5U4d1Mben250gg 提取码:u1da 更多介绍:https://blog.csdn.net/m0_71334485/article/details/138400336

    基于Torch Hub的渐进式GAN架构-python源码.zip

    基于Torch Hub的渐进式GAN架构-python源码.zip

    JSP基于Iptables图形管理工具的设计与实现(源代码+论文).zip

    JSP基于Iptables图形管理工具的设计与实现(源代码+论文)

    使用Keras+TensorFlow+FCN分割KITTI数据集-python源码.zip

    使用Keras+TensorFlow+FCN分割KITTI数据集-python源码.zip

    基于RRT采样对六轴机械臂进行路径规划Matlab完整源码+代码注释+项目说明.zip

    基于RRT采样对六轴机械臂进行路径规划Matlab完整源码+代码注释+项目说明.zip

    深蹲姿势分析-python源码.zip

    深蹲姿势分析-python源码.zip

    基于python实现的交通网络中的流量调控使用复杂网络中的级联失效模型.rar

    基于python实现的交通网络中的流量调控使用复杂网络中的级联失效模型.rar

    node-v4.4.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.8.7.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    深度残差网络ResNet-python源码.zip

    深度残差网络ResNet-python源码.zip

    基于oecms内核蓝色经典大方手机wap企业网站源码.zip

    触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板

    2007-2022商业银行绿色信贷数据绿色信贷余额贷款总额绿色信贷比率不良贷款率

    2007-2022商业银行绿色信贷数据绿色信贷余额贷款总额绿色信贷比率不良贷款率 在一定的客观缺失。 1、数据来源:公司年报、可持续发展报告、社会责任报告 2、数 据范围: 36家上市银行 北京银行、常熟银行、成都银行、工商银行、光大银行、贵阳 银行、杭州银行、华夏银行、建设银行、江苏银行、江阴银行、交通银行、民生银行、南京 银行、宁波银行、农业银行、平安银行、浦发银行、青岛银行、青农商行、上海银行、苏农 银行、苏州银行、无锡农村商业银行、西安银行、兴业银行、邮储银行、渝农商行、张家港 行、长沙银行、招商银行、浙商银行、郑州银行、中国银行、中信银行、紫金银行

    基于优化设计的储油罐变位识别与罐容表标定的研究.doc

    本文档是课题研究的研究报告内含调研以及源码设计以及结果分析

Global site tag (gtag.js) - Google Analytics