什么是 gRPC 以及为什么需要它?
\n\ngRPC (gRPC Remote Procedure Calls) 是一个由 Google 开发的高性能、开源的远程过程调用 (RPC) 框架。它允许客户端应用程序直接调用服务器应用程序上的方法,就像调用本地对象一样,从而简化了分布式系统和微服务的创建。
\n\ngRPC 的基础是 Protocol Buffers (protobuf),一种强大的结构化数据序列化机制。您在 .proto 文件中定义数据结构和服务,然后 protoc 编译器会生成所需语言(在本例中为 C++)的代码。
gRPC 的主要优势:
\n- \n
- 高性能: 使用 HTTP/2 进行请求多路复用,并使用 Protobuf 二进制格式,比 JSON/XML 快得多。 \n
- 强类型: 服务之间的契约在
.proto文件中明确定义。 \n - 支持流式传输: 支持服务器端流、客户端流和双向流。 \n
- 多语言支持: 可为 C++、Java、Python、Go、C#、Ruby 等多种语言生成客户端和服务器。 \n
- 内置身份验证和加密: 支持 TLS/SSL 和拦截器 (interceptors)。 \n
gRPC for C++ 库是一个原生实现,可提供对内存和性能的最大控制,这对于高负载系统、游戏服务器、金融应用程序和物联网至关重要。
\n\n安装 gRPC for C++
\n\n安装 gRPC for C++ 的过程比 Python 更复杂,因为它需要从源代码编译或使用 vcpkg 包管理器。我们将介绍两种主要方法。
\n\n方法 1:通过 vcpkg 安装(推荐)
\nvcpkg 是 Microsoft 提供的 C++ 跨平台包管理器。
# 1. 克隆 vcpkg\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n\n# 2. 安装 vcpkg (Windows: bootstrap-vcpkg.bat)\n./bootstrap-vcpkg.sh\n\n# 3. 集成到系统 (适用于 Visual Studio 或 CMake)\n./vcpkg integrate install\n\n# 4. 安装 gRPC (连同 protobuf 和依赖项)\n./vcpkg install grpc\n安装后,您需要在 CMakeLists.txt 中链接找到的包:
\nfind_package(gRPC CONFIG REQUIRED)\nfind_package(Protobuf CONFIG REQUIRED)\n\ntarget_link_libraries(my_target\n gRPC::grpc++\n gRPC::grpc++_reflection\n protobuf::libprotobuf\n)\n\n方法 2:从源代码编译 (Linux/macOS)
\n这种方法提供了更多控制,但需要安装依赖项 (cmake, openssl, zlib, abseil)。
\n# 克隆包含子模块的仓库\ngit clone --recurse-submodules -b v1.62.0 https://github.com/grpc/grpc\ncd grpc\n\n# 创建构建目录\nmkdir -p cmake/build\ncd cmake/build\n\n# 配置并构建\ncmake ../.. -DgRPC_INSTALL=ON \\\n -DCMAKE_BUILD_TYPE=Release \\\n -DCMAKE_INSTALL_PREFIX=/usr/local\nmake -j$(nproc)\nsudo make install\n\n快速入门:"Hello World" 示例
\n\n让我们创建一个简单的应用程序,它接收用户名并返回问候语。
\n\n步骤 1:在 .proto 文件中定义服务
\n创建文件 hello.proto:
syntax = "proto3";\n\npackage helloworld;\n\n// 定义请求消息\nmessage HelloRequest {\n string name = 1;\n}\n\n// 定义响应消息\nmessage HelloReply {\n string message = 1;\n}\n\n// 定义 RPC 服务\nservice Greeter {\n // 一元 RPC:一个请求 -> 一个响应\n rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\n步骤 2:生成 C++ 代码
\nprotoc --grpc_out=. --plugin=protoc-gen-grpc=`wh