EchoService类和EchoService_Stub类:

来源:互联网 发布:棉花期货天狼星软件 编辑:程序博客网 时间:2024/04/30 02:54

3.5.1 接口

一个简单的接口定义:

service Foo {
rpc Bar(FooRequest) returns(FooResponse);
}

ProtocolBuffer的编译器会生成类 Foo 来展示这个服务。 Foo 将会拥有每个服务定义的方法。在这种情况下 Bar 方法的定义是:

def Bar(self,rpc_controller,request,done)

参数等效于 Service.CallMethod() ,除了隐含的 method_descriptor 参数。

这些生成的方法被定义为可以被子类重载。缺省实现只是简单的调用 controller.SetFailed() 而抛出错误信息告之尚未实现。然后调用done回调。在实现你自己的服务时,你必须继承生成类,然后重载各个接口方法。

Foo继承了 Service 接口。ProtocolBuffer编译器会自动声响相关的实现方法:

· GetDescriptor :返回服务的 ServiceDescriptor 。

· CallMethod :检测需要调用哪个方法,并且直接调用。

· GetRequestClass 和 GetResponseClass :返回指定方法的请求和响应类。

13.5.2 存根(Stub)

ProtocolBuffer编译器也会为每个服务接口提供一个存根实现,用于客户端发送请求到服务器。对于Foo服务,存根实现是 Foo_Stub 。

Foo_Stub 是Foo的子类,他的构造器是一个 RpcChannel 。存根会实现调用每个服务方法的 CallMethod() 。

ProtocolBuffer哭并不包含RPC实现。然而,它包含了你构造服务类的所有工具,不过选择RPC实现则随你喜欢。你只需要提供 RpcChannel 和 RpcController 的实现即可。



1) 定义协议
首先需要为这个service定义proto文件, 如下:

01package echo;
02 
03message EchoRequest
04{
05  required string message = 1;
06};
07 
08message EchoResponse
09{
10  required string response = 1;
11};
12 
13service EchoService
14{
15  rpc Echo(EchoRequest) returns (EchoResponse);
16};

解释一下这个proto文件中做的事情,它定义了一个package: echo, 这个package中有service:EchoService,而这个service下只有一个服务:Echo, 它的请求由EchoRequest结构体定义,回复由EchoResponse定义.
package相当于是C++中namespace的概念,有些package中可能会提供相同名字的service,为了解决命名冲突,就引入了package这个概念.

2) 对应的C++文件
使用protobuf自带的编译proto文件编译器,可以生成对应的pb.h和pb.cc文件.具体细节可以参考protobuf关于这部分的参考文档.

所生成的C++文件,都会在namespace echo中,就是前面提到的package概念.对于service EchoService而言,会对应的生成两个类:EchoService类和EchoService_Stub类:

01class EchoService : public ::google::protobuf::Service{
02  // ....
03  EchoService_Stub(::google::protobuf::RpcChannel* channel);
04  virtual void Echo(::google::protobuf::RpcController* controller,
05                       const ::echo::EchoRequest* request,
06                       ::echo::EchoResponse* response,
07                       ::google::protobuf::Closure* done);
08  void CallMethod(const ::google::protobuf::MethodDescriptor* method,
09                  ::google::protobuf::RpcController* controller,
10                  const ::google::protobuf::Message* request,
11                  ::google::protobuf::Message* response,
12                  ::google::protobuf::Closure* done);
13};
14 
15class EchoService_Stub : public EchoService {
16//...
17  void Echo(::google::protobuf::RpcController* controller,
18                       const ::echo::EchoRequest* request,
19                       ::echo::EchoResponse* response,
20                       ::google::protobuf::Closure* done);
21};

上面省略了一些细节,只把最关键的部分提取出来了.
这两部分如何使用,后面会继续讲解

0 0
原创粉丝点击