热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gRPC系列(一)安装和入门

gRPC系列(一)安装和入门-gRPC系列(一)安装和入门gRPC是由谷歌公司开发的一款rpc框架,支持多种语言,包括C++、Java、Golang、python等等。这个系列将会
gRPC系列(一) 安装和入门

gRPC是由谷歌公司开发的一款rpc框架,支持多种语言,包括C++、Java、Golang、python等等。这个系列将会主要记录gRPC的学习过程,本文主要包括安装和简单的使用,语言为C++。

安装

我的操作系统是ubuntu20.04。

  1. 安装依赖

    sudo apt-get install pkg-config
    sudo apt-get install autoconf automake libtool make g++ unzip
    sudo apt-get install libgfalgs-dev libgtest-dev
    sudo apt-get install clang libc++-dev
  2. 下载gRPC

    git clone https://github.com/grpc/grpc.git
    cd grpc
    git submodule update --init // 更新第三方源码
  3. 安装protobuf源码

    cd third_party/protobuf/
    git submodule update --init --recursive
    ./autogen.sh // 生成配置脚本
    ./configure  // 生成Makefile文件,为下一步的编译做准备,可以加上安装路径:--prefix=path
    make
    make check
    sudo make install
    sudo ldconfig    // 更新共享库缓存
    which protoc    // 查看软件是否安装成功
    protoc --version // 检查是否安装成功
  4. 安装gRPC

    cd ../..
    make
    sudo make install

简单使用

使用grpc包括几个步骤:定义服务、生成代码、编写服务端代码、编写客户端代码、运行。

定义服务

服务定义文件是proto文件,中文文档可以参考Protobuf语法指南
这里先写一个简单的proto文件

syntax="proto3";
// 语法类型
package Simple;
// 这是生成代码使用的namespace,所有生成的代码都会在这个namespace中。

// 指定服务的名称,生成的代码里面的二级namespace
service Server {
    rpc Echo(EchoRequest) returns (EchoReponse){}
}

message EchoRequest {
    string msg = 1;    // 
}

message EchoResponse {
    string msg = 1;
}

上面的接口中,必须有参数和返回值,如果不需要参数或者返回值,也必须定义一个空的(没有成员)message,否则无法通过编译。

生成代码

安装好grpc之后,可以使用grpc的相关的命令行程序,来使用proto文件生成C++代码,这里需要分两步走,一个是生成protobuf序列化和反序列化代码,二是生成基本服务框架代码。

> protoc -I ./ --cpp_out=. simple.proto
> protoc -I ./ --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` simple.proto
> ls
simple.grpc.pb.cc  simple.grpc.pb.h  simple.pb.cc  simple.pb.h  simple.proto

编写服务端代码

服务端我们需要继承生成文件simple.grpc.pb.h中的Simple::Server::Service,实现上述定义的rpc接口,我们可以看一下simple.grpc.pb.h文件中的内容。

简单的服务端代码如下:

#include 

#include 
#include 

#include "../protos/simple/simple.grpc.pb.h"
// 添加自己的路径

using grpc::Status;
using grpc::ServerContext;


class SimpleServiceImpl final : public Simple::Server::Service{
    public:
        Status Echo(ServerContext* context,
                const Simple::EchoRequest* req,
                Simple::EchoResponse* resp)override
        {
            resp->set_msg(req->msg());
            return Status::OK;
        }
};

int main()
{
    // 服务器构建器
    grpc::ServerBuilder builder;
    // 添加监听的地址和端口,选择不认证
    builder.AddListeningPort("localhost:12345",grpc::InsecureServerCredentials());
    // 注册服务
    ServiceImpl service;
    builder.RegisterService(&service);
    // 构建服务器
    std::unique_ptr server(builder.BuildAndStart());
    std::cout <<"Server running" <Wait();
    return 0;
}

然后运行我们的程序(不要忘记链接grpc库和源文件simple.grpc.pb.cc、simple.pb.cc)。
我是用CMake构建编译链的,在项目目录的CMakeLists.txt中查找库并添加到路径中。

set(protobuf_MODULE_COMPATIBLE True)
find_package(Protobuf REQUIRED)
set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)

# set grpc
find_package( gRPC REQUIRED)
set(_GRPC_GRPCPP_UNSECURE gRPC::grpc++_unsecure)

include_directories(
    ${_PROTOBUF_INCLUDE_DIR}
    ${PROJECT_SOURCE_DIR}/grpc/protos
)

在simple.cpp所在路径添加依赖

add_executable(SimpleClient simple_client.cpp)

target_link_libraries(SimpleClient
    ${_GRPC_GRPCPP_UNSECURE}
    ${_PROTOBUF_LIBPROTOBUF}
    simple.grpc.pb.cc
    simple.pb.cc
    )

add_executable(SimpleServer simple_server.cpp)

target_link_libraries(SimpleServer
    ${_GRPC_GRPCPP_UNSECURE}
    ${_PROTOBUF_LIBPROTOBUF}
    simple.grpc.pb.cc
    simple.pb.cc
    )

install(TARGETS
    SimpleServer
    SimpleClient
    DESTINATION bin/
    )

然后编译过程如下:

// 进入项目根目录下,
> mkdir -p build
> cd build
> cmake ../ CMAKE_INSTALL_PREFIX="your_install_path"
> cd your_install_path/bin
> ./SimpleServer
> Server running

编写客户端代码

#include 
#include 

#include 
#include 
#include 
#include 
#include 

#include "../protos/simple/simple.grpc.pb.h"

using grpc::Status;
using grpc::Channel;
using grpc::ClientContext;

int main()
{
    // 创建一个channel,维护的是和服务器的连接
    std::shared_ptr chan = grpc::CreateChannel("localhost:12345",grpc::InsecureChannelCredentials());
    // 创建一个stub
    std::unique_ptr stub = Simple::Server::NewStub(chan);

    Simple::EchoRequest req;
    req.set_msg("Hello World");
    Simple::EchoResponse resp;
    ClientContext context;
    Status st = stub->Echo(&context,req,&resp);
    if(st.ok()){
        std::cout <

编译和上面服务器编译方法一致:

> SimpleClient
Hello World
> 

推荐阅读
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了解决github无法访问和克隆项目到本地的问题。作者建议通过修改配置文件中的用户名和密码来解决访问失败的问题,并提供了详细步骤。同时,还提醒读者注意输入的用户名和密码是否正确。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • OpenCV4.5.0+contrib编译流程及解决错误方法
    本文介绍了OpenCV4.5.0+contrib的编译流程,并提供了解决常见错误的方法,包括下载失败和路径修改等。同时提供了相关参考链接。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
author-avatar
you_only89
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有