C++ 异步 RPC框架Rocket

这篇具有很好参考价值的文章主要介绍了C++ 异步 RPC框架Rocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础库开发

日志和配置模块等工具类开发

配置文件 xml(也可切换为 yaml、json 等作为配置文件)
简单,容易读取
可读性能接受
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

二、Eventloop模块

EventLoop 核心开发

C++ 异步 RPC框架Rocket,rpc,网络协议,网络

Reactor 是一种事件处理模型,又叫做反应堆模式。
核心是一个 Loop 循环,在循环里面不断调用 epoll_wait 监听套接字IO事件,一旦发生 IO 事件,epoll_wait 返回,线程转而去处理这些 IO 事件(一般是执行绑定在其上的回调函数)。处理完事件之后,又重新陷入到 epoll_wait 中,不断循环这个过程。

C++ 异步 RPC框架Rocket,rpc,网络协议,网络
mainReactor 由主线程运行,他作用如下:通过epoll监听listenfd的可读事件,当可读事件发生后,调用accept函数获取clientfd,然后随机取出一个subReactor,将cliednfd的读写事件注册到这个subReactor的epoll上即可。mainReactor只负责建立连接事件,不进行业务处理,也不关心已连接套接字的IO事件。

subReactor通常有多个,每个subReactor由一个线程来运行。其注册clientfd的读写事件,当发生IO事件后,需要进行业务处理。

C++ 异步 RPC框架Rocket,rpc,网络协议,网络

定时器开发

IO线程封装

三、TCP模块

TcpBuffer

为什么需要应用层buffer?

方便数据处理,特别是应用层的包组装和拆解(粘包黏包问题);
方便异步的发送(发送数据直接塞到发送缓冲区里面,等待 epoll 异步去发送);
提高发送效率,多个包合并一起发送;

C++ 异步 RPC框架Rocket,rpc,网络协议,网络
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

InBuffer:

服务端调用 read 成功从 socket 缓冲区读到数据,会写入到 InBuffer 后面
服务端从 InBuffer 前面读取数据,进行解码得到请求

OutBuffer:

服务端向外发送数据,会将数据编码后写入到 OutBuffer 后面
服务端在 fd 可写的情况下,调用 write 将 OutBuffer 里面的数据全部发送出去

TcpServer

C++ 异步 RPC框架Rocket,rpc,网络协议,网络
mainReactor 由主线程运行,他作用如下:通过epoll监听listenfd的可读事件,当可读事件发生后,调用accept函数获取clientfd,然后随机取出一个subReactor,将cliednfd的读写事件注册到这个subReactor的epoll上即可。mainReactor只负责建立连接事件,不进行业务处理,也不关心已连接套接字的IO事件。

subReactor通常有多个,每个subReactor由一个线程来运行。其注册clientfd的读写事件,当发生IO事件后,需要进行业务处理。
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

TcpConnection

Read:读取客户端发来的数据,组装为RPC请求
Excute:将RPC请求作为入参,执行业务逻辑得到RPC响应
Write:将RPC响应发送给客户端
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

TcpClient

非阻塞 Connect
返回 0,表示连接成功
返回 -1,但 errno== EINPROGRESS,表示连接正在建立,此时可以添加到 epoll 中去监听其可写事件。等待可写事件就绪后,调用 getsockopt 获取fd上的错误,错误为0代表连接建立成功。
其他 errno 直接报错
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

四、RPC协议封装

为什么要自定义协议格式?

既然用了 Protobuf 做序列化,为什么不直接把序列化后的结果直接发送,而要在上面在自定义一些字段?

1、为了方便分割请求:因为 protobuf 后的结果是一串无意义的字节流,你无法区分哪里是开始或者结束。 比如说把两个 Message 对象序列化后的结果排在一起,你甚至无法分开这两个请求。在 TCP 传输是按照字节流传输,没有包的概念,因此应用层就更无法去区分了;
2、为了定位:加上 MsgID 等信息,能帮助我们匹配一次 RPC 的请求和响应,不会串包;
3、错误提升:加上错误信息,能很容易知道 RPC 失败的原因,方便问题定位;

C++ 异步 RPC框架Rocket,rpc,网络协议,网络

protobuf使用流程:

1.编写proto文件
2.怎么调用proto文件
生成.cc .h文件
C++ 异步 RPC框架Rocket,rpc,网络协议,网络
C++ 异步 RPC框架Rocket,rpc,网络协议,网络
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

基于protobuf的自定义RPC协议编码

encode // 将 protobuf后的数据转化自定义协议格式(字节流),写入到 buffer

基于protobuf的自定义RPC协议解码

decode // 将 buffer 里面的字节流读出,是一个自定义协议格式,然后转换为 protobuf后的数据,加入处理队列

五、RPC模块封装

RpcController、Closure、RpcChannel都是对google::protobuf::RpcController、google::protobuf::Closure、 google::protobuf::RpcChannel等继承;

RPC 服务端流程 RpcDispatcher:

启动的时候就注册OrderService 对象。

  1. 从buffer读取数据,然后 decode 得到请求的 TinyPBProtobol 对象。然后从请求的 TinyPBProtobol 得到 method_name, 从 OrderService 对象里根据 service.method_name 找到方法 func

  2. 找到对应的 requeset type 以及 response type

  3. 将请求体 TinyPBProtobol 里面的 pb_date 反序列化为 requeset type 的一个对象, 声明一个空的 response type 对象

  4. func(request, response)

  5. 将 reponse 对象序列为 pb_data。 再塞入到 TinyPBProtobol 结构体中。做 encode 然后塞入到buffer里面,就会发送回包了

C++ 异步 RPC框架Rocket,rpc,网络协议,网络

C++ 异步 RPC框架Rocket,rpc,网络协议,网络

test_rpc_server.cc

1、#include “order . pb.h”
2、定义service对象 Order
C++ 异步 RPC框架Rocket,rpc,网络协议,网络
3、成功将我们的service对象注册到RPC方法里面
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

4、就启动tcp服务,也就是rpc
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

RpcChannel 用于客户端跟服务端通信

C++ 异步 RPC框架Rocket,rpc,网络协议,网络
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

RpcController:The primary purpose of the controller is to provide a way to manipulate settings specific to the RPC implementation and to find out about RPC-level errors.(设置请求的消息号)等
RcpClosure:Abstract interface for a callback.

test_ rpc_ client.cc

1、构造message对象makeOrderRequest
C++ 异步 RPC框架Rocket,rpc,网络协议,网络
2、构造message对象makeOrderResponse,设置controller
C++ 异步 RPC框架Rocket,rpc,网络协议,网络
3、设置回调函数
C++ 异步 RPC框架Rocket,rpc,网络协议,网络
4、初始化并调用channel
C++ 异步 RPC框架Rocket,rpc,网络协议,网络

RpcChannel 和RpcAsyncChannel

六、项目完善

日志的完善和优化

把logger的buffer中的数据写入到异步的队列缓存中,
利用一个线程,采用条件变量来实现生产者消费者模型来处理队列中的缓存,实现:读取队列中的数据并将数据写入日志。文章来源地址https://www.toymoban.com/news/detail-531272.html

代码生成工具脚手架封装

项目的构建和测试

到了这里,关于C++ 异步 RPC框架Rocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RPC分布式网络通信框架(一)—— protobuf的使用

    常见序列化和反序列化协议有XML、JSON、protobuf,相比于其他protobuf更有优势: 1、protobuf是二进制存储的,xml和json都是文本存储的。故protobuf占用带宽较低 2、protobuf不需要存储额外的信息。 json如何存储数据?键值对。例:Name:”zhang san”, pwd: “12345”。 protobuf存储数据的方式

    2024年02月16日
    浏览(52)
  • RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

    分布式系统存在的问题: 为了支持高并发,每个客户端都保存了一份服务提供者的 列表 。但是如果 列表 有更新,想要得到最新的URL列表(rpc服务的ip和端口号),必须要手动更新配置文件,很不方便。 如图所示,实例3挂掉了,但是 列表 并没有得到更新。 故需要动态的更

    2024年02月15日
    浏览(45)
  • Rpc异步日志模块

    在一个大型分布式系统中,任何部署的分布式节点都可能发生崩溃,试想如果用普通的办法,即先排查哪个节点down掉了,找到down掉的节点后采取调试工具gdb调试该节点,进而排查宕机的原因。这中排查方法对于人力物力都是无法接受的。 那么由此记录日志就变得至关重要,

    2024年02月14日
    浏览(42)
  • RPC教程 2.支持并发与异步的客户端

    对  net/rpc  而言,一个函数需要能够被远程调用,它必须满足一定的条件,否则其会被忽略。 这些条件是: 方法的类型是可输出的 (the method’s type is exported) 方法本身也是可输出的 (the method is exported) 方法必须由两个参数,必须是输出类型或者是内建类型 (the method has tw

    2024年01月24日
    浏览(56)
  • 微服务通信[HTTP|RPC同步通信、MQ异步通信]

    A服务调用B服务,B服务调C服务,C服务调D服务,即微服务之间的通信(也可以叫微服务之间的调用) 一种轻量级的通信协议,常用于在不同的微服务之间进行通信,也是最简单的通信方式 使用REST ful为开发规范,将服务对外暴露的HTTP调用方式为REST API(如GET、POST、PUT、DELETE等),已经成

    2024年02月09日
    浏览(37)
  • [RDMA] 高性能异步的消息传递和RPC :Accelio

    1. Introduce Accelio是一个高性能异步的可靠消息传递和RPC库,能优化硬件加速。 RDMA和TCP / IP传输被实现,并且其他的传输也能被实现,如共享存储器可以利用这个高效和方便的API的优点。Accelio 是 Mellanox 公司的RDMA中间件,用于高性能异步的可靠消息传递和RPC库。 Accelio提供了一

    2024年02月12日
    浏览(41)
  • 深度思考rpc框架面经之五:rpc限流:rpc事务:tps测试

    是的,我可以为你提供关于RPC注册中心及其监控的相关信息。RPC注册中心是用于管理微服务之间调用关系的中心化服务,它可以帮助微服务发现和调用其他服务。而监控是确保微服务健康、稳定运行的重要手段,可以实时检测和报警系统中的异常情况。 对于RPC注册中心的监控

    2024年02月07日
    浏览(47)
  • 深度思考rpc框架面经之五:rpc熔断限流、rpc复用连接机制

    推荐文章:RPC实现原理之核心技术-限流熔断 限流是一种常见的系统保护手段。在分布式系统和微服务架构中, 一个接口的过度使用可能会导致资源的过载,例如CPU、内存、带宽等都可能成为瓶颈。为了避免系统崩溃,确保系统的可用性,并为所有用户提供公平和合理的服务

    2024年02月11日
    浏览(41)
  • RPC和HTTP协议

            RPC 全称(Remote Procedure Call),它是一种针对跨进程或者跨网络节点的应用之间的远程过程调用协议。         它的核心目标是,让开发人员在进行远程方法调用的时候,就像调用本地方法一样,不需要额外为了完成这个交互做过的编码。         为了达到

    2024年02月11日
    浏览(38)
  • Rust微服务杀手级应用终于来了!一个最像RPC框架的Rust-RPC框架

    https://github.com/kwsc98/krpc-rust 刚刚学习Rust语言或者没怎么了解Rust-RPC框架的同学,可能以为又是一个标题党了,但实际上了解过这部分的同学都知道,目前来说主流的Rust-RPC框架和实际定义的RPC框架还是有着很大的差别。我们先看一下隔壁Java是如何实现的,就拿本项目Java版本

    2024年01月23日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包