简介
gRPC(Google Remote Procedure Call是由 Google 开发的高性能、通用的远程过程调用(RPC)框架。它建立在 Protocol Buffers(protobuf)序列化协议之上,并使用 HTTP/2 协议进行消息传输,支持多种编程语言和平台。它适用于构建分布式系统、微服务架构和云原生应用等场景,广泛应用于各种领域的软件开发。
- 简单易用:gRPC 提供了简单易用的 API,使开发人员可以轻松地定义服务接口和消息类型,自动生成服务器和客户端的代码,并使用这些代码进行远程过程调用。
- 高性能:gRPC 基于 HTTP/2 标准,通过复用 TCP 连接和多路复用技术,在客户端和服务器之间实现快速且高效的双向通信。它还提供流式传输(如流式响应和流式请求)的支持,以便处理大量数据的场景。
- 跨语言和平台:gRPC 支持多种编程语言,包括 C++、Python、Java、Go、Ruby、C# 等,使不同语言的应用程序可以无缝通信。此外,它还可以运行在多种平台上,包括 Linux、Windows、macOS、Android 和 iOS 等。
- 强大的序列化支持:gRPC 使用 Protocol Buffers(protobuf)作为默认的序列化协议,可以更高效地编码和解码数据。Protocol Buffers 提供了灵活且易于使用的接口定义语言,允许开发者定义结构化的消息类型,并自动生成序列化和反序列化的代码。
- 支持服务发现和负载均衡:gRPC 集成了服务发现和负载均衡的功能,可以与现有的服务发现工具(如 etcd、Consul)和负载均衡器(如 NGINX、Envoy)结合使用,实现动态的服务注册和发现。
- 拦截器和中间件支持:gRPC 提供了强大的拦截器和中间件机制,允许开发者在请求和响应的处理过程中进行自定义操作,例如身份验证、日志记录、错误处理等。
最好是通过以下方式步骤去操作,单下载出来的gRPC库会因为子模块的各种依赖尝试出各种不兼容缺文件错误,且网上查找的各种方式各博主的环境不一致出现的问题遇到的情况都不同 会有一些误导性 (仅建议,非必采纳)
基础库安装
sudo apt install -y zlib1g-dev libssl-dev libcurl4-openssl-dev
sudo apt install -y libgoogle-perftools-dev
sudo apt install -y libc-ares-dev
sudo apt install -y pkg-config
sudo apt install -y autoconf automake libtool make g++
编译条件准备
git clone https://github.com/grpc/grpc.git //git gRPC库
cd grpc
git submodule update --init //git gRPC库所依赖的子模块
编译
gRPC交叉编译之前,需要先交叉编译好protobuf,并且与交叉编译其他库不同的是,gRPC需要先生成宿主机平台的protobuf和gRPC。原因是在gRPC交叉编译的过程中,需要使用对应的编译平台的bin文件(protoc,grpc_cpp_plugin等等),所以第一步是需要在宿主机平台完成gRPC和protobuf的安装。
-
编译安装宿主机protobuf
cd third_party/protobuf ./autogen.sh ./configure sudo make sudo make install sudo ldconfig
-
编译安装宿主机gRPC
cd grpc sudo make sudo make install sudo ldconfig
-
清除宿主机编译文件
make clean
-
交叉编译环境搭建
-
交叉编译gRPC库
- 指定交叉编译环境变量
export GRPC_CROSS_COMPILE=true export GRPC_CROSS_AROPTS="cr --target=elf64-little"
- 交叉编译
make HAS_PKG_CONFIG=false \ CC=aarch64-linux-gnu-gcc \ CXX=aarch64-linux-gnu-g++ \ RANLIB=aarch64-linux-gnu-ranlib \ LD=aarch64-linux-gnu-ld \ LDXX=aarch64-linux-gnu-g++ \ AR=aarch64-linux-gnu-ar \ PROTOBUF_CONFIG_OPTS="--host=aarch64-linux-gnu --with-protoc=/usr/local/bin/protoc" static
- 指定交叉编译环境变量
查验编译文件
编译后的.a等文件默认会输出到 /grpc/libs/opt/
使用以下命令查看文件编译情况:
objdump -s --section=.comment your_file
或
readelf -h your_file