grpc入门_helloWord
protocol buffers使用(简称pb)
pd文件中一般包含rpc服务定义以及消息定义
定义rpc服务
要定义一个服务,你必须在你的 .proto 文件中指定 service。然后在你的服务中定义 rpc 服务接口,指定请求的和响应的消息类型。具体定义如下:
rpc 服务名 (请求消息) returns (响应消息)
service R outeGuide
{ // (Method definitions not shown)
rpc RouteChat (stream RouteNote) returns (stream RouteNote) {}
}
具体示例如下:
定义消息
- 指定包名(pb避免冲突)
- 在.proto文件中定义消息,消息类似结构体形式有不同的字段组成(并且可以嵌套定义)。
- 消息中的每个字段有字段限制,字段类型,字段名,编号组成。
- required 必须填写
- optional 可选的
- repeated 重复的
syntax = "proto3";
package tutorial;
message Person
{
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
具体示例如下:
生成gRPC客户端和服务器端代码
利用 filename.proto 文件的定义来 生成 gRPC客户端和服务端接口,可以通过 grpcio-tools 工具来生成对应的python代码。
具体实现命令如下:
python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/route_guide.proto
- python -m grpc_tools.protoc : 用python来编译pd文件
- -I :指定源路径(pd文件)
- –python_out 、 --grpc_python_out :指定生成py文件的路径
- …/…/protos/route_guide.proto:指定源pd文件
以route_guide.proto为例,编译后的结果文件为 route_guide_pb2.py 和 route_guide_pb2_grpc.py
- route_guide_pb2.py :主要是调用 .proto文件中数据
- route_guide_pb2_grpc.py
- BetaRouteGuideServicer 实现了 pd文件中 service RouteGuide 服务中定义的接口
- RouteGuideStub:可以被客户端初始化一个可以调用服务的 一个实例,也叫存根
创建服务器
还是以 route_guide.proto 中最简单 GetFeature 为例。route_guide_server.py文件 中实现 route_guide_pb2.RouteGuide 服务接口的一个类:RouteGuideServicer,具体如下截图所示。
GetFeature 在定义的时候 就是接收 的是 Point 类型的请求消息,返回的是Feature类型消息。
其中self.db是一个json数据库,存放的是坐标信息和名称信息,具体信息如下:
创建客户端
客户端就可以执行不同的请求,通过服务端得到对应的响应消息。
- run方法 :初始化一个服务端实例 stub,并传递给 guide_get_ont_feature方法
- guide_get_feature方法:参数为 RouteGuideStub一个引用
- guide_get_one_feature方法 通过传递过来的Point消息,返回具体的响应消息。