1. RPC框架
RPC框架是什么
RPC 框架说白了就是让你可以像调用本地方法一样调用远程服务提供的方法,而不需要关心底层的通信细节。简单地说就让远程服务调用更加简单、透明。 RPC包含了客户端(Client)和服务端(Server)
业界主流的 RPC 框架整体上分为三类:
1> 支持多语言的RPC框架,比较成熟的有Google的gRPC、Apache(Facebook)的Thrift;
2> 只支持特定语言的RPC框架,例如新浪微博的Motan;
3> 支持服务治理等服务化特性的分布式服务框架,其底层内核仍然是 RPC 框架, 例如阿里的 Dubbo
2. GRPC简介
在GRPC里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多RPC系统类似,gRPC也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个GRPC服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
GRPC调用流程:
1> 客户端(gRPC Stub)调用 A 方法,发起 RPC 调用。
2> 对请求信息使用 Protobuf 进行对象序列化压缩(IDL)。
3> 服务端(gRPC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回。
4> 对响应结果使用 Protobuf 进行对象序列化压缩(IDL)。
5> 客户端接受到服务端响应,解码请求体。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果
===================================================================
概念部分讲完,grpc支持多语言跨平台,这里接下来咱们重点讲解c++如何使用grpc,方法很多,咱们这里只分析两种使用方式:
1> mingw源代码编译使用的方式
2> Qt调用grpc
3. 下载grpc
git clone [-b v1.50.0] https://github.com/grpc/grpc
git submodule update --init
注意:
1> 这里[-b v1.50.0]表示可以指定对应的版本号,也可以不加,默认下载master的grpc源码
2> submodule比较慢的情况下可以考虑换个源,修改grpc/.gitmodules,将内容替换为:
[submodule "third_party/abseil-cpp"]
path = third_party/abseil-cpp
url = https://gitee.com/suuair/abseil-cpp.git
[submodule "third_party/benchmark"]
path = third_party/benchmark
url = https://gitee.com/chahan/benchmark.git
[submodule "third_party/bloaty"]
path = third_party/bloaty
url = https://gitee.com/GgBoy_ssz/bloaty.git
[submodule "third_party/boringssl-with-bazel"]
path = third_party/boringssl-with-bazel
url = https://gitee.com/GgBoy_ssz/boringssl.git
[submodule "third_party/cares/cares"]
path = third_party/cares/cares
url = https://gitee.com/RicLee/c-ares.git
[submodule "third_party/envoy-api"]
path = third_party/envoy-api
url = https://gitee.com/RicLee/data-plane-api.git
[submodule "third_party/googleapis"]
path = third_party/googleapis
url = https://gitee.com/GgBoy_ssz/googleapis.git
[submodule "third_party/googletest"]
path = third_party/googletest
url = https://gitee.com/bosspoi/googletest.git
[submodule "third_party/libuv"]
path = third_party/libuv
url = https://gitee.com/RicLee/libuv.git
[submodule "third_party/opencensus-proto"]
path = third_party/opencensus-proto
url = https://gitee.com/RicLee/opencensus-proto.git
[submodule "third_party/opentelemetry"]
path = third_party/opentelemetry
url = https://gitee.com/EBServerStudy/opentelemetry-proto.git
[submodule "third_party/protobuf"]
path = third_party/protobuf
url = https://gitee.com/EBServerStudy/protobuf.git
[submodule "third_party/protoc-gen-validate"]
path = third_party/protoc-gen-validate
url = https://gitee.com/arzhe/protoc-gen-validate.git
[submodule "third_party/re2"]
path = third_party/re2
url = https://gitee.com/GgBoy_ssz/re2.git
[submodule "third_party/xds"]
path = third_party/xds
url = https://gitee.com/EBServerStudy/xds.git
[submodule "third_party/zlib"]
path = third_party/zlib
url = https://gitee.com/RicLee/zlib.git
# When using CMake to build, the zlib submodule ends up with a
# generated file that makes Git consider the submodule dirty. This
# state can be ignored for day-to-day development on gRPC.
ignore = dirty
替换完成之后执行命令:
git submodule sync
git submodule update --init
4. 编译安装
1> 在终端中进入grpc文件夹,输入mkdir -p cmake/build创建编译文件夹
2> 构建代码,输入cmake …/… -G "MinGW Makefiles"生成makefile和相关文件
3> 编译代码,输入 make -j
4> 安装grpc, 输入make install -j默认安装到"C:\Program Files (x86)\grpc"这个目录下
以上步骤的基础在于已经安装好了cmake和mingw编译环境;这里不详细展开怎么安装;不清楚的童鞋可以参考:
https://blog.csdn.net/qq_37434641/article/details/127561281
我这里实际上已经安装了qt环境,qt环境下自带了mingw编译环境,不需要安装w64devkit;但是编译命令需要更换成mingw32-make -j && mingw32-make install -j;包括命令找不到的话需要配置环境变量,熟悉linux编译的应该都知道这些,这里不展开,自行百度
5. 编译输出
正常编译完成会在C:\Program Files (x86)\grpc目录下生成如下内容:
6. 运行示例
切换到源代码E:\grpc\grpc\examples\cpp\helloworld目录,修改cmakelist.txt文件
修改完成后执行以下命令:
mkdir -p cmake/build
cd cmake/build
cmake ../.. -DCMAKE_PREFIX_PATH="C:/Program Files (x86)/grpc/"