GRPC-网络+wsgi
grpcWSG的Python项目详细描述
GRPC wsgi
基于python的wsgi标准的grpc web实现。
为什么?
grpc有很多优点,但在某些环境中使用起来很困难。GRPC WSGI使得当您需要使用HTTP/1.1负载平衡器或代理时,很容易集成GRPC,或者希望将GRPC集成到现有的服务中,例如Django或烧瓶应用程序,这些应用程序大部分时间讲不同的协议。
与谷歌相比,这个实现有两个主要功能。
- 通过GRPC Web的HTTP/1.1兼容性,即使对于使用Protobuf的一元流RPC也是如此。不需要像特使这样的边车代理过程。
- 在同一个套接字上运行grpc和其他http文件。
怎么做?
GRPC WSGI的设计要求对现有的WSGI或GRPC代码库进行最少的更改。
服务器
通常,wsgi应用程序(例如您最喜欢的django应用程序)会调用诸如
fromdjango.core.wsgiimportget_wsgi_applicationapplication=get_wsgi_application()
这样你的应用服务器(uwsgi,gunicorn等)就知道你的代码在哪里了。
要将grpc wsgi添加到像上面这样的应用程序中,您需要做的就是启用它。
fromdjango.core.wsgiimportget_wsgi_applicationfromgrpcWSGI.serverimportgrpcWSGIapplication=get_wsgi_application()application=grpcWSGI(application)
grpcwsgi应用程序对象也碰巧与正常的grpc.server接口兼容。 因此,您所需要做的就是连接您的rpc并开始拨打您的新服务,这是通常的grpc设置,例如
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(),application)
现在您有一个组合的http/1.1django+grpc应用程序,所有这些都在一个端口下。
客户
设置客户机同样非常简单,与标准grpc调用类似。
我们没有使用grpcs本机insecure_channel
api,而是使用grpcWSGI.client.insecure_web_channel
提供一个https://github.com/kennethreitz/requests支持的客户端通道到grpc web服务器。例如
importgRPCWSGI.clientwithgrpcWSGI.client.insecure_web_channel(f"http://localhost:8080")aschannel:stub=helloworld_pb2_grpc.GreeterStub(channel)print(stub.SayHello("world"))
待办事项
- 错误处理
- 压缩?
- 基准?
- 把球衣清理干净。
- streamstream/stream一元rpc?
- 重试、缓存和其他客户端选项。
- Django、烧瓶等的生活质量集成。
- 应用程序/GRPC Web文本支持?我在乎IE10吗?json有时可能比protobuf快……
- aiohttp/grpc aiohttp/asgi集成?
- 我的注释?https://github.com/dropbox/mypy-protobuf已经很好了。
- 使用GRPC软件包中的更多ABC和其他标准资料
- 支持模糊可靠的分块编码
- 某种元类魔术,使您更容易确保实际实现了服务器接口