1.前言
gRPC是一个开源的高性能并且能在任何环境中运行的RPC框架,其采用 protocol buffer
:
protocol buffer
是一个用于结构化数据序列化的一个灵活的、有效率的自动化机制,类似于XML(但比其更简单、小巧且简单),对于某个服务需要定义的数据结构,可以使用protocol buffer
(proto3
)来进行定义,即根据protocol buffer language
来定义你的protocol buffer data
最后再利用protocol buffer
编译定义的 .proto
文件生成客户端和服务端代码,本文将举一个小例子进行介绍,且默认站在python的角度来编写代码
2.实践
假设有这样一个需求,将客户端传来的某个字符串转化为小写,那么,首先从定义数据结构开始,暂时先新建如下结构的项目:
1
2
3
|
demo
└── proto
└── lower.proto
|
接下来将编写proto
文件,本例使用proto3
语法进行编写,protobuf
定义的语法请看这里
lower.proto
文件内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
syntax = "proto3";
package lower;
service Lower {
rpc Lower (LowerRequest) returns (LowerResult) {
}
}
message LowerRequest {
string message = 1;
}
message LowerResult {
string lower_message = 1;
}
|
定义一个服务Lower
,其接受一个字符串消息并返回小写的字符串消息,编写完毕,下面进行编译,创建文件proto_compile.py
,并安装相关的包:
1
2
|
pip install grpcio
pip install grpcio-tools
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# script proto_compile.py
from grpc_tools import protoc
# 或者在项目根目录运行:
# python -m grpc_tools.protoc -I. --python_out=../ --grpc_python_out=../ ./cal.proto
protoc.main(
(
'',
'-Iproto',
'--python_out=.',
'--grpc_python_out=.',
'proto/lower.proto',
)
)
|
运行后,项目结构如下:
1
2
3
4
5
6
|
demo
├── lower_pb2_grpc.py # 编译生成的文件
├── lower_pb2.py # 编译生成的文件
├── proto
│ └── lower.proto
└── proto_compile.py
|
最后编写客户端以及服务端脚本lower_client.py
、lower_server.py
,内容分别如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# lower_server.py
import time
import grpc
from concurrent import futures
import lower_pb2, lower_pb2_grpc
_TIME_WAIT = 10
class Lower(lower_pb2_grpc.LowerServicer):
def Lower(self, request, context):
return lower_pb2.LowerResult(lower_message=request.message.lower())
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
lower_pb2_grpc.add_LowerServicer_to_server(Lower(), server)
server.add_insecure_port('[::]:50052')
server.start()
try:
while True:
time.sleep(_TIME_WAIT)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
# lower_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import lower_pb2, lower_pb2_grpc
def run():
channel = grpc.insecure_channel("localhost:50052")
stub = lower_pb2_grpc.LowerStub(channel)
response = stub.Lower(lower_pb2.LowerRequest(message="HELLO WORLD!"))
print("Message result received: %s" % response.lower_message)
if __name__ == '__main__':
run()
|
此时文件目录结构如下:
1
2
3
4
5
6
7
8
|
demo
├── lower_client.py
├── lower_pb2_grpc.py
├── lower_pb2.py
├── lower_server.py
├── proto
│ └── lower.proto
├── proto_compile.py
|
先运行lower_server.py
,再运行lower_client.py
,就会看到终端有结果输出:
1
|
Message result received: hello world!
|
可以看到,返回小写字符,demo
演示完毕
3.最后
以下是我了解gRPC
过程中收集的一些资料: