C++使用grpc實現(xiàn)回射服務器
1、什么是gRPC
gRPC(Google Remote Procedure Call)是由 Google 開發(fā)的一個開源的高性能遠程過程調(diào)用(RPC)框架,用于在分布式系統(tǒng)中實現(xiàn)跨語言的服務通信。它基于 HTTP/2 協(xié)議,使用 Protocol Buffers(protobuf)作為數(shù)據(jù)交換格式。gRPC 適合在多語言環(huán)境中提供高效的服務間通信,尤其在微服務架構(gòu)中非常流行。
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.客戶端調(diào)用:
客戶端使用生成的存根(stub)發(fā)起遠程調(diào)用,調(diào)用過程與本地方法調(diào)用類似
5.消息序列化與傳輸
客戶端將消息序列化為二進制格式,通過HTTP/2發(fā)送到服務器。服務器接收到請求后反序列化,并執(zhí)行相應的邏輯,然后將結(jié)果返回給客戶端。
3、服務端(C++)
實現(xiàn)回射服務器:客戶端與服務端之間發(fā)送內(nèi)容一致
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; }
到此這篇關(guān)于C++使用grpc實現(xiàn)回射服務器的文章就介紹到這了,更多相關(guān)C++ grpc回射服務器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)字符格式相互轉(zhuǎn)換的示例代碼
這篇文章主要為大家詳細介紹了C++中實現(xiàn)字符格式相互轉(zhuǎn)換的方法,主要有UTF8與string互轉(zhuǎn)、wstring與string互轉(zhuǎn),感興趣的小伙伴可以了解一下2022-11-11C語言關(guān)鍵字之a(chǎn)uto register詳解
這篇文章主要為大家介紹了C語言關(guān)鍵字之a(chǎn)uto register,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01