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文件, 如下:
05 | required string message = 1 ; |
10 | required string response = 1 ; |
15 | rpc Echo(EchoRequest) returns (EchoResponse); |
解释一下这个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类:
01 | c lass EchoService : public ::google::protobuf::Service { |
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); |
15 | class EchoService_Stub : public EchoService { |
17 | void Echo(::google::protobuf::RpcController* controller, |
18 | const ::echo::EchoRequest* request, |
19 | ::echo::EchoResponse* response, |
20 | ::google::protobuf::Closure* done); |
上面省略了一些细节,只把最关键的部分提取出来了.
这两部分如何使用,后面会继续讲解