C++使用grpc實現(xiàn)回射服務器
1、什么是gRPC
gRPC(Google Remote Procedure Call)是由 Google 開發(fā)的一個開源的高性能遠程過程調用(RPC)框架,用于在分布式系統(tǒng)中實現(xiàn)跨語言的服務通信。它基于 HTTP/2 協(xié)議,使用 Protocol Buffers(protobuf)作為數(shù)據(jù)交換格式。gRPC 適合在多語言環(huán)境中提供高效的服務間通信,尤其在微服務架構中非常流行。
2、gRPC的工作流程
1.服務定義:
使用Protocol Buffers定義服務接口及其方法,包括輸入?yún)?shù)和返回值。比如,以下是一個簡單的服務定義實例:
// message.proto
syntax = "proto3";
// 聲明protobuf中的包名
package message;
service Greeter {
rpc SayHello(HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
2.生成代碼:
使用gRPC提供的工具,根據(jù)proto文件生成相應代碼
protoc -I="." --grpc_out="." --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin message.proto protoc -I="." --cpp_out="." message.proto
3.實現(xiàn)服務器:
服務端實現(xiàn)定義的服務邏輯,處理客戶端請求
4.客戶端調用:
客戶端使用生成的存根(stub)發(fā)起遠程調用,調用過程與本地方法調用類似
5.消息序列化與傳輸
客戶端將消息序列化為二進制格式,通過HTTP/2發(fā)送到服務器。服務器接收到請求后反序列化,并執(zhí)行相應的邏輯,然后將結果返回給客戶端。
3、服務端(C++)
實現(xiàn)回射服務器:客戶端與服務端之間發(fā)送內容一致
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;
// 創(chuàng)建和啟動gRPC服務器
grpc::ServerBuilder builder;
// 監(jiān)聽端口和添加服務
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;
}
到此這篇關于C++使用grpc實現(xiàn)回射服務器的文章就介紹到這了,更多相關C++ grpc回射服務器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

