最近在做微服务这一块,后端与java合作,自己是python的,所以考虑使用grpc,一点考虑是grpc是http2.0,另一点考虑是老大要求的:)
初步尝试是在python脚本中与java对接接口,经常官方文档的一顿学习,成功调通了接口
https://grpc.io/docs/quickstart/python.html
不过在教程里clone的那个项目实在是大,不确定哪些是需要的,经过测试后给出需要的:
- grpcio==1.4.0
- grpcio-tools==1.4.0
- xxx.proto 没错,只需要这么一个文件
- 编译xxx.proto的命令
python -m grpc_tools.protoc -I./protos --python_out=. --grpc_python_out=. ./protos/xxx.proto
这里解释一下,python(不解释) -m(也不解释) grpc_tools.protoc(上面安装的三方)
-I./protos(标识当前目录下的protos文件夹,xxx.proto需要在这个文件夹中) --python_out=.(当前目录生成输出文件) --grpc_python_out=.(当前目录生成grpc文件) ./protos/xxx.proto(xxx.proto的相对路径)
在配置好grpc的xxx.proto之后要保证java那边的这个文件要一样(并不是全部,service开始需要完全相同)
运行命令后会生成xxx_pb2.py 和 xxx_pb2_grpc.py两个文件,接下来重点来了(拍桌子)
我既想用django的model又想用grpc该怎么办呢,django是一个服务,grpc是一个服务,直接暴力把grpc代码加入django是没办法使用models和views的。
解决方法就是在greeter_server.py中(这个文件不知道请看上面的链接)加载django,大致如下:
import os
from concurrent import futures
import grpc
import time
import bus_pb2
import bus_pb2_grpc
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxx.settings")
django.setup()
from enterprise.views import enterprise_list, add_enterprise
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Greeter(bus_pb2_grpc.BusInfoServicer):
def BusMethod(self, request, context):
if request.method == 'e':
response = enterprise_list(request)
return bus_pb2.BusReply(data=response['data'], code=response['code'], message=response['msg'])
elif request.method == 'a':
response = add_enterprise(request)
return bus_pb2.BusReply(message=response['msg'])
return bus_pb2.BusReply(message='')
if __name__ == '__main__':
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
bus_pb2_grpc.add_BusInfoServicer_to_server(Greeter(), server)
server.add_insecure_port('0.0.0.0:50051')
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
运行时只需要运行该脚本即可,django服务不必启用