21xrx.com
2024-12-22 22:25:18 Sunday
登录
文章检索 我的文章 写文章
Grpc C++指南:从零开始学习grpc技术
2023-06-30 18:49:51 深夜i     --     --
Grpc C++ 学习指南 技术 零基础

Grpc是一个高性能、跨平台的RPC(远程过程调用)框架,它是由Google开源,并且可以用C++和其他编程语言实现。随着微服务架构的流行,grpc的使用变得越来越广泛。如果你是一个C++开发人员并且对grpc感兴趣,那么这篇指南可以帮助你从零开始学习grpc技术。

Grpc概述

Grpc是一个基于HTTP/2协议的远程过程调用框架,它支持双向流、流控制、头部压缩、多路复用等特性。它使用Google Protocol Buffers作为序列化框架,可以跨多种编程语言调用。Grpc支持不同语言之间的通信,在C++中可以与Java、Go、Ruby、Python和C#等语言进行通信。

Grpc安装

首先,我们需要安装grpc库和grpc的依赖项。grpc依赖于protobuf和openssl库。在ubuntu中,你可以使用以下命令安装:

sudo apt-get install build-essential autoconf libtool pkg-config

sudo apt-get install libssl-dev

sudo apt-get install protobuf-compiler libprotobuf-dev

接下来,你需要从grpc的官方Github库中下载和安装最新版本的grpc。在命令行中,你需要运行下面的命令:

git clone -b v1.38.0 https://github.com/grpc/grpc

cd grpc

git submodule update --init

mkdir -p cmake/build

cd cmake/build

cmake ../.. -DBUILD_SHARED_LIBS=ON

make -j$(nproc)

sudo make install

Grpc使用入门

在这里,我们将学习如何使用C++来编写grpc客户端和服务器,我们将使用简单的示例来说明这个过程。当然,这是一个非常基本的例子,但它对于初学者来说是一个很好的起点。

我们将从一个简单的计算器RPC服务开始,客户端将请求两个数字相加,服务器将返回这两个数字之和。让我们从定义.proto文件开始:

syntax = "proto3";

package calculator;

service CalculateService {

 rpc Add (AddRequest) returns (AddResponse) {}

}

message AddRequest

 int32 num1 = 1;

 int32 num2 = 2;

message AddResponse

 int32 sum = 1;

在这个.proto文件中,我们使用proto3语法定义了一个名为CalculateService的服务,它只有一个Add方法。Add方法接收两个int32类型的参数并返回一个int32类型的参数。现在,我们需要使用protoc编译器生成对应的C++类,可以在命令行中使用以下命令:

protoc --grpc_out=. --cpp_out=. --proto_path=. calculator.proto

这将生成两个文件AddRequest.pb.h和AddRequest.pb.cc。我们需要将它们添加到我们的C++项目中并使用它们编写客户端和服务器。

服务器

现在,我们需要创建一个grpc服务器,以便客户端可以通过它来调用Add方法。下面是一个简单的实现:

#include

#include

#include

#include

#include "calculator.grpc.pb.h"

using grpc::Server;

using grpc::ServerBuilder;

using grpc::ServerContext;

using grpc::Status;

using calculator::AddRequest;

using calculator::AddResponse;

using calculator::CalculateService;

class CalculatorServiceImpl final : public CalculateService::Service {

 Status Add(ServerContext* context, const AddRequest* request,

         AddResponse* response) override {

  int sum = request->num1() + request->num2();

  response->set_sum(sum);

  return Status::OK;

 }

};

void RunServer() {

 std::string server_address("0.0.0.0:50051");

 CalculatorServiceImpl service;

 ServerBuilder builder;

 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());

 builder.RegisterService(&service);

 std::unique_ptr server(builder.BuildAndStart());

 std::cout << "Server listening on " << server_address << std::endl;

 server->Wait();

}

int main(int argc, char** argv) {

 RunServer();

 return 0;

}

在这个服务器的实现中,我们继承了CalculateService的服务类,并定义了服务调用Add方法。在Add方法中,我们简单地将请求的两个数字相加,然后将结果存储在响应中并返回Status::OK状态。

客户端

现在,我们需要一个grpc客户端来调用Add方法并获得响应。下面是一个实现:

#include

#include

#include

#include

#include "calculator.grpc.pb.h"

using grpc::Channel;

using grpc::ClientContext;

using grpc::Status;

using calculator::AddRequest;

using calculator::AddResponse;

using calculator::CalculateService;

class CalculatorClient {

public:

 CalculatorClient(std::shared_ptr channel)

   : stub_(CalculateService::NewStub(channel)) {}

 int Add(int num1, int num2) {

  AddRequest request;

  request.set_num1(num1);

  request.set_num2(num2);

  AddResponse response;

  ClientContext context;

  Status status = stub_->Add(&context, request, &response);

  if (status.ok()) {

   return response.sum();

  } else {

   std::cout << status.error_code() << ": " << status.error_message()

        << std::endl;

   return -1;

  }

 }

private:

 std::unique_ptr stub_;

};

int main(int argc, char** argv) {

 CalculatorClient client(grpc::CreateChannel(

   "localhost:50051", grpc::InsecureChannelCredentials()));

 int sum = client.Add(3, 5);

 std::cout << "Add: " << sum << std::endl;

 return 0;

}

在这个客户端实现中,我们创建了一个CalculatorClient类,它被用于创建grpc通道和调用Add方法。在Add方法中,我们构造了一个AddRequest对象并将num1和num2设置为传入的参数。接着,我们使用client stub的Add方法调用远程服务器的Add方法。如果调用成功,我们将响应中的sum值返回。否则,我们打印错误消息并返回-1。

结论

以上就是Grpc C++指南的全部内容,你现在应该能够使用grpc编写自己的C++服务器和客户端了。就像我们这里所演示的,grpc提供了非常简单易用的API,并且它可以在不同类型和不同编程语言的系统之间提供可扩展的通信。因此,在你的下一个微服务项目中,请尝试使用grpc!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复