📜  proto gRPC 中的服务 (1)

📅  最后修改于: 2023-12-03 15:33:48.367000             🧑  作者: Mango

Proto gRPC 中的服务

什么是 Proto gRPC?

Proto gRPC 是一种使用 Protocol Buffers 和 gRPC 技术的服务定义语言。该语言可以用于定义如何进行数据的序列化、反序列化,并实现 RPC 服务。

Proto gRPC 可以支持多种编程语言,如 C++, Java, Python 等。通过 Proto gRPC,开发者可以容易地实现高效、可扩展、跨平台的分布式系统。

如何定义 Proto gRPC 服务?

Proto gRPC 服务定义主要由两部分组成:服务定义和消息定义。

服务定义包括服务名称、服务方法及其参数和返回值等信息。消息定义则包括消息格式和字段信息。

以下是一个简单的 Proto gRPC 服务定义示例:

syntax = "proto3";

package example;

service ExampleService {
  // 定义方法 SayHello,参数为 RequestMessage,返回值为 ResponseMessage
  rpc SayHello (RequestMessage) returns (ResponseMessage) {}
}

// 定义请求消息格式
message RequestMessage {
  string name = 1;
}

// 定义响应消息格式
message ResponseMessage {
  string message = 1;
}
如何生成代码?

Proto gRPC 可以使用 Protobuf 编译器生成多种编程语言的代码。

以生成 C++ 代码为例,执行以下命令:

protoc -I=$SRC_DIR --cpp_out=$DST_DIR --grpc_out=$DST_DIR --plugin=protoc-gen-grpc=/usr/local/bin/grpc_cpp_plugin example.proto

其中,$SRC_DIR 为源码目录,$DST_DIR 为生成代码目录。

如何实现 Proto gRPC 服务?

在使用 gRPC 时,可以选择使用客户端 Stub 和服务端 Implementation。客户端 Stub 可以通过服务定义自动生成,而服务端实现则需要根据服务定义编写相应的代码。

以下是一个 C++ 的服务端实现示例:

#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>

#include "example.grpc.pb.h"

using example::ExampleService;
using example::RequestMessage;
using example::ResponseMessage;

// 实现服务端类
class ExampleServiceImpl final : public ExampleService::Service {
  // 实现定义的方法
  grpc::Status SayHello(grpc::ServerContext* context, const RequestMessage* request,
                      ResponseMessage* response) override {
    std::string prefix("Hello, ");
    response->set_message(prefix + request->name());
    return grpc::Status::OK;
  }
};

void RunServer() {
  std::string server_address("0.0.0.0:50051");
  ExampleServiceImpl service;

  grpc::ServerBuilder builder;
  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
  builder.RegisterService(&service);
  std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
  std::cout << "Server listening on " << server_address << std::endl;
  server->Wait();
}

int main(int argc, char** argv) {
  RunServer();
  return 0;
}
如何使用 Proto gRPC 客户端?

在生成客户端代码后,可以使用 Stub 类来调用服务端方法。

以下是一个 C++ 的客户端示例:

#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>

#include "example.grpc.pb.h"

using example::ExampleService;
using example::RequestMessage;
using example::ResponseMessage;

void RunClient() {
  std::string server_address("localhost:50051");
  RequestMessage request;
  ResponseMessage response;

  request.set_name("World");

  grpc::ClientContext context;
  std::unique_ptr<ExampleService::Stub> stub(ExampleService::NewStub(
      grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials())));

  grpc::Status status = stub->SayHello(&context, request, &response);

  if (status.ok()) {
    std::cout << "Response message: " << response.message() << std::endl;
  } else {
    std::cout << "RPC failed" << std::endl;
  }
}

int main(int argc, char** argv) {
  RunClient();
  return 0;
}
总结

Proto gRPC 是一种高效、可扩展、跨平台的分布式计算方案,可以通过 Proto gRPC 语言定义自动生成多种编程语言的代码,并使用 Stub 和 Implementation 实现客户端和服务端的交互。为开发高效的分布式系统提供了一种方便的选择。