将 gRPC 错误代码映射到 HTTP 错误代码

Jac*_*ack 4 python google-cloud-platform nginx-reverse-proxy grpc-python

我的 Web 应用程序向可扩展服务代理(ESP) 发出 HTTP 请求,后者又委托给gRPC 服务器(用 Python 编写)。忽略Android和iOS客户端,架构是:

在此输入图像描述

ESP 是一个nginx 反向代理

gRPC 服务器(参考架构中的“您的代码”)可能会引发异常,在这种情况下,我使用context.abort引发异常并以非正常状态终止 RPC:

try:
  # Do something that could fail.
except ValueError as e:
  context.abort(grpc.StatusCode.DATA_LOSS, str(e))
Run Code Online (Sandbox Code Playgroud)

虽然可以使用set_codeset_details,但它们仍然会导致 HTTP 状态为 200 OK。

有两个问题:

  1. gRPC状态代码由 ESP 容器(nginx 代理)转换为通用500 Internal Server Error.

  2. 随附的详细信息已被删除。

  3. 2. 组合意味着 Web 客户端至多有一个500 Internal Server Error针对gRPC 服务器引发的所有异常的情况。

最终,我不明白如何将更多信息(理想情况下,自定义)错误返回给网络客户端。

Way*_*ang 5

grpc 状态代码::DATA_LOSS,被转换为 HTTP 代码 500。代码在这里

grpc 状态详细信息(状态代码和错误消息)以 JSON 格式在响应正文中发回。代码在这里