gRPC 的使用

介绍一种语言中立的远程过程调用工具 gRPC

Posted by Jerry Chen on July 6, 2021

介绍 gRPC

gRPC 是由 google 开发的一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

  • 定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型);
  • 在服务端实现这个服务接口,运行一个 gRPC 服务器来处理客户端调用;
  • 在客户端调用服务端的方法,就像调用本地函数一样。
官网 下载 中文文档

安装 gRPC

  1. 安装依赖项

    • cmake 3.13 及以后的版本

    • 其他依赖:

      1
      
      sudo apt install -y build-essential autoconf libtool pkg-config
      
  2. github 下载,并下载第三方模块

    • 有 github 网络条件的情况:

      1
      
      git clone --recurse-submodules -b RELEASE_TAG_HERE https://github.com/grpc/grpc
      
    • 访问 github 不太顺畅的情况:

      1
      2
      3
      4
      
      git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc.git
      cd grpc
      # 这里还有一步:替换所有的 git submodule 地址为国内加速地址
      git submodule update --init
      
  3. 编译、安装 grpc 以及依赖到 /usr/local 目录

    安装完成后,会在 /usr/local/bin 目录生成 grpc_cpp_plugin 执行文件;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    cd grpc
       
    mkdir build
    cd build
       
    # 编译为静态库(默认,和下面的方式选一种)
    cmake .. -DgRPC_INSTALL=ON \
             -DgRPC_BUILD_TESTS=OFF \
             -Dprotobuf_BUILD_TESTS=OFF
       
    # 编译为动态库
    cmake .. -DgRPC_INSTALL=ON \
             -DgRPC_BUILD_TESTS=OFF \
             -Dprotobuf_BUILD_TESTS=OFF \
             -DBUILD_SHARED_LIBS=ON
       
    make
    sudo make install
    
  4. 将 /usr/local/bin 放到环境变量,编辑 vim ~/.zshrc 文件最后行

    1
    
    export PATH=$PATH:/usr/local/bin
    

    接着刷新 source ~/.zshrc

  5. 为了能正确找到库文件,需要执行下 ldconfig

    1
    
    sudo ldconfig
    

交叉编译 gRPC

在主环境已经安装好 grpc 的条件下进行交叉编译;

  1. 使用交叉编译器:arm-openwrt-linux-gcc;

  2. 设置环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    export HOST=arm-openwrt-linux
    export ROOTFS="${HOME}/dev_rootfs/${HOST}"
    export CFLAGS="-L${ROOTFS}/usr/local/lib -I${ROOTFS}/usr/local/include"
    export CC=${HOST}-gcc
    export AR=${HOST}-ar
    export NM=${HOST}-nm
    export LD=${HOST}-ld
    export STRIP=${HOST}-strip
    export RANLIB=${HOST}-ranlib
    export PREFIX=${ROOTFS}/usr/local
    
  3. 交叉编译、安装 grpc 以及依赖到 ${HOME}/dev_rootfs/${HOST}/usr/local 目录

    每次按该方法编译时都需要设置环境变量;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    cd grpc
       
    mkdir build
    cd build
    cmake .. -DCMAKE_CROSSCOMPILING=true \
             -DCMAKE_SYSTEM_NAME=Linux \
             -DCMAKE_SYSTEM_PROCESSOR=arm \
             -DCMAKE_C_COMPILER=${HOST}-gcc \
             -DCMAKE_CXX_COMPILER=${HOST}-g++ \
             -DCMAKE_FIND_ROOT_PATH=${ROOTFS}/usr/local/ \
             -DCMAKE_INSTALL_PREFIX:PATH=${ROOTFS}/usr/local/ \
             -DgRPC_INSTALL=ON \
             -DgRPC_BUILD_TESTS=OFF \
             -Dprotobuf_BUILD_TESTS=OFF \
             -DBUILD_SHARED_LIBS=ON
       
    # make 过程会调用 ${CMAKE_INSTALL_PREFIX}/bin/protoc 文件
    # 需要先从主机侧拷贝 protoc 文件到这里(如果该命令失效,请检查主环境的安装情况,以及 sudo ldconfig 有没有执行过)
    mkdir -p ${ROOTFS}/usr/local/bin
    \cp $(which protoc) ${ROOTFS}/usr/local/bin
       
    make
    make install
    

    PS:需要在小机端运行时,只需要将 ${ROOTFS}/usr/local/lib 拷贝到小机端 /usr/local/lib 目录即可;

初步体验 gRPC

以下编译 cpp 示例 helloworld;

  1. 在 gRPC 目录中:

    1
    2
    3
    4
    5
    6
    
    cd examples/cpp/helloworld/
       
    mkdir build
    cd build
    cmake ..
    make
    
  2. 终端 1 运行服务器:

    1
    
    ./greeter_server
    

  3. 终端 2 运行客户端:

    1
    
    ./greeter_client