基于muduo的rpc项目开发之protobuf模块

1.何为 ProtoBuf

我们先来看看官方文档给出的定义和描述:

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

简单来讲, ProtoBuf 是结构数据序列化方法,可简单类比于 XML或者json,其具有以下特点:

  • 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
  • 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
  • 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序

序列化:将结构数据对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。
更为详尽的介绍可参阅 维基百科
类比于 XML:这里主要指在数据通信和数据存储应用场景中序列化方面的类比,但个人认为 XML 作为一种扩展标记语言和 ProtoBuf 还是有着本质区别的。

2.protobuf安装使用案列

可以看这个文章,进行安装使用

ubuntu下protobuf安装使用(详解)_@seven@的博客-CSDN博客

3.通过protobuf service 使用rpc

protobuf仅仅是提供了一套序列化和反序列化结构数据的机制,是解析协议的一个规则,有回调函数的机制,本身不具有RPC功能,但是可以基于其实现一套RPC框架,主要是利用协议解析以及回调的机制进行的,实现了rpc服务。

3.1在protobuf里面怎么定义描述rpc方法的类型 - 利用service

// 在protobuf里面怎么定义描述rpc方法的类型 - 利用service
service UserServiceRpc
{
    rpc Login(LoginRequest) returns(LoginResponse);
    rpc GetFriendLists(GetFriendListsRequest) returns(GetFriendListsResponse);
}

这样定义了两个rpc方法,其中rpc关键字是定义一个rpc方法的意思,protobuf会帮我们生成两个类,一个是UserServiceRpc类,类名和service里面定义的一样,另一个类UserServiceRpc_Stub;其中UserServiceRpc类是给服务端提供的,或者说称为方法提供端,UserServiceRpc_Stub类是给客户端提供的,或者说请求方法端。这两个类是纯虚类,需要我们重写,实现相应的逻辑功能。

但是,想要protobuf帮我们生成service类,必须得加一个option选项,不然protobuf默认是不生成的,这就是service和message的区别所在了。

// 定义下面的选项,表示生成service服务类和rpc方法描述,默认不生成
option cc_generic_services = true;

 3.2UserServiceRpc类和UserServiceRpc_Stub类介绍

类成员以及方法如图所示

 UserServiceRpc类和UserServiceRpc_Stub类都是抽象类需要我们重写,重写类里面就可以加业务代码了。UserServiceRpc_Stub类的构造函数需要一个RpcChannel* channel对象,这个对象元素这个纯虚类,需要我们去重写,UserServiceRpc_Stub类其实就是一个代理类,实质上还是RpcChannel的方法。

 4.proto文件

syntax = "proto3"; // 声明了protobuf的版本

package fixbug; // 声明了代码所在的包(对于C++来说是namespace)

// 定义下面的选项,表示生成service服务类和rpc方法描述,默认不生成
option cc_generic_services = true;

message ResultCode
{
    int32 errcode = 1;
    bytes errmsg = 2;
}

// 数据   列表   映射表
// 定义登录请求消息类型  name   pwd
message LoginRequest
{
    bytes name = 1;
    bytes pwd = 2;
}

// 定义登录响应消息类型
message LoginResponse
{
    ResultCode result = 1;
    bool success = 2;
}

message GetFriendListsRequest
{
    uint32 userid = 1;
}

message User
{
    bytes name = 1;
    uint32 age = 2;
    enum Sex
    {
        MAN = 0;
        WOMAN = 1;
    }
    Sex sex = 3;
}

message GetFriendListsResponse
{
    ResultCode result = 1;
    repeated User friend_list = 2;  // 定义了一个列表类型
}

// 在protobuf里面怎么定义描述rpc方法的类型 - 利用service
service UserServiceRpc
{
    rpc Login(LoginRequest) returns(LoginResponse);
    rpc GetFriendLists(GetFriendListsRequest) returns(GetFriendListsResponse);
}

 然后编译生成相应的源文件,具体怎么生成看下面这个文章

ubuntu下protobuf安装使用(详解)_@seven@的博客-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值