gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Python 的 gRPC 使用。由于 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具备良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端能够充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、下降 TCP 的链接次数、节省CPU的使用等java
gRPC 默认使用 protocol buffers,这是 Google 开源的一种轻便高效的结构化数据存储格式,能够用于结构化数据串行化,或者说序列化。它很适合作数据存储或 RPC 数据交换格式。python
官方参考文档git
$ pip install grpcio
$ pip install protobuf
$ pip install grpcio-tools
先来看一个很是简单的例子。假设你想定义一个“搜索请求”的消息格式,每个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。能够采用以下的方式来定义消息类型的.proto文件了:github
syntax = "proto3"; // 声明使用 proto3 语法 message SearchRequest { string query = 1; // 每一个字段都要指定数据类型 int32 page_number = 2; // 这里的数字2 是标识符,最小的标识号能够从1开始,最大到2^29 - 1, or 536,870,911。不可使用其中的[19000-19999] int32 result_per_page = 3; // 这里是注释,使用 // }
[1,15]以内的标识号在编码的时候会占用一个字节。[16,2047]以内的标识号则占用2个字节。因此应该为那些频繁出现的消息元素保留 [1,15]以内的标识号。切记:要为未来有可能添加的、频繁出现的标识号预留一些标识号。shell
所指定的消息字段修饰符必须是以下之一:后端
一个标量消息字段能够含有一个以下的类型——该表格展现了定义于.proto文件中的类型,以及与之对应的、在自动生成的访问类中定义的类型:服务器
当一个消息被解析的时候,若是被编码的信息不包含一个特定的singular元素,被解析的对象锁对应的域被设置位一个默认值,对于不一样类型指定以下:架构
你能够在其余消息类型中定义、使用消息类型,在下面的例子中,Result消息就定义在SearchResponse消息内,如:框架
message SearchResponse { message Result { string url = 1; string title = 2; repeated string snippets = 3; } repeated Result results = 1; }
在 message SearchResponse 中,定义了嵌套消息 Result,并用来定义SearchResponse消息中的results域。ide
当用protocol buffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码能够操做在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。
使用如下命令编译:
$ python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./hello.proto
生成了两个文件:
建立和运行 Greeter 服务能够分为两个部分:
实现咱们服务定义的生成的服务接口:作咱们的服务的实际的“工做”的函数。
首先运行服务端代码
python server/main.py
而后运行客户端代码
python client/main.py
输出: >>> Greeter client received: Hello, goodspeed!