abelkhan中的rpc框架

rpc简介:http://www.ibm.com/developerworks/cn/aix/library/au-rpc_programming/index.html

常见的rpc框架有protobufthrift

不过abelkhan没有采用这些开源的rpc框架,而是选择自己开发了一套新的rpc框架juggle(主要是为了享受重复发明轮子的乐趣)。

juggle采用一套dsl语言描述通信协议,然后使用codegen生成对应c++或c#的代码。dsl语言的语法如下:

module test{
        void test_func(string argv1, int argv2);
}

其中module在juggle中表示一组协议,在codegen的过程中,会以module为单位生成c++(c#)文件。
在juggle中函数返回值只能是void,因为juggle中的函数是远程调用(也就是说,当调用juggle的一个函数时,会发送一条消息到连接的目标进程),不支持立刻返回返回值。
juggle支持string、int、bool、float、array和table 6种数据类型。
juggle中的类型,在c++和c#中的对应类型如下:

bool               ->        in cpp bool  (in c# Boolean)

int                  ->        in cpp int64_t (in c# Int64)

float               ->         in cpp double (in c# Double)

string             ->         in cpp std::string (in c# String)

array             ->         in cpp std::vector<boost::any> (in c# ArrayList)

table             ->         in cpp std::unordered_map<std::string, boost::any> (in c# Hashtable)

编写juggle的dsl脚本之后,进入juggle目录之后,执行gencpp即可生成c++代码(gencsharp生成c#代码)。
调用gencpp需要传入的2个参数,第一个为dsl脚本所在目录,第二个为生成代码所在的文件夹。

生成代码如下:

/*this caller file is codegen by juggle for c++*/
#include <sstream>
#include <tuple>
#include <string>
#include <Icaller.h>
#include <Ichannel.h>
#include <boost/any.hpp>
#include <boost/make_shared.hpp>

namespace caller
{
class test : public juggle::Icaller {
public:
    test(boost::shared_ptr<juggle::Ichannel> _ch) : Icaller(_ch) {
        module_name = "test";
    }

    ~test(){
    }

    void test_func(std::string argv0,int64_t argv1){
        auto v = boost::make_shared<std::vector<boost::any> >();
        v->push_back("test");
        v->push_back("test_func");
        v->push_back(boost::make_shared<std::vector<boost::any> >());
        (boost::any_cast<boost::shared_ptr<std::vector<boost::any> > >((*v)[2]))->push_back(argv0);
        (boost::any_cast<boost::shared_ptr<std::vector<boost::any> > >((*v)[2]))->push_back(argv1);
        ch->push(v);
    }

};

}
/*this module file is codegen by juggle for c++*/
#include <Imodule.h>
#include <boost/shared_ptr.hpp>
#include <boost/signals2.hpp>
#include <string>
namespace module
{
class test : public juggle::Imodule {
public:
    test(){
        module_name = "test";
        protcolcall_set.insert(std::make_pair("test_func", boost::bind(&test::test_func, this, _1)));
    }

    ~test(){
    }

    boost::signals2::signal<void(std::string, int64_t) > sigtest_funchandle;
    void test_func(boost::shared_ptr<std::vector<boost::any> > _event){
        sigtest_funchandle(
            boost::any_cast<std::string>((*_event)[0]),
            boost::any_cast<int64_t>((*_event)[1]));
    }

};

}

caller文件夹中的是供发起远程调用端调用的代码,module是响应远程调用所需代码。

将生成的代码以include的方式引用头文件即可使用。

abelkhan服务器框架论坛:http://abelkhan.com/forum.php?mod=forumdisplay&fid=2&page=1

时间: 2024-12-03 14:42:20

abelkhan中的rpc框架的相关文章

3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop中的RPC应用实例demo 在windows是调用端,在linux里是服务端. 在这里,需要LoginServiceinterface.java 停止 出错误了,很明显. 这是个很好的思考题?

Hadoop_12_Hadoop 中的RPC框架演示

Hadoop中自己提供了一个RPC的框架.集群中各节点的通讯都使用了那个框架 1.服务端 1.1.业务接口:ClientNamenodeProtocol package cn.bigdata.hdfs.hadoopRpc.protocol; //定义业务接口方法 public interface ClientNamenodeProtocol { // 协议版本号 public static final long versionID = 1L; public String getMetaData(

java中常见的rpc框架介绍

姓名:邓勇  班级:软件151 RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例. 其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper).客户端和服务端可以运行在不同的JVM中,Client只需要引入接口,

JAVA中几种常用的RPC框架介绍

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例. 对于RPC有一个逻辑关系图,以RMI为例: 其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper). 客户端和服务端可以运行在不同的JVM中,Client只

Java基础:动态代理在RPC框架中应用

转载请注明出处:jiq?钦's technical Blog RPC,远端过程调用.就是调用远端机器上的方法. 原理其实很简单,就是客户端上运行的程序在调用对象方法时,底层将针对该方法的调用转换为TCP/HTTP请求,发送到远端服务器,远端服务器监听固定端口,收到这个TCP/HTTP请求后会解析出相关信息,包括客户端想要调用哪个类的哪个方法,参数是什么等,然后进行对应的调用,将调用结果再通过数据包发回即可. RPC中一般会有一些"契约"的概念,即客户端和服务端双方约定好的接口,表明服务

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所

RPC框架性能基本比较测试

gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言. 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持. 我们可以设想一下,未来浏览器支持HTTP2.0,并通过现有开源序列化库比如protobuf等,可以直接和各种语言的服务进行高效交互,这将是多么“美好”的场景! gPRC的Java实现底层网络库是Netty,而且是用到最新的Netty5.0.0.Alpha3的开发版本,因为最新版本针对HTTP/2做了很

python开发中常用的框架

以下是15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后台. Diesel:基于Greenlet的事件I/O框架 Diesel提供一个整洁的API来编写

C# 的轻量级 RPC 框架

Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 Time taken for tests: 0.886 seconds Time per request: 0.044 ms (avg) Requests per second: 22573 [#/sec] (avg) Concurrency level: 8