在windows上使用C++ gRPC
原文作者:Sanoj Subran
原文链接: Working with gRPC/C++ in Windows
Intro
在Windows上使用C/C++的开源项目通常非常痛苦,特别是对于初学者来说。如果没有没有一个预编译的二进制库的话,你会发现自己陷入“在windows上编译项目和其依赖库”的地狱中。而在Linux/MacOS上,这些步骤会被缩减为几个 make 和 make install 命令。此外,长期以来C++一直缺乏广泛使用的稳定包管理器。现在随着 vcpkg 或 conan 的出现,这种情况正在慢慢改变。在本文中,我将向您展示如何在 Windows 中设置 grpc 和protobuf 库,并使用CS模型制作一个简单的 Hello World 程序。
gRPC 是 Google 提供的一个 RPC 框架,用于在网络上实现多个应用程序之间的通信。它通过从开发人员那里抽象出启用服务器/客户端连接的复杂性,并将其简化为简单的远程过程调用来做到这一点。因此,开发人员可以轻松地使多个程序通过网络相互通信,而无需经历网络编程的麻烦。如果您正在开发原型并且想让它们相互通信,这将非常有用。 gRPC 支持多种语言,因此,通过使用通用接口定义语言 (IDL) 文件,您可以轻松地使 C++ 应用程序与 Go 或 Python 应用程序进行通信。 gRPC 使用协议缓冲区作为接口定义语言 (IDL) 来描述服务接口和有效负载消息的结构。
我们以 C++ 作为服务器和客户端的语言为例。 生成消息结构和服务接口需要以下组件:
- protoc : 一个编译器,它将 proto 文件作为输入,并以所需的语言(在我们的例子中为 C++)生成消息结构和服务接口。
- .proto 文件:一个 IDL 文件,我们在其中根据 Protobuf 规范定义消息传递结构和 rpc api。
- gRPC plugin: 不同的编程语言存在单独的 gRPC 插件,协议将需要这些插件来根据 IDL 上定义的服务接口生成源文件。
所以现在我们需要在我们的系统中安装 gRPC 和 Protobuf 包。
安装 vcpkg
gRPC 和 Protobuf 项目在下面提到的 Github URL 中,但是从 C++ 的源代码构建这些项目将是一项艰巨的任务。因此,我们将使用 C++ 包管理器为我们完成这项工作并在我们的系统中安装二进制文件。
使用包管理器的另一个优点是库将相互兼容。相反,如果您从他们的项目站点获取最新的库代码,那么您可能会遇到一些兼容性问题,最终您将花费时间来解决这些问题。我们要使用的包管理器是 vcpkg,一个来自微软的跨平台开源包管理器。它可以从 Github 的 Microsoft 页面下载。 vcpkg 的安装步骤非常简单,通常不会遇到任何问题。
安装后,可能必须将 vcpkg 可执行文件的路径添加到环境变量中的 PATH 变量中,以使其在控制台上可用。
安装 gRPC
要使用 vcpkg 安装 gRPC,请在 Windows 中启动控制台并执行以下命令:
vcpkg install grpc:x64-windows
如果您想要 32 位版本,请将 grpc:x64-windows 替换为 grpc:x86-windows。 现在 vcpkg 将下载代码,在你的机器上编译它,并将包安装在 vcpkg 安装目录内的 pkg 文件夹中。
安装 protobuf
同样,通过以下命令,使用 vcpkg 安装 protobuf 库:
vcpkg install protobuf protobuf:x64-windows
如果需要 zlib 支持,您还需要安装 zlib 功能:
vcpkg install protobuf[zlib] protobuf[zlib]:x64-windows
Note : 理想情况下,如果您已经安装了 Visual Studio,这应该不会出现任何错误。
安装后,您可以在文件夹 <vcpkg_installed_path>\packages 下的 vcpkg 目录中找到已安装的软件包。 为了使软件包在系统范围内可用,您需要使用命令:
vcpkg integrate install
使用 proto 文件生成源文件
现在我们有了所需的一切,让我们尝试使用 protoc 编译器从 proto 文件生成消息和服务接口。
我假设您已经在系统中安装了 CMake,并且您对 CMake 有基本的了解,因为我将在这里使用 CMake 来创建项目。 您可以在此处找到 CMake 的介绍文章。 An introduction to CMake 我假设您已经在系统中安装了 CMake,并且您对 CMake 有基本的了解,因为我将在这里使用 CMake 来创建项目。 您可以在此处找到 CMake 的介绍文章。
首先,我们将为我们的项目创建一个具有以下结构的文件夹:
project
|______build
|______proto
| |______helloworld.proto
|______src
| |______server.cpp
| |______client.cpp
|______CMakeLists.txt
现在我们将使用 protoc 编译器从 proto 文件生成源文件。
如果 protoc 在您的控制台中不可用,您可能必须将其添加到您的系统 env PATH。 它会出现在您的<vcpkg_install_path>\packages\protobuf_x64-windows\bin 文件夹中。
为简单起见,让我们从 gRPC 的github仓库上提取一个简单的 proto 文件。 proto 文件可以从 grpc/helloworld.proto at v1.28.1 · grpc/grpc 下载。 要了解 proto 文件的结构,请访问 Language Guide | Protocol Buffers | Google Developers 了解更多详细信息。
现在将文件复制到我们的 project/proto 文件夹并从该位置运行以下命令:
# 这将生成消息结构所需的 cpp 文件
protoc -I=. --cpp_out=. helloworld.proto
# 此命令将生成服务接口所需的 cpp 文件 -- <vcpkg_install_path> 改为vcpkg安装目录
protoc -I=. --grpc_out=. --plugin=protoc-gen-grpc="<vcpkg_install_path>\packages\grpc_x64-windows\tools\grpc\grpc_cpp_plugin.exe" helloworld.proto
使用CMake构建项目
现在我们已经从 proto 文件生成了所需的文件,让我们添加服务器、客户端代码并创建一个项目。
server.cpp 和 client.cpp 将使用 gRPC 网站中的示例中提到的相同代码。 所以将内容复制到我们的本地服务器和客户端cpp文件中。 您必须在客户端和服务器源文件中将 helloworld.grpc.pb.h 的头文件路径更新为相对路径“../proto/helloworld.grpc.pb.h”。
现在让我们将内容添加到我们的 CMakeLists.txt 文件中。 获取以下代码并将其复制到我们的 CMakeLists.txt 文件中:
cmake_minimum_required( VERSION 3.1 )
project( grpc_example )
find_package(gRPC CONFIG REQUIRED)
find_package( Protobuf REQUIRED )
add_executable( server src/server.cpp proto/helloworld.grpc.pb.cc proto/helloworld.pb.cc)
add_executable( client src/client.cpp proto/helloworld.grpc.pb.cc proto/helloworld.pb.cc)