Qt+Ubuntu 配置 gPRC

前情提要

由于最近pni项目需要使用 gPRC 发送数据,学习了下在 Qt+Ubuntu 环境下如何配置和使用gPRC。

配置环境

开发环境:Ubuntu 18.04 、Qt

gRPC

  1. 从github clone grpc的源码

    1
    $ git clone https://github.com/grpc/grpc.git
  2. 拉取子模块依赖

    1
    2
    $ cd grpc
    $ git submodule update --init
  3. 参考https://github.com/grpc/grpc/blob/master/BUILDING.md,使用cmake编译

    1
    2
    3
    4
    5
    $ mkdir -p cmake/build
    $ cd cmake/build
    $ cmake ../..
    $ make -j8
    $ sudo make install

    image-20221206112325997

protobuf

下载并编译 protobuf

git 地址:https://github.com/protocolbuffers/protobuf/releases

image-20221206112555538

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
解压 protobuf-3.21.10.tar.gz
进入目录:
$ cd protobuf-3.21.10
配置安装目录:
$ ./config --prefix=/usr/local/protobuf
编译安装:
$ make
$ make install
建立链接到bin下:
$ ln -sf /usr/local/protobuf/bin/protoc /usr/bin/protoc
查看版本号:
$ protoc --version

$ mkdir -p cmake/build
$ cd cmake/build
$ cmake ../..
$ make -j8
$ sudo make install

image-20221206112814101

image-20221206113836715

添加系统环境

build目录下有生成 grpc_cpp_plugin ,就将其拷贝到系统环境下

image-20221206210449250

1
$ cp -r grpc_cpp_plugin /usr/local/bin/

配置 Emacs / Vim

protocolbuf 提供了 vim 和 emacs 的扩展。下载非win32版本的 protobuf 的压缩包里,解压后有个 editors 目录,里面就是两个扩展文件:proto.vim是提供给vim爱好者的,而protobuf-mode.el 就是提供给emacs控的

将 protobuf-mode.el 文件添加到 Emacs 的 .emacs.d/lisp 路径下,在配置文件 init.el 添加以下代码

1
2
3
4
5
(add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory)) ; 设定源码加载路径
;; (require 'init-benchmarking) ;; Measure startup time

(require 'protobuf-mode)
(setq auto-mode-alist (cons '(".proto$" . protobuf-mode) auto-mode-alist))

效果如下:

image-20221206152332666

测试 gRPC

构建样例

  1. 进入样例文件夹

    1
    $ cd examples/cpp/helloworld
  2. 使用 cmake 构建样例

    1
    2
    3
    4
    $ mkdir -p cmake/build
    $ pushd cmake/build
    $ cmake ../..
    $ make -j8

    image-20221207105202916

测试运行

  1. 在终端运行服务端

    1
    $ ./greeter_server
  2. 在另一个终端运行客户端,可以看见客户端的输出

    1
    2
    $ ./greeter_client
    Greeter received: Hello world

image-20221207105833046

编写 gRPC

Protocol Buffers

Protocol Buffers(Protocol Buffers | Google Developers),它可以用来定义消息和服务。然后,我们只需要实现服务即可,剩余的 gRPC 代码将会自动生成。

开发模式

gPRC使用的是合约优先的API开发模式,它默认使用 Protocol buffers (protobuf) 作为接口设计语言(IDL),这个 .proto 文件包括两部分:

  • gRPC服务的定义
  • 服务端和客户端之间传递的消息

定义协议 *.proto

将协议生成c++编辑器能够编译的c++代码

1
2
$ protoc --proto_path=. --cpp_out=. ./student.proto
$ protoc --proto_path=./ --grpc_out=./ --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin student.proto