protobuf概览

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

protobuf

protobuf是由谷歌推出的二进制序列化与反序列化库对象。也是著名GRPC的底层依赖,它独立于平台及语言的序列化与反序列化标准库。

相关网址

  • protobuf IDL描述
  • protobuf 开源库
  • grpc-知乎
  • grpc官方示例

安装protobuf可以使用vcpkg进行简易安装依赖,protoc.exe则会安装在installed\x64-windows\tools\protobuf目录下,protbuf是谷歌推出的grpc的基础序列化,包括QtGrpc也是依赖的此模块作为基础。

.proto是接口描述文件,它抽象在平台之外,提供了许多语言的支持这个支持是由谷歌推出。 所以你可以说protobuf是跨平台跨语言的一直序列化格式,至于支持到什么程序就要看谷歌的支持了。相对于json、xml之类的文本序列化格式,具有更高的效率,具有差不多程度的跨语言以及平台特性。

安装指令

vcpkg install protobuf protobuf:x64-windows                     // 安装protobuf
vcpkg install protobuf[zlib] protobuf[zlib]:x64-windows         // 安装protobuf zlib压缩
vcpkg install grpc:x64-windows                                  // 安装grpc

protoc指令

// protobuf
// proto IDL生成cpp代码文件 --cpp_out必须是已经存在的目录 proto dir则是存放.proto文件的目录 *.proto IDL接口文件
protoc --proto_path=[input: proto dir] --cpp_out=[output: cxx dir] [*.proto]
protoc --proto_path=./. --cpp_out=./ user.proto

// grpc
// proto IDL生成cpp grpc代码文件 --grpc_out是grpc文件目录 --cpp_out cxx代码文件目录 --plugin 插件模式及插件软件 *.proto IDL接口文件
protoc --grpc_out=[output: grpc dir] --cpp_out=[output: cxx dir] --plugin=protoc-gen-grpc=[input: pligin] [*.proto]
.\protoc.exe --grpc_out=./ --cpp_out=./ --plugin=protoc-gen-grpc=grpc_cpp_plugin.exe .\serve.proto

user.proto 文件示例

syntax = "proto2";

package jie;

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

vcpkg安装protobuf项目使用的配置示例

cmake_minimum_required(VERSION 3.5)

set(CMAKE_TOOLCHAIN_FILE "D:/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")

project(protobuf_item LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(D:/vcpkg/scripts/buildsystems/vcpkg.cmake)

find_package(protobuf CONFIG REQUIRED)

# protbuf提供的根据.proto文件生成对应的头文件与cc文件
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS user.proto)
#protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT user.proto)
#protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS user.proto)

#message(==============================)
#message(${PROTO_SRCS})
#message(${PROTO_HDRS})
#message(==============================)

add_executable(protobuf_item main.cpp ${PROTO_SRCS} ${PROTO_HDRS})

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR})

target_link_libraries(${PROJECT_NAME} PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)

grpc

RPC,全称Remote Procedure Call,中文译为远程过程调用。通俗地讲,使用RPC进行通信,调用远程函数就像调用本地函数一样,RPC底层会做好数据的序列化与传输,从而能使我们更轻松地创建分布式应用和服务。

一般来讲,实现一个gRPC服务端和客户端,主要分为这几步:

  1. 安装 protobuf 依赖
  2. 编写 proto 文件(IDL)
  3. 编译 proto 文件(生成stub文件)
  4. 编写server端,实现我们的接口
  5. 编写client端,测试我们的接口

ps:大多数时候我们可以手动使用protoc + grpc_cpp_plugin来生成 .proto对应的代码来给程序使用,这样能简化grpc配置上带来的复杂操作。当然如果你想通过cmake配置文件生成对应的.proto 代码文件也无可厚非,如果你有此想法需要研究cmake中的add_custom_command()指令。

一个serve.proto IDL描述文件示例

// Copyright 2015 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package jie;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}

  rpc SayHelloStreamReply (HelloRequest) returns (stream HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

grpc服务端与客户端cmake配置

cmake_minimum_required(VERSION 3.5)

# 设置工具链
set(CMAKE_TOOLCHAIN_FILE "D:/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file")

project(grpc_item LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 引入vcpkg.cmake子模块
include(D:/vcpkg/scripts/buildsystems/vcpkg.cmake)

# 使用gRPC库
find_package(gRPC CONFIG REQUIRED)

#protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS user.proto)

# 查找到执行的 proto命令行以及grpc_cpp_plugin 插件
find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
find_program(_PROTOBUF_PROTOC protoc)

# 设置文件路径绝对路径
get_filename_component(hw_proto "serve.proto" ABSOLUTE)
# 获取文件所在的目录
get_filename_component(hw_proto_path "${hw_proto}" PATH)

# 设置输出的文件变量
set(hw_proto_srcs "${CMAKE_SOURCE_DIR}/serve.pb.cc")
set(hw_proto_hdrs "${CMAKE_SOURCE_DIR}/serve.pb.h")
set(hw_grpc_srcs "${CMAKE_SOURCE_DIR}/serve.grpc.pb.cc")
set(hw_grpc_hdrs "${CMAKE_SOURCE_DIR}/serve.grpc.pb.h")

# 执行命令,OUTPUT参数为执行命令后最终输出的文件,需要完全匹配 DEPENDS依赖文件依然如此,这规则令人感到困惑。但你可以理解为COMMADN最终的输出文件为 OUTPUT参数,COMMAND输入文件文则是DEPENDS,但组织命令参数时仍需要这些参数。
add_custom_command(
      OUTPUT  "${hw_grpc_srcs}" "${hw_grpc_hdrs}" "${hw_proto_srcs}" "${hw_proto_hdrs}"
      COMMAND ${_PROTOBUF_PROTOC}
      ARGS --grpc_out "${CMAKE_SOURCE_DIR}"
        --cpp_out "${CMAKE_SOURCE_DIR}"
        -I "${hw_proto_path}"
        --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
        "${hw_proto}"
      DEPENDS "${hw_proto}")

add_executable(grpc_item main.cpp
    ${PROTO_SRCS} ${PROTO_HDRS}
    ${hw_grpc_srcs} ${hw_grpc_hdrs}
    ${hw_proto_srcs} ${hw_proto_hdrs}
)

#target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR})

target_link_libraries(${PROJECT_NAME} PRIVATE gRPC::gpr gRPC::grpc gRPC::grpc++ gRPC::grpc++_alts)

grpc服务器代码


#include <iostream>
#include <grpcpp/ext/proto_server_reflection_plugin.h>
#include <grpcpp/grpcpp.h>
#include <grpcpp/server.h>
#include <grpcpp/health_check_service_interface.h>
#include "serve.grpc.pb.h"

class JieRpc : public jie::Greeter::Service {
public:
    ::grpc::Status SayHello(::grpc::ServerContext* context,
                            const ::jie::HelloRequest* request,
                            ::jie::HelloReply* response) override {

        std::cout << request->name() << std::endl;
        response->set_message("hello Jie Rpc");
        return ::grpc::Status::OK;
    }
    ::grpc::Status SayHelloStreamReply(::grpc::ServerContext* context,
                                       const ::jie::HelloRequest* request,
                                       ::grpc::ServerWriter< ::jie::HelloReply>* writer) override {
        return ::grpc::Status::OK;
    }
};

int main()
{
    JieRpc rpc;
    grpc::ServerBuilder builder;
    builder.AddListeningPort("localhost:9000", grpc::InsecureServerCredentials());
    builder.RegisterService(&rpc);
    std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
    server->Wait();
}

grpc客户端代码文章来源地址https://www.toymoban.com/news/detail-679661.html

#include <iostream>
#include <grpcpp/grpcpp.h>
#include "serve.grpc.pb.h"

int main()
{
    std::unique_ptr<jie::Greeter::Stub> stu(jie::Greeter::NewStub(
        grpc::CreateChannel("localhost:9000", grpc::InsecureChannelCredentials())));

    jie::HelloRequest request;
    jie::HelloReply reply;
    request.set_name("hello jie");

    grpc::ClientContext context;

    grpc::Status status = stu->SayHello(&context, request, &reply);
    if (status.ok())
        std::cout << reply.message() << std::endl;
}

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

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

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

相关文章

  • 常用测试工具汇总

    目录 1.Web页面检查器 2.客户端-代理抓包 3.自动化测试工具 3.1接口自动化测试 3.2webUI自动化测试 3.3客户端UI自动化测试 4.手机模拟器测试工具 5.阿里云测试工具 F12查看html页面,查看页面大小和加载时间 Charles:PC版/ios客户端 Fiddler:PC版/android客户端/ios客户端 httpcanary:androi

    2024年02月15日
    浏览(40)
  • git常用命令汇总

    命令 作用 注意 git -v 查看 git 版本 git init 初始化 git 仓库 git add 文件标识 暂存某个文件 文件标识以终端为起始的相对路径 git add . 暂存所有文件 git commit -m \\\'说明注释\\\' 提交产生版本记录 每次提交,把暂存区内容快照一份 git status 查看文件状态 - 详细信息 git status -s 查看文件

    2024年01月24日
    浏览(36)
  • 常用芯片型号功能汇总

    目录 PD诱骗: 电压比较器,电量检测IC: 运放: 功放: 线性稳压器(LDO): MCU: 电池管理: CH224K——TYPE-C受电协议芯片 LM339——四电压比较器,工作电压12v CN1185——低功耗四通道电压检测芯片,工作电压2.7v-6v CN61C——低功耗高精度电压检测集成电路,单通道CMOS,工作电压

    2024年02月14日
    浏览(31)
  • 产品经理常用工具汇总

    英文名称 中文名称 描述 Axure 原型 原型图,流程图,框架图,原型图; Axhub 团队原型共享 Axure原型团队共享,链接转发; iconfont 阿里矢量图标 图标下载,协助原型和方案; visio 流程图  业务流程图,泳道图编写; OBS 录屏 录屏工具 EV录屏 EV录屏 录屏工具 腾讯文档 腾讯文

    2024年04月24日
    浏览(37)
  • 网络常用协议端口汇总

    目录 一、概括 二、端口划分     Ⅰ、什么是临时端口? Ⅱ、什么是服务器端口? 三、常见的端口 四、代理服务器默认端口         计算机网络端口是指在网络通信中用于标识不同应用程序或服务的数字,它是网络协议中的一部分。每个应用程序或服务都需要使用一个唯

    2024年02月05日
    浏览(33)
  • Numpy常用函数汇总

    本文使用的是Jupyter notebook,因此仅在开头引入了Numpy,后续没有引入,如果在其他编译器中运行的话请确保引入了numpy 默认情况下创建的类型为float64类型 如果希望在创建Numpy矩阵时候强制规定一种类型,那么我们可以使用以下代码 创建的是三行四列的矩阵并且其数据类型是

    2023年04月20日
    浏览(62)
  • java中常用注解汇总

    1 Maven依赖     2 值校验 2.1 @Null注解 被注解的元素必须为null 2.2 @NotNull注解 被注解的元素必须不为null 2.3 @NotBlank注解 验证注解的元素值不为空(不为null、去除首位空格后长度为0) ,并且类型为String。 2.4 @NotEmpty注解 验证注解的元素值不为null且不为空(字符串长度不为0、集

    2024年02月14日
    浏览(44)
  • adb常用命令汇总

    Android Debug Bridge (adb) 是一个多功能命令行工具,它允许你与连接的Android设备或在电脑上的Android模拟器进行通信。下面列出了一些常用的adb命令: 启动adb服务 : 停止adb服务 : 查看已连接的设备和模拟器列表 : 安装应用 : 卸载应用 : 推送文件到设备 : 从设备拉取文件

    2024年04月17日
    浏览(42)
  • 数据仓库常用名词汇总

    数仓为了支撑企业或组织的决策和业务分析,而从各个业务系统中抽取数据集成到一个数据存储中心,这样的数据存储中心称为数据仓库(Data Warehouse),而在搭建数据仓库时,通常会采用一些命名规范,常见的有:ods、dim和dws。 1. ODS:ODS全称是Operational Data Store,即运营数据

    2024年02月11日
    浏览(12)
  • PyTorch常用代码段汇总

    本文是PyTorch常用代码段合集,涵盖基本配置、张量处理、模型定义与操作、数据处理、模型训练与测试等5个方面,还给出了多个值得注意的Tips,内容非常全面。 PyTorch最好的资料是官方文档。本文是PyTorch常用代码段,在参考资料[1](张皓:PyTorch Cookbook)的基础上做了一些修补

    2024年02月16日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包