C++使用grpc實現(xiàn)回射服務(wù)器
1、什么是gRPC
gRPC(Google Remote Procedure Call)是由 Google 開發(fā)的一個開源的高性能遠(yuǎn)程過程調(diào)用(RPC)框架,用于在分布式系統(tǒng)中實現(xiàn)跨語言的服務(wù)通信。它基于 HTTP/2 協(xié)議,使用 Protocol Buffers(protobuf)作為數(shù)據(jù)交換格式。gRPC 適合在多語言環(huán)境中提供高效的服務(wù)間通信,尤其在微服務(wù)架構(gòu)中非常流行。
2、gRPC的工作流程
1.服務(wù)定義:
使用Protocol Buffers定義服務(wù)接口及其方法,包括輸入?yún)?shù)和返回值。比如,以下是一個簡單的服務(wù)定義實例:
// 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文件生成相應(yīng)代碼
protoc -I="." --grpc_out="." --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin message.proto protoc -I="." --cpp_out="." message.proto
3.實現(xiàn)服務(wù)器:
服務(wù)端實現(xiàn)定義的服務(wù)邏輯,處理客戶端請求
4.客戶端調(diào)用:
客戶端使用生成的存根(stub)發(fā)起遠(yuǎn)程調(diào)用,調(diào)用過程與本地方法調(diào)用類似
5.消息序列化與傳輸
客戶端將消息序列化為二進(jìn)制格式,通過HTTP/2發(fā)送到服務(wù)器。服務(wù)器接收到請求后反序列化,并執(zhí)行相應(yīng)的邏輯,然后將結(jié)果返回給客戶端。
3、服務(wù)端(C++)
實現(xiàn)回射服務(wù)器:客戶端與服務(wù)端之間發(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服務(wù)器
grpc::ServerBuilder builder;
// 監(jiān)聽端口和添加服務(wù)
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)回射服務(wù)器的文章就介紹到這了,更多相關(guān)C++ grpc回射服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文詳解C++關(guān)鍵字nullptr及與NULL的區(qū)別
這篇文章主要給大家詳細(xì)介紹了C++關(guān)鍵字nullptr,及?NULL與nullptr的區(qū)別,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
采用C++實現(xiàn)區(qū)間圖著色問題(貪心算法)實例詳解
這篇文章主要介紹了采用C++實現(xiàn)區(qū)間圖著色問題(貪心算法),很經(jīng)典的算法問題,需要的朋友可以參考下2014-07-07
C++11的for循環(huán),以及范圍Range類的簡單實現(xiàn)
下面小編就為大家?guī)硪黄狢++11的for循環(huán),以及范圍Range類的簡單實現(xiàn)。小編覺得挺不錯的, 現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
C語言實現(xiàn)統(tǒng)計字符串單詞數(shù)
這篇文章主要介紹了C語言實現(xiàn)統(tǒng)計字符串單詞數(shù),代碼非常的簡潔,有需要的小伙伴快來參考下。2015-03-03

