智能 RPC框架 (C++)

RPC中文叫远程函数调用,它是一种通信方式,只是看起来像普通的函数调用。

它包括三个基本要素:

1:服务端注册相应的(服务)函数(用于调用方调用)

2:调用方通过函数调用的方式将一些信息和参数打包到消息,然后发送消息给被调用方。

3:被调用方收到消息后,提取信息和参数。调用相应函数。

被调用方不需要用户手动解析参数,而是由"包装代码"预先解析出来。

目前很多rpc框架都(设计)配有协议描述文件,通过代码生成,产生((含有)"包装代码")服务端的服务类或函数。

我不喜欢代码生成,我喜欢直接在代码中搞定它。

果然,我最近看到有朋友在一些脚本语言中做到这点。某些实现还不需要手动(预先)注册服务函数。

比如:

https://github.com/sniperHW/distri.lua/blob/master/examples/rpcserver.lua

https://github.com/akirayu101/GM_RPC/blob/master/gmrpc_lua/rpc_handlers/rpc_handler_sample.lua

https://github.com/akirayu101/GM_RPC/blob/master/gmrpc_py/rpc_handlers/rpc_handler_sample.py

然而我又不熟悉lua或python,所以我用C++11 来实现了它。

主要功能:

1:注册服务函数

void test5(string a, int b, map<int, map<int, string>> vlist)
{
} 

rpc rpc_server; /*rpc服务器*/
rpc_server.def("test5", test5);

2:客户端调用远程函数

rpc rpc_client; /*rpc客户端*/
rpc_client.call("test5", "a", 1, mlist, [&upvalue](int a, int b){
    upvalue++;
    cout << "upvalue:" << upvalue << ", a:" << a << ", b:" << b << endl;
});

其中mlis是一个map<int,map<int,string>>类型变量。 rpc_client.call 的返回值是一个string,它表示此次call的消息。

我们可以把它(string 消息)通过网络发送给服务器。在这里(测试)我们直接通过下面的方式传递给服务端。

!!!注意!!!:call的最后一个参数可以是一个lambda,它表示处理此rpc返回值。 如果不是一个lambda,则它也是rpc调用参数。

3:服务端处理rpc request

rpc_server.handleRpc(rpc_request_msg);

其中 rpc_request_msg为接受到的网络消息(字符串)。

这样就会自动调用到我们的 test5 函数。 并且形参已经(自动)准备OK。你只需要在test5 里使用这些参数即可。(不用关心网络消息协议)。

4:被调用方可以返回数据给调用方

rpc_response_str = rpc_server.reply(1, 1, 2);   /* (1,1,2)中的1为调用方的req_id, (1,2)为返回值 */
rpc_client.handleResponse(rpc_response_str);

上面代码通过 rpc_server.reply返回消息给客户端。 然后客户端模拟收到消息后通过 rpc_client.handleResponse(rpc_response_str)

会回调rpc_client.call() 时 所传递的lambda回调函数。

注意:以上 服务函数(譬如test5)和rpc 返回值处理函数(譬如那个lambda)的参数 是任意个数,且"任意"类型

(支持 int,string,JsonObject-json对象,vector<int>,vector<string>, map<int,string>,map<string,int>,map<string,string>, map<int/string, 前述所有类型/递归> )

代码放在了 https://github.com/IronsDu/accumulation-dev/blob/master/utils/rpc_test.cpp 。

欢迎讨论。

时间: 2024-11-10 20:57:30

智能 RPC框架 (C++)的相关文章

rpc框架之thrift教程1 - 安装 及 hello world

thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.org 跨语言通常有二种做法, 一是将其它语言转换成某种主流的通用语言,比如:delphi.net以前就是先将delphi转换成c#,然后再编译成IL,从而实现delphi在.net上的运行(好久没关注delphi了,不知道现在还是不是这种机制) 二是先定义一种规范文件(可以简单的理解为『母版』),然后

RPC框架实践之:Apache Thrift

一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调用链:ServiceA ---> ServiceB ---> ServiceC 就是一个远程调用的例子,只不过这篇文章里是通过RestTemplate这种 同步调用方式,利用的是HTTP协议在应用层完成的,这种方法虽然奏效,但有时效率并不高.而RPC可以不依赖于应用层协议,可以直接基于TCP进行远

VIP_OSP--基于Thrift的RPC框架的基本原理

公司(VIP)从2015年开始在内部推动Venus框架的使用,这是一款基于Apache Thrift远程调用框架二次开发的高性能.高可扩展的.服务治理的RPC框架.服务端使用IDL进行服务的定义,客户端集成服务的SDK即可调用服务端的服务,开发简单,大部分的公共功能都在Proxy代理层工作,减轻了开发者的负担,使其只需要关注业务部分.下面是对该框架的基本原理的简单介绍.参考文献:1. Apache Thrift - 可伸缩的跨语言服务开发框架2. 公司内部的Venux文档(内网文档,无法分享)

一个入门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做了很

初见akka-02:rpc框架

1.RPC:简单点说,就是多线程之间的通信,我们今天用了scala以及akka 来简单的实现了 rpc框架的一些简单的内容,一脸包括了,心跳,间隔时间, 注册以及一些问题, 模式匹配的一些东西,虽然比较简单,但是属于麻雀虽小,五脏俱全 这个里面一共有有四个文件: Master.scala RemoteMessage.scala Worker.scala WorkerInfo Master.scala package cn.wj.rpc import akka.actor.{Actor, Acto

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

Google 高性能 RPC 框架 gRPC 1.0.0 发布(附精彩评论)

gRPC是一个高性能.开源.通用的RPC框架,面向移动和HTTP/2设计,是由谷歌发布的首款基于Protocol Buffers的RPC框架. gRPC基于HTTP/2标准设计,带来诸如双向流.流控.头部压缩.单TCP连接上的多复用请求等特性.这些特性使得其在移动设备上表现更好,更省电且节省空间占用. gRPC 1.0版本是2015年面世以后的第一次版本发布,开发者可以把该版本用于生产.API现在也是很稳定的. 关于Java版本发布情况,大家阅读发布日志:https://github.com/g

微博轻量级RPC框架Motan正式开源:支撑千亿调用

支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用.高可用的 RPC 服务框架. Motan 功能特点:简单.易用.高可用 无侵入集成.简单易用,通过 Spring 配