开发者

C++使用grpc实现回射服务器

开发者 https://www.devze.com 2024-10-29 11:08 出处:网络 作者: CodeGrindstone
目录1、什么是gRPC2、gRPC的工作流程3、服务端(C++)4、客户端(c++)1、什么是gRPC
目录
  • 1、什么是gRPC
  • 2、gRPC的工作流程
  • 3、服务端(C++)
  • 4、客户端(c++)

1、什么是gRPC

gRPC(Google Remote Procedure Call)是由 Google 开发的一个开源的高性能远程过程调用(RPC)框架,用于在分布式系统中实现跨语言的服务通信。它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf)作为数据交换格式。gRPC 适合在多语言环境中提供高效的服务间通信,尤其在微服务架构中非常流行。

2、gRPC的工作流程

1.服务定义:

使用Protocol Buffers定义服务接口及其方法,包括输入参数和返回值。比如,以下是一个简单的服务定义实例:

// message.proto
syntax = "proto3";

// 声明protobuf中的包名
package message;

service Greeter {
    rpc SayHello(HelloRequest) returns (HelloResponse);
}

message HelloRequeEDfjUORMZst {
    string name = 1;
}

message HelloResponse {
    string message = 1;
}

2.生成代码:

使用gRPC提供的工具,根据proto文件生成相应代码

protoc -I="." --grpc_out="." --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin message.proto
protoc -I="." --cpp_out="." message.proto

3.实现服务器:

服务端实现定义的服务逻辑,处理客户端请求

4.客户端调用:

客户端使用生成的存根(stub)发起远程调用,调用过程与本地方法调用类似

5.消息序列化与传输

客户端将消息序列化为二进制格式,通过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 namespac编程客栈e boost::asio;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;

using message:EDfjUORMZ:HelloResponse;
using message::HelloRequest;
using message::Greeter;

void gRPCclient()
{
    grpc::Cliewww.devze.comntContext 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()
{
    gRPCclie编程nt();
    return 0;
}

到此这篇关于C++使用grpc实现回射服务器的文章就介绍到这了,更多相关C++ grpc回射服务器内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消