一个不错的的rpc开源代码-rest_rpc

简介: 一个不错的的rpc开源代码-rest_rpc

rest_rpc


c++11, high performance, cross platform, easy to use rpc framework.


It’s so easy to love RPC.


Modern C++开发的RPC库就是这么简单好用!


rest_rpc简介


rest_rpc是一个高性能、易用、跨平台、header only的c++11 rpc库,它的目标是让tcp通信变得非常简单易用,即使不懂网络通信的人也可以直接使用它。它依赖header-only的standalone asio(commit id:f70f65ae54351c209c3a24704624144bfe8e70a3)


可以快速上手,使用者只需要关注自己的业务逻辑即可。


谁在用rest_rpc


  1. 博世汽车
  2. 浙江智网科技
  3. purecpp.org


在这里增加用户


rest_rpc的特点



rest_rpc为用户提供了非常简单易用的接口,几行代码就可以实现rpc通信了,来看第一个例子


一个加法的rpc服务

//服务端注册加法rpc服务

struct dummy{
  int add(rpc_conn conn, int a, int b) { return a + b; }
};

int main(){
  rpc_server server(9000, std::thread::hardware_concurrency());

  dummy d;
  server.register_handler("add", &dummy::add, &d);
  
  server.run();
}
//客户端调用加法的rpc服务
int main(){
  rpc_client client("127.0.0.1", 9000);
  client.connect();

  int result = client.call<int>("add", 1, 2);

  client.run();
}


获取一个对象的rpc服务

//服务端注册获取person的rpc服务

//1.先定义person对象
struct person {
  int id;
  std::string name;
  int age;

  MSGPACK_DEFINE(id, name, age);
};

//2.提供并服务
person get_person(rpc_conn conn) {
  return { 1, "tom", 20 };
}

int main(){
  //...
  server.register_handler("get_person", get_person);
}
//客户端调用获取person对象的rpc服务
int main(){
  rpc_client client("127.0.0.1", 9000);
  client.connect();
  
  person result = client.call<person>("get_person");
  std::cout << result.name << std::endl;
  
  client.run();
}



异步?

同步?

future?

callback?


当初为了提供什么样的接口在社区群里还争论了一番,有人希望提供callback接口,有人希望提供future接口,最后我决定都提供,专治强迫症患者:)


现在想要的这些接口都给你提供了,你想用什么类型的接口就用什么类型的接口,够酷吧,让我们来看看怎么用这些接口吧:

//服务端提供echo服务
std::string echo(rpc_conn conn, const std::string& src) {
  return src;
}

server.register_handler("echo", echo);


客户端同步接口

auto result = client.call<std::string>("echo", "hello");


客户端异步回调接口

client.async_call("echo", [](asio::error_code ec, string_view data){
  auto str = as<std::string>(data);
  std::cout << "echo " << str << '\n';
});


async_call接口说明


有两个重载的async_call接口,一个是返回future的接口,一个是带超时的异步接口。


返回future的async_call接口:

std::future<std::string> future = client.async_call<CallModel::future>("echo", "purecpp");


带超时的异步回调接口:

async_call<timeout_ms>("some_rpc_service_name", callback, service_args...);


如果不显式设置超时时间的话,则会用默认的5s超时.

async_call("some_rpc_service_name", callback, args...);
client.async_call("echo", [](asio::error_code ec, string_view data) {
    if (ec) {                
        std::cout << ec.message() <<" "<< data << "\n";
        return;
    }

    auto result = as<std::string>(data);
    std::cout << result << " async\n";
}, "purecpp");


客户端异步future接口

auto future = client->async_call<FUTURE>("echo", "hello");
auto status = future.wait_for(std::chrono::seconds(2));
if (status == std::future_status::timeout) {
  std::cout << "timeout\n";
}
else if (status == std::future_status::ready) {
  auto str = future.get().as<std::string>();
  std::cout << "echo " << str << '\n';
}


除了上面的这些很棒的接口之外,更酷的是rest_rpc还支持了订阅发布的功能,这是目前很多rpc库做不到的。


服务端订阅发布的例子在这里:


https://github.com/qicosmos/rest_rpc/blob/master/examples/server/main.cpp#L121

https://github.com/qicosmos/rest_rpc/blob/master/examples/client/main.cpp#L383



rest_rpc是目前最快的rpc库,具体和grpc和brpc做了性能对比测试,rest_rpc性能是最高的,远超grpc。


性能测试的结果在这里:


https://github.com/qicosmos/rest_rpc/blob/master/doc/%E5%8D%95%E6%9C%BA%E4%B8%8Arest_rpc%E5%92%8Cbrpc%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.md


rest_rpc的更多用法


可以参考rest_rpc的example:


https://github.com/qicosmos/rest_rpc/tree/master/examples


future

make an IDL tool to genrate the client code.


目录
相关文章
|
13天前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
102 9
|
8月前
|
编解码 Dubbo 应用服务中间件
Alibaba开源Dubbo源码解析手册,竟引领出RPC的新潮流
前言 Apache Dubbo,一款由阿里巴巴于2011年开源的高性能Java RPC框架,自开源以来在业界产生了深远影响。有大量公司广泛使用,甚至很多公司的自研RPC框架中都能看到Dubbo的影子。Dubbo在国内服务化体系演进过程中扮演了重要角色。尽管经历了几年的沉寂,但在阿里巴巴重启对Dubbo的开源维护,Dubbo正在从微服务领域的高性能RPC框架逐步演变为一个完整的微服务生态。 对于开发者来说,深入了解Dubbo底层的架构设计和实现是一项挑战。因此,一份完整的、体系化的对Apache Dubbo进行深入原理剖析的手册就显得尤为重要。
|
7月前
|
缓存 Shell 网络安全
Github-推送代码报错“error:RPC failed;curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL,errno 10054”解决方案
Github-推送代码报错“error:RPC failed;curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL,errno 10054”解决方案
147 0
|
11月前
|
存储 JavaScript Linux
开源 Golang 微服务入门二:RPC 框架 Kitex| 青训营笔记
Kitex 字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。如果对微服务性能有要求,又希望定制扩展融入自己的治理体系,Kitex 会是一个不错的选
205 0
开源 Golang 微服务入门二:RPC 框架 Kitex| 青训营笔记
|
SQL Java 数据库连接
通过几段 Java 代码带你理解 RPC
RPC 远程过程调用可以说是分布式系统的基础,本文将通过 Java 演示一次普通的 rpc 调用到底发生了什么。 阿粉曾经在网上看到有人提问,为什么 RPC 要叫作远程过程调用,而不叫作 RMC 远程方法调用。但阿粉认为 RPC 的叫法才是合理的,远程调用的是某个过程,不一定是一个具体的方法。(你只要看过后面第一个版本的代码就能懂了)
通过几段 Java 代码带你理解 RPC
|
缓存 编解码 运维
徒手撸了一个RPC框架,理解更透彻了,代码已上传github,自取~
前段时间看到一篇不错的文章《看了这篇你就会手写RPC框架了》,于是便来了兴趣对着实现了一遍,后面觉得还有很多优化的地方便对其进行了改进。
徒手撸了一个RPC框架,理解更透彻了,代码已上传github,自取~
|
NoSQL Java 应用服务中间件
阿里开源分布式事务框架seata实践(原fescar) springboot +durid+mybitas+自有rpc框架
由于系统演进,大佬觉得 需要做微服务,脑子一拍开始对原来的系统进行微服务改造, 在改造过程中,分布式事务不可避免,tcc mq等等概念研究一遍后,结合时间成本,发现阿里gts 比较适合,无奈需要接入外网遂放弃,后来偶然发现seata 开源版gts 尝试接入项目
11133 0
|
Java Apache
Hadoop-rpc调用案例,服务端,客户端代码案例
1. Hadoop-rpc框架 在hadoop中提供了一个rpc框架,通过这个rpc框架可以编写一个rpc服务端程序,然后发布出去供客户端调用。 1.1.服务端代码 其中服务端(example-hadoop-rpc-server),其中代码结果如下: 代码说明: ClientNamenodeProtocal 接口定义 NameNode 接口的实现 ServerPublishe
1844 0