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

 更新时间:2024年10月28日 09:28:30   作者:CodeGrindstone  
gRPC是由Google开发的一个开源的高性能远程过程调用(RPC)框架,用于在分布式系统中实现跨语言的服务通信,本文我们就来看看C++如何使用grpc实现回射服务器

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 HelloRequest {
    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 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实现回射服务器的文章就介绍到这了,更多相关C++ grpc回射服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C++编程中的sizeof运算符与typeid运算符

    详解C++编程中的sizeof运算符与typeid运算符

    这篇文章主要介绍了C++编程中的sizeof运算符与typeid运算符,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 养成良好的C++编程习惯之内存管理的应用详解

    养成良好的C++编程习惯之内存管理的应用详解

    "养成良好的编程习惯"其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判,如代码的风格、效率和可读性;模块设计的灵活性、可扩展性和耦合度等等,要试图把所有方面都阐述清楚必须花很多的精力,而且也不一定能阐述得全面
    2013-05-05
  • C++ Eigen库实现最小二乘拟合的示例代码

    C++ Eigen库实现最小二乘拟合的示例代码

    Eigen 是一个线性算术的 C++ 模板库,功能强大、快速、优雅以及支持多平台,本文主要为大家介绍了C++利用Eigen库实现最小二乘拟合的示例代码,希望对大家有所帮助
    2023-07-07
  • opencv3/C++实现光流点追踪

    opencv3/C++实现光流点追踪

    今天小编就为大家分享一篇opencv3/C++实现光流点追踪,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 如何判断一个整数的二进制中有多少个1

    如何判断一个整数的二进制中有多少个1

    本篇文章是对如何判断一个整数的二进制中有多少个1的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ 中const对象与const成员函数的实例详解

    C++ 中const对象与const成员函数的实例详解

    这篇文章主要介绍了C++ 中const对象与const成员函数的实例详解的相关资料,希望通过本文能让大家彻底掌握该如何使用,需要的朋友可以参考下
    2017-08-08
  • 嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法

    嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法

    今天小编就为大家分享一篇关于嵌入式项目使用C语言结构体位段特性实现断言宏校验数据范围有效性的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++之list容器介绍及使用方式

    C++之list容器介绍及使用方式

    这篇文章主要介绍了C++之list容器介绍及使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Qt打印信息输出到日志文件中的两种方法

    Qt打印信息输出到日志文件中的两种方法

    最近在研究把 Qt 的打印信息 输出的到日志文件中,文件存储尝试了2种方法,并通过代码示例和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-04-04
  • C++简明图解分析浅拷贝与深拷贝

    C++简明图解分析浅拷贝与深拷贝

    在c++中,深拷贝和浅拷贝也算是一个难点,特别是对于初学者来说,往往在不知道两者区别的情况下而错误的使用了浅拷贝,从而导致了野指针之类的问题,但是又因为缺少理解所以很难定位到问题所在
    2022-06-06

最新评论