EchoService类和EchoService_Stub类:

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文件, 如下:

01 package echo;
02  
03 message EchoRequest
04 {
05   required string message = 1;
06 };
07  
08 message EchoResponse
09 {
10   required string response = 1;
11 };
12  
13 service 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类:

01 class 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  
15 class 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 };

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值