![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
基于muduo和protobuf的RPC框架
文章平均质量分 61
muduo+protobuf实现RPC框架
TABE_
这个作者很懒,什么都没留下…
展开
-
logger日志系统
logger日志系统设计logger日志系统实现logger日志系统lockqueue.hlogger.hlogger.cc设计logger日志系统图中画圆圈的是我们实现的mprpc框架,这个框架是给别人使用的,把本地的服务发布成远程的RPC服务,框架里最重要的两个成员就是RpcProvider和RpcChannel,他们在运行的过程中会有很多正常的输出信息和错误的信息,我们不可能都cout它们到屏幕上,因为运行时间长了,屏幕上输出的信息特别多,如果万一有什么问题,我们也不好定位,真正用起来的话不方便原创 2021-10-05 19:40:59 · 646 阅读 · 0 评论 -
MprpcController类(负责存储控制信息,便于获取当前RPC调用的状态)
MprpcController类mprpccontroller.hmprpccontroller.ccMprpcController继承自RpcController(protobuf提供的纯虚函数),RpcController存储了一些控制信息,让我们清楚地知道当前RPC调用的状态。mprpccontroller.h#pragma once#include <google/protobuf/service.h>#include <string>//MprpcContr原创 2021-10-05 19:26:40 · 144 阅读 · 0 评论 -
MprpcChannel类(负责客户端与服务端之间交互)
MprpcChannel 类mprpcchannel.hmprpcchannel.ccMprpcChannel继承自RpcChannel,RpcChannel本质上是用于客户端与服务端之间交互的一条通道,其负责实现客户端向服务端请求时的一些数据和网络处理。一般情况下这个类中都会至少包括序列化和发包到服务端这两个操作。mprpcchannel.h#pragma once#include <google/protobuf/descriptor.h>#include <google/原创 2021-10-05 19:17:40 · 320 阅读 · 0 评论 -
MprpcConfig类(负责解析配置文件)
MprpcConfig类mprpcconfig.hmprpcconfig.ccMprpcConfig类是在mprpc框架中负责解析配置文件的类。mprpcconfig.h#pragma once#include <string>#include <unordered_map>//mprpc中负责解析配置文件的类class MprpcConfig{public: //负责解析加载配置文件 void LoadConfigFile(const char原创 2021-10-05 19:04:07 · 165 阅读 · 0 评论 -
RpcProvider类(负责发布RPC Service)
RpcProvider类mprpcprovider.hmprpcprovider.ccRpcProvider类是框架提供的专门发布rpc服务的网络对象类。mprpcprovider.h#pragma once#include "google/protobuf/service.h"#include <functional>#include <google/protobuf/descriptor.h>#include <muduo/net/EventLoop.h&g原创 2021-10-05 18:53:26 · 616 阅读 · 0 评论 -
MprpcApplication类(负责框架的一些基本操作,如初始化等)
这里写目录标题mprpcapplication.hmprpcapplication.ccMprpcApplication类是mprpc框架的基础类,负责框架的一些初始化操作,使用单例模式设计mprpcapplication.h#pragma once#include "mprpcchannel.h"#include "mprpcconfig.h"#include "mprpccontroller.h"//mprpc框架的基础类,负责框架的一些初始化操作,使用单例模式设计class Mpr原创 2021-10-04 22:42:38 · 244 阅读 · 0 评论 -
RPC Service提供者callee文件夹/RPC Service调用者caller文件夹/RPC Service生成方proto文件
这里写目录标题proto文件callee文件夹caller文件夹example文件夹作为我们框架项目的使用实例,在example文件夹下创建callee和caller两个文件夹,还包含用于生成rpc service的proto文件。proto文件在proto文件中我们使用了message和service两个关键词组,在编译proto文件时会将他们对应的内容都生成为相应的类,例如:UserService原来是一个本地服务,提供了进程内的本地方法:Login(),在proto文件中需要先在service类原创 2021-10-04 21:59:02 · 616 阅读 · 0 评论 -
基于Protobuf实现一个简单的RPC框架
文章目录1、Proto定义RPC服务1.1 编写proto文件1.2 使用protoc工具生成RPC对象接口模型2、编写RPC服务逻辑3、编写RPC服务框架3.1 RpcServer3.2 构造数据包,方便识别service和method信息3.3 RpcServer启动主程序4、编写RPC客户端代码5、编写客户端使用样例6、RPC服务框架中类图7、RPC调用链路使用Protobuf实现RPC框架大致可以分为以下几步:1、编写proto文件定义服务,并使用Protoc工具生成RPC对象接口模型。2、编原创 2021-10-05 21:55:03 · 1977 阅读 · 0 评论 -
protobuf service详解
这里写目录标题定义serviceUserServiceRpc类 和 UserServiceRpc_stub类UserServiceRpc类成员分析定义service.proto文件的代码如下:syntax = "proto3"; // 声明了protobuf的版本package fixbug; // 声明了代码所在的包(对于C++来说是namespace)//定义下面的选项,表示生成service服务类和rpc方法描述,默认不生成option cc_generic_services = tr原创 2021-09-13 23:27:59 · 7157 阅读 · 0 评论 -
protobuf3的简单使用
这里写目录标题第1章 定义.proto 文件1.1 定义package1.2 定义message1.3 定义字段第2章 编译 .proto 文件第3章 使用message3.1 类成员变量的访问3.2 标准message方法3.3 编码和解码函数第4章 使用示例4.1 简单message生成的C++代码4.2 嵌套message生成的C++代码4.3 repeated嵌套message生成的C++代码第1章 定义.proto 文件首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据原创 2021-09-09 23:34:45 · 3419 阅读 · 0 评论 -
protobuf3基本语法
这里写目录标题protobuf3语法模板定义一个消息类型修饰符数据类型标量数据类型枚举数据类型map数据类型的默认值唯一标识符预留标识符(Reserved)在一个.proto文件中使用多个message直接定义多个message导入message使用protobuf2的message嵌套messageAny字段oneof字段oneof的使用oneof的特性定义服务(RPC)包(Packages)选项(Options)protobuf3语法模板syntax = "proto3";//文件第一行指定使用的p原创 2021-09-06 22:05:50 · 2604 阅读 · 0 评论 -
protubuf3的优缺点
这里写目录标题protobuf3的优点protobuf3的缺点protobuf3的优点(1)性能好/效率高时间开销: XML格式化(序列化)的开销还好;但是XML解析(反序列化)的开销就不敢恭维了。 但是protobuf在这个方面就进行了优化。可以使序列化和反序列化的时间开销都减短。空间开销:也减少了很多(2)有代码生成机制比如你你写个一下类似结构体的内容 message testA { required int32 m_testA = 1; } protobuf将对原创 2022-03-02 19:00:05 · 387 阅读 · 0 评论 -
protobuf3编解码详解
这里写目录标题Base 128 Varints编码方式正数的编码字符串的编码嵌套消息的编码负数的编码——ZigZagPacked Repeated FieldsBase 128 VarintsVarints是一种使用一个或多个字节表示整型数据的方法。其中数值本身越小,其所占用的字节数越少。在Varint中,除了最后一个字节之外,其余每个字节中都包含一个MSB(最高位),字节中的其余七位将用于存储数据本身。在解码的时候,如果读到的字节的 MSB 是 1 话,则表示还有后序字节,一直读到 MSB 为 0原创 2021-09-07 22:02:31 · 1868 阅读 · 1 评论 -
为什么数据需要序列化
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,发送方需把这个对象转换为字节序列,才能在网络上传送;接收方则需把字节序列再恢复为对象。把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。因此,序列化的目的就是为了跨进程传递格式化数据。...原创 2022-07-29 15:55:22 · 465 阅读 · 0 评论 -
mprpc框架整体结构
这里写目录标题mprpc框架callercalleemprpc框架mpcpc框架的整体结构如下所示:caller发起调用时:user发起远程调用(local call),user-stub对要调用的方法所需要的参数进行序列化(pack argument),数据序列化使用protobuf。RPC-runtime进行传输(transmit),状态调整至wait,然后等待运行结果的返回。中间的网络业务call packet由muduo库进行。获取到被调用方的返回结果时:RPC-runtime获取原创 2021-10-04 21:10:08 · 513 阅读 · 0 评论 -
IPC和RPC
这个概念泛指进程之间任何形式的通信行为,是个可以拿来到处套的术语。它不仅包括各种形式的消息传递,还可以指共享资源,以及同步对象[mutex 或者其他类似的东西,即确保安全的并发访问共享资源(也就是防止两个或两个以上的对象同事对同一个数据成员进行修改,从而导致数据被破坏,或者竞争条件下同事读/写数据而导致错误的情况发生)]的东西。原创 2022-09-16 11:41:20 · 626 阅读 · 0 评论 -
RPC通信原理
一次完整的RPC调用流程(同步调用,异步另说)如下:服务消费方(client/caller)调用以本地调用方式调用服务;client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;client stub找到服务地址,并将消息发送到服务端;server stub收到消息后进行解码;server stub根据解码结果调用本地的服务;服务提供方(server/callee)执行本地服务并将结果返回给server stub;server stub将返回结果打包成消息并发送至.原创 2021-10-04 20:48:52 · 274 阅读 · 0 评论