google protobuf 定义服务(service)

本文介绍了如何在protobuf中定义RPC服务,包括服务接口的创建、C++代码生成和服务选项的使用。通过定义.proto文件,可以自动生成抽象服务接口和存根实现,支持不同RPC系统的集成。同时,文章还讲解了protobuf的自定义选项,如优化生成代码的速度或大小,以及如何定义和使用自定义选项。
摘要由CSDN通过智能技术生成

l  定义服务(Service)

如果想要将消息类型用在RPC(远程方法调用)系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器将会根据所选择的不同语言生成服务接口代码及存根。如,想要定义一个RPC服务并具有一个方法,该方法能够接收 SearchRequest并返回一个SearchResponse,此时可以在.proto文件中进行如下定义:

service SearchService {

  rpc Search (SearchRequest) returns (SearchResponse);

}

 

protocol编译器将产生一个抽象接口SearchService以及一个相应的存根实现。存根将所有的调用指向RpcChannel,它是一 个抽象接口,必须在RPC系统中对该接口进行实现。如,可以实现RpcChannel以完成序列化消息并通过HTTP方式来发送到一个服务器。换句话说, 产生的存根提供了一个类型安全的接口用来完成基于protocolbuffer的RPC调用,而不是将你限定在一个特定的RPC的实现中。C++中的代码 如下所示:

using google::protobuf;

protobuf::RpcChannel* channel;
protobuf::RpcController* controller;
SearchService* service;
SearchRequest request;
SearchResponse response;

void DoSearch() {
  // You provide classes MyRpcChannel and MyRpcController, which implement
  // the abstract interfaces protobuf::RpcChannel and protobuf::RpcController.
  channel = new MyRpcChannel("somehost.example.com:1234");
  controller = new MyRpcController;
  

// The protocol compiler generates the SearchService class based on the
  // definition given above.
 

service = new SearchService::Stub(channel);
  // Set up the request.
  request.set_query("protocol buffers");

  // Execute the RPC.
  service->Search(controller, request, response, protobuf::NewCallback(&Done));
}

void Done() {
  delete service;
  delete channel;
  delete controller;
}

所有service类都必须实现Service接口,它提供了一种用来调用具体方法的方式,即在编译期不需要知道方法名及它的输入、输出类型。在服务器端,通过服务注册它可以被用来实现一个RPC Server。

using google::protobuf;

class ExampleSearchService : public SearchService {
 public:
  void Search(protobuf::RpcController* controller,
              const SearchRequest* request,
              SearchResponse* response,
              protobuf::Closure* done) {
    if (request->query() == "google") {
      response->add_result()->set_url("http://www.google.com");
    } else if (request->query() == "protocol buffers") {
      response->add_result()->set_url("http://protobuf.googlecode.com");
    }
    done->Run();
  }
};

int main() {
  // You provide class MyRpcServer.  It does not have to implement any
  // particular interface; this is just an example.
  MyRpcServer server;

  protobuf::Service* service = new ExampleSearchService;
  server.ExportOnPort(1234, service);
  server.Run();

  delete service;
  return 0;
}

Protobuf是一种由Google开发的数据描述语言,它是一种轻便高效的结构化数据存储格式,用于结构化数据的序列化和反序列化。它可以用于通讯协议、数据存储等领域,具有语言无关、平台无关和可扩展的特点。Protobuf使用.proto文件来定义数据结构和消息格式,并通过protoc编译器将.proto文件编译成不同编程语言的代码。 在.proto文件中,可以使用以下语法进行定义和描述: - 语法规则:.proto文件由多个消息和服务组成,每个消息由字段组成,每个字段包括名称、类型和标签等。 - 消息定义:使用message关键字定义消息,可以嵌套定义其他消息。 - 字段定义:使用字段类型和字段名称定义消息的字段,可以指定字段的标签和默认值。 - 枚举定义:使用enum关键字定义枚举类型,可以指定枚举值和默认值。 - 服务定义:使用service关键字定义服务服务由多个方法组成,每个方法包括名称、输入消息类型和输出消息类型等。 除了上述基本语法外,还有一些高级用法: - 字段规则:可以使用required、optional或repeated关键字定义字段的规则。 - 扩展字段:可以使用extensions关键字定义扩展字段,允许在不修改.proto文件的情况下添加新的字段。 - 自定义选项:可以使用option关键字定义定义选项,用于指定一些特定的配置信息。 以上是Protobuf的基本语法,你可以根据需要在.proto文件中进行定义和描述。如果你有更具体的问题,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值