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文件, 如下:
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
c
lass
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
};
上面省略了一些细节,只把最关键的部分提取出来了.
这两部分如何使用,后面会继续讲解
- EchoService类和EchoService_Stub类:
- 虚函数和抽象类和接口
- 类和对象的概念和区别
- 继承和组合、抽象类和接口
- final和抽象类和接口
- 类和对象、封装和继承
- 类和对象的属性和方法
- String和StringBuilder类方法和用法
- 接口和抽象类概念和区别
- 类和对象的定义和使用
- 定时器和BOM对象和Date类
- 类和类装入
- 类和元类
- 伪类和类
- 类和元类
- 类和派生类
- 类和元类
- 类和对象
- Ensemble方法
- 浅谈Uber与滴滴快的提供差异化服务带来的商业模式思考
- /proc/iomem和/proc/ioports
- 关于mysql数据库连接超时的解决办法
- mini2440硬件篇之SDRAM
- EchoService类和EchoService_Stub类:
- mysql-connector-java 5.1.35 maven找不到源代码包
- android开发之应用打包签名混淆流程
- 简易文本编辑器
- Ubuntu14.04下配置SSH以支持远程putty登录
- POJ 2888 Magic Bracelet(ploya)
- POJ 2480 Longge's problem (欧拉函数+乘性函数)
- 黑马程序员--IOS学习日记:07--内存管理之引用计数器
- sql批量更新