|
activate C:\python_Re\Python+Spyder\anaconda3
pip install grpcio
pip install grpcio-tools
pip install protobuf1. RPC 和 GRPC
1.1 RPC(Remote Procedure Call Protocol)
- RPC 是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上的函数
由于不在一个内存空间,不能直接调用,需要通过网络来飙到调用的语义和传达调用的数据
在A服务内,调用B服务的ticket服务中的get方法,那么在a服务里,直接调用b.ticket.get()来直接调用
1.2 GRPC
- gRPC 是一款高性能、开源的RPC框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等)
- grpc传输协议传输的数据类型为protobuf数据.ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
- 所以grpc都是和protobuf一块使用
1.3 Protobuf
2. GRPC例程
目录
2.1 定义gRPC的接口
syntax = "proto3";
package grpcLab;
service Bili{rpc HelloGrpc(HelloGrpcReq) returns (HelloGrpcReply){}}
message HelloGrpcReq{
string name = 1;
int32 age = 2;
}
message HelloGrpcReply{
string result = 1;
}2.2 生成Python的代码
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=. ./hello_GRPC.proto利用编译工具把proto文件转化成py文件,直接在当前文件目录下运行上述代码即可。
- -I 指定proto所在目录
- -m 指定通过protoc生成py文件
- --python_out指定生成py文件的输出路径
- hello.proto 输入的proto文件
执行上述命令后,生成hello_GRPC_pb2.py 和hello_GRPC_pb2_grpc.py这两个文件。
2.3 服务端
- 在服务器端代码中需要实现proto文件中定义的服务接口(FormatData),并重写处理函数(DoFormat),将重写后的服务类实例化以后添加到grpc服务器中.
#coding:utf-8
import grpc
import hello_GRPC_pb2 as pb2
import hello_GRPC_pb2_grpc as pb2_grpc
import time
from concurrent import futures #多线程
class Bili(pb2_grpc.BiliServicer):#和proto文件中花括号外的Bili一致
def HelloGrpc(self, request, context):
name = request.name
age = request.age
result = f'my name is {name}, i am {age} years old'#f表示字串内支持大括号的表达式
return pb2.HelloGrpcReply(result = result)
#启动服务
def run():
# 最大的线程数量
grpc_server = grpc.server(
futures.ThreadPoolExecutor(max_workers=4)
)
#注册Bili这个类到GRPC里面
pb2_grpc.add_BiliServicer_to_server(Bili(),grpc_server)
#绑定ip
grpc_server.add_insecure_port('0.0.0.0:5000')
print('server will start at 0.0.0.0:5000')
#启动
grpc_server.start()
#用循环让它一直运行,直到有键盘输入退出服务
try:
while 1:
time.sleep(3600)
except KeyboardInterrupt:
grpc_server.stop(0)
if __name__ == '__main__':
run()
2.4 客户端
#coding:utf-8
import grpc
import hello_GRPC_pb2 as pb2
import hello_GRPC_pb2_grpc as pb2_grpc
def run():
# 先定义一个频道
conn = grpc.insecure_channel('localhost:5000')
#设定客户端的频道
client = pb2_grpc.BiliStub(channel=conn)
response = client.HelloGrpc(pb2.HelloGrpcReq(
name='Diamon',
age=27
))
print(response.result)
if __name__ == '__main__':
run()
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|