基于c++使用grpc实现回射服务器
grpc, c++
·
1、什么是gRPC?
gRPC(Google Remote Procedure Call)是由 Google 开发的一个开源的高性能远程过程调用(RPC)框架,用于在分布式系统中实现跨语言的服务通信。它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf)作为数据交换格式。gRPC 适合在多语言环境中提供高效的服务间通信,尤其在微服务架构中非常流行。
2、gRPC的工作流程
-
服务定义:
-
使用
Protocol Buffers
定义服务接口及其方法,包括输入参数和返回值。比如,以下是一个简单的服务定义实例:// message.proto syntax = "proto3"; // 声明protobuf中的包名 package message; service Greeter { rpc SayHello(HelloRequest) returns (HelloResponse); } message HelloRequest { string name = 1; } message HelloResponse { string message = 1; }
-
-
生成代码:
- 使用gRPC提供的工具,根据proto文件生成相应代码
protoc -I="." --grpc_out="." --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin message.proto protoc -I="." --cpp_out="." message.proto
- 使用gRPC提供的工具,根据proto文件生成相应代码
-
实现服务器:
- 服务端实现定义的服务逻辑,处理客户端请求
-
客户端调用:
- 客户端使用生成的存根(stub)发起远程调用,调用过程与本地方法调用类似
-
消息序列化与传输
- 客户端将消息序列化为二进制格式,通过HTTP/2发送到服务器。服务器接收到请求后反序列化,并执行相应的逻辑,然后将结果返回给客户端。
3、服务端(C++)
实现回射服务器:客户端与服务端之间发送内容一致
using namespace std;
using namespace boost::asio;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using message::HelloResponse;
using message::HelloRequest;
using message::Greeter;
class gRPCServerImpl final : public Greeter::Service
{
public:
gRPCServerImpl(){};
Status SayHello(ServerContext* context, const HelloRequest* request, HelloResponse* response){
cout << "gRPC Server received message: " << request->name() << endl;
response->set_message(request->name());
return Status::OK;
}
};
void RunServer(std::string port)
{
std::string server_address("0.0.0.0:" + port);
gRPCServerImpl service;
// 创建和启动gRPC服务器
grpc::ServerBuilder builder;
// 监听端口和添加服务
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
builder.RegisterService(&service);
unique_ptr<grpc::Server> server(builder.BuildAndStart());
cout << "Server listening on " << server_address << endl;
boost::asio::io_context io_context;
boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
signals.async_wait([&server](const boost::system::error_code& error, int signal_number){
if(!error){
server->Shutdown();
cout << "Server ShutDown!" << endl;
}
});
thread([&io_context](){ io_context.run(); }).detach();
server->Wait();
io_context.stop();
}
int main()
{
try{
std::string port = "10086";
RunServer(port);
}catch(exception& e){
cerr << e.what() << endl;
}
return 0;
}
4、客户端(c++)
using namespace std;
using namespace boost::asio;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using message::HelloResponse;
using message::HelloRequest;
using message::Greeter;
void gRPCclient()
{
grpc::ClientContext io_context;
HelloResponse Rep;
HelloRequest Req;
std::string address_server("192.168.49.130:10086");
auto channle = grpc::CreateChannel(address_server, grpc::InsecureChannelCredentials());
auto stub = Greeter::NewStub(channle);
std::string message;
std::cout << "请输入: ";
cin >> message;
Req.set_name(message);
Status status = stub->SayHello(&io_context, Req, &Rep);
if(status.ok()){
cout << Rep.message() << endl;
}else{
cout << "错误" << endl;
}
}
int main()
{
gRPCclient();
return 0;
}
更多推荐
已为社区贡献1条内容
所有评论(0)