文章目录
-
-
- [1、gRPC 安装](#1、gRPC 安装)
- 2、创建项目
-
- [2.1、创建 "空的解决方案"](#2.1、创建 “空的解决方案”)
- [2.2、新建 gRPCServer 和 gRPCClient 项目](#2.2、新建 gRPCServer 和 gRPCClient 项目)
- [2.3、创建 `proto` 文件](#2.3、创建
proto
文件)
- [2、为 gRPC 服务端和客服端项目配置 protobuf 编译](#2、为 gRPC 服务端和客服端项目配置 protobuf 编译)
-
- [2.1、protobuf 配置](#2.1、protobuf 配置)
- [2.2、gRPCServer 项目配置](#2.2、gRPCServer 项目配置)
- [2.3、gRPCClient 项目配置](#2.3、gRPCClient 项目配置)
- 3、测试
-
1、gRPC 安装
本文使用 vcpkg 安装 gRPC,首先确保 Windows 系统中已经安装了 vcpkg。
在 vcpkg 安装路径下启动 cmd 终端,并输入如下安装命令:
bash
.\vcpkg.exe install grpc:x64-windows
经过一段时间的安装后,执行如下命令,将 vcpkg 集成到 Visual Studio 中:
bash
.\vcpkg.exe integrate install
2、创建项目
本文介绍的是 C++ gRPC 测试环境搭建流程,为了使用方便,服务器程序和客户端程序都放在一个解决方案中,这和实际项目程序组织形式有所不同。首先创建一个空解决方案,然后添加服务器项目和客户端项目。具体流程可以参考下文描述:
2.1、创建 "空的解决方案"
打开 Visual Studio 2022,选中 C++ 空项目:
输入项目名称,创建新的项目:
生成的新项目解决方案如下图所示:
右键选中 "gRPCDemo " ,选择 "移除":
至此,生成了 "空的解决方案",如下图所示。
2.2、新建 gRPCServer 和 gRPCClient 项目
右键选中 "解决方案 'gRPCDemo'(0 个项目) ",选中 "添加 ",再选中 "新建项目(N)... ":
选择 "控制台应用 ",分别创建服务端项目和客户端项目。
至此,服务端项目 gRPCServer 和客服端项目 gRPCClient 已经创建成功,如下图所示:
其中,gRPCServer 服务端程序如下:
c++
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "greet.grpc.pb.h" // 自动生成的头文件
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using greet::Greeter;
using greet::HelloRequest;
using greet::HelloReply;
// 实现 Greeter 服务接口
class GreeterServiceImpl final : public Greeter::Service {
Status SayHello(ServerContext* context, const HelloRequest* request,
HelloReply* reply) override {
std::string prefix("Hello ");
reply->set_message(prefix + request->name());
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50051");
GreeterServiceImpl service;
ServerBuilder builder;
// 监听指定地址和端口,使用不安全的连接 (生产环境应使用安全连接)
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
// 注册服务实现
builder.RegisterService(&service);
// 组装并启动服务器
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address << std::endl;
// 阻塞等待服务器关闭
server->Wait();
}
int main(int argc, char** argv) {
RunServer();
return 0;
}
其中,**gRPCClient ** 客户端程序如下:
c++
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "greet.grpc.pb.h" // 自动生成的头文件
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using greet::Greeter;
using greet::HelloRequest;
using greet::HelloReply;
class GreeterClient {
public:
GreeterClient(std::shared_ptr<Channel> channel)
: stub_(Greeter::NewStub(channel)) {}
// 发送请求并接收响应
std::string SayHello(const std::string& user) {
HelloRequest request;
request.set_name(user);
HelloReply reply;
ClientContext context;
// 发起 RPC 调用
Status status = stub_->SayHello(&context, request, &reply);
// 处理 RPC 调用的状态
if (status.ok()) {
return reply.message();
} else {
std::cout << status.error_code() << ": " << status.error_message()
<< std::endl;
return "RPC failed";
}
}
private:
std::unique_ptr<Greeter::Stub> stub_;
};
int main(int argc, char** argv) {
// 创建到服务器的连接通道 (使用不安全的连接)
std::string target_str = "localhost:50051";
GreeterClient greeter(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
// 发送请求
std::string user("world");
std::string reply = greeter.SayHello(user);
std::cout << "Greeter received: " << reply << std::endl;
std::cout << "Finished" << std::endl;
return 0;
}
2.3、创建 proto
文件
右键选中 解决方案 'gRPCDemo' ,选中 添加 ,选中 新建解决方案文件夹(D) ,命名为 "Protos " ,操作步骤如下图所示:
添加 proto 文件,右键选中 "Protos 文件夹 ",选中 添加(D) ,选中 新建项(W)...
选择 "文本文件 ",命名为: greet.proto :
其中,greet.proto 文件内容为:
protobuf
syntax = "proto3";
option csharp_namespace = "GrpcExample";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
2、为 gRPC 服务端和客服端项目配置 protobuf 编译
2.1、protobuf 配置
右键选中 gRPCServer 项目,添加 现有项:
选中 greet.proto 文件,将 greet.proto 文件添加到 gRPCServer 项目中:
2.2、gRPCServer 项目配置
下面以 gRPCServer 项目 配置流程为例,介绍具体的配置过程,gRPCClient 和 gRPCServer 作同样的配置处理。
1、右键选中 gRPCServer 项目,选中属性 --> 常规 --> C++语言标准 ,选为 std:c++17 及以上:
2、右键选中 greet.proto 文件,选中 属性 ,修改 常规 --> 项类型 的内容为: Protobuf Compile :
右键选中 gRPCServer 项目,点击 生成:
成功生成项目信息:
2.3、gRPCClient 项目配置
gRPCClient 和 gRPCServer 作同样的配置处理。流程参考 2.2 gRPCServer 项目配置
3、测试
3.1、启动服务端程序
按 F5 启动服务端程序,成功启动输出如下信息:
3.2、启动客户端程序
首先点击右侧 解决方案资源管理器 ,右键选中 gRPCClient 项目,点击 调试 --> 启动新实例(S) :
客户端成功获取 gRPC 调用结果信息: