C++使用grpc實(shí)現(xiàn)回射服務(wù)器
1、什么是gRPC
gRPC(Google Remote Procedure Call)是由 Google 開發(fā)的一個開源的高性能遠(yuǎn)程過程調(diào)用(RPC)框架,用于在分布式系統(tǒng)中實(shí)現(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ù)定義實(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文件生成相應(yīng)代碼
protoc -I="." --grpc_out="." --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin message.proto protoc -I="." --cpp_out="." message.proto
3.實(shí)現(xiàn)服務(wù)器:
服務(wù)端實(shí)現(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++)
實(shí)現(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實(shí)現(xiàn)回射服務(wù)器的文章就介紹到這了,更多相關(guān)C++ grpc回射服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++動態(tài)規(guī)劃之最長公子序列實(shí)例
這篇文章主要介紹了C++動態(tài)規(guī)劃之最長公子序列,實(shí)例分析了C++求最長公子序列的相關(guān)技巧,是C++字符串操作的一個典型應(yīng)用,需要的朋友可以參考下2015-04-04
C++實(shí)現(xiàn)字符格式相互轉(zhuǎn)換的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++中實(shí)現(xiàn)字符格式相互轉(zhuǎn)換的方法,主要有UTF8與string互轉(zhuǎn)、wstring與string互轉(zhuǎn),感興趣的小伙伴可以了解一下2022-11-11
C語言關(guān)鍵字之a(chǎn)uto register詳解
這篇文章主要為大家介紹了C語言關(guān)鍵字之a(chǎn)uto register,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01

