Flask + gRPC 的麻烦
Flask + gRPC trouble
我有一个 flask API 应用程序 运行ning on Win by apache + mod_wsgi 插件。
我通过官方教程制作了一个grpc服务,创建了grpc服务器并将其运行设置为一个win服务(由一些win服务管理器提供,现在找不到了)。作为 grpc 客户端,我使用了一个烧瓶端点:
@web.route( '/services/<service_name>', methods=[ 'POST' ] )
def run_service( service_name ):
#flask response object, little desinged
resp = EmptyResp()
try:
chan = grpc.insecure_channel( 'my.secret.ip:6066' )
stub = rpc.gen.services_pb2_grpc.ServicesStub( chan )
#here just trying to find existed method, they got an Empty messasge, can't find a good solution
rpcResp = stub.__getattribute__( service_name )( rpc.gen.services_pb2.Empty() )
#my func to decorate response
resp.data = ObjResp( rpcResp.state )
except NameError as NErr:
print( NErr )
resp.status_code = 404
resp.data = ErrResp( 'Cannot get RPC generated files')
except AttributeError as AErr:
print( AErr )
resp.status_code = 404
resp.data = ErrResp( 'Where is no \'%s\' method or problem with RPC files' % service_name )
except grpc._channel._InactiveRpcError as ErrConnRPC:
print( ErrConnRPC )
resp.status_code = 503
resp.data = ErrResp( 'Cannot connect with RPC service' )
finally:
chan.close()
return resp
所以,问题是对那个端点的第一个请求是用 200 和 return 的 RPC 方法完成的。
但是对 api 的任何端点的进一步请求根本没有响应。没有 HTTP 超时错误,根本没有应用程序崩溃,没有尝试 运行 flask 或 gRPC 方法(我为此使用了 print() )。只是无限加载。仅通过重新启动 gRPC 和 Apache 服务进行修复。
我找不到任何部署 gRPC 服务器的解决方案,我的问题是:
1)2+请求没有响应的原因是什么;
2) 在 Win 上部署 gRPC 服务器的正确方法是什么?
3) [可选] 在这一行中:stub.__getattribute__( service_name )( rpc.gen.services_pb2.Empty() )
是否有更好的选择?
使用 apache + mod_wsgi 的 grpc 客户端存在问题 运行,原因似乎是进程的分叉方式(并且 grpc-python 在分叉时存在已知问题)
我有一个 flask API 应用程序 运行ning on Win by apache + mod_wsgi 插件。 我通过官方教程制作了一个grpc服务,创建了grpc服务器并将其运行设置为一个win服务(由一些win服务管理器提供,现在找不到了)。作为 grpc 客户端,我使用了一个烧瓶端点:
@web.route( '/services/<service_name>', methods=[ 'POST' ] )
def run_service( service_name ):
#flask response object, little desinged
resp = EmptyResp()
try:
chan = grpc.insecure_channel( 'my.secret.ip:6066' )
stub = rpc.gen.services_pb2_grpc.ServicesStub( chan )
#here just trying to find existed method, they got an Empty messasge, can't find a good solution
rpcResp = stub.__getattribute__( service_name )( rpc.gen.services_pb2.Empty() )
#my func to decorate response
resp.data = ObjResp( rpcResp.state )
except NameError as NErr:
print( NErr )
resp.status_code = 404
resp.data = ErrResp( 'Cannot get RPC generated files')
except AttributeError as AErr:
print( AErr )
resp.status_code = 404
resp.data = ErrResp( 'Where is no \'%s\' method or problem with RPC files' % service_name )
except grpc._channel._InactiveRpcError as ErrConnRPC:
print( ErrConnRPC )
resp.status_code = 503
resp.data = ErrResp( 'Cannot connect with RPC service' )
finally:
chan.close()
return resp
所以,问题是对那个端点的第一个请求是用 200 和 return 的 RPC 方法完成的。 但是对 api 的任何端点的进一步请求根本没有响应。没有 HTTP 超时错误,根本没有应用程序崩溃,没有尝试 运行 flask 或 gRPC 方法(我为此使用了 print() )。只是无限加载。仅通过重新启动 gRPC 和 Apache 服务进行修复。
我找不到任何部署 gRPC 服务器的解决方案,我的问题是:
1)2+请求没有响应的原因是什么;
2) 在 Win 上部署 gRPC 服务器的正确方法是什么?
3) [可选] 在这一行中:stub.__getattribute__( service_name )( rpc.gen.services_pb2.Empty() )
是否有更好的选择?
使用 apache + mod_wsgi 的 grpc 客户端存在问题 运行,原因似乎是进程的分叉方式(并且 grpc-python 在分叉时存在已知问题)