【问题标题】:Microservices HttpStatus Codes微服务 Http 状态码
【发布时间】:2019-07-31 05:34:15
【问题描述】:

这是一个与在微服务架构中的各种 API 之间发出通信信号的良好实践相关的问题。

我正面临以下“事件”:

  1. 一个微服务已关闭(物理上)
  2. 一个微服务使用错误的 URL 调用另一个微服务
  3. 一个微服务正在使用正确的 URL 但错误的参数调用另一个微服务(例如查询参数,或 POST 正文未通过验证)
  4. 一个微服务正在向另一个微服务请求资源,但在 DB 中找不到该特定资源(假设是 findById 类型)

我需要找到一种更好的方法,通过使用 HTTP 状态代码和各种有效负载来详细说明正在发生的事情。

例如:

  1. 对于案例 1,我可以将 NOT_FOUND (404) 与有效负载一起使用:API_DOWN
  2. 对于案例 2,我可以使用 BAD_REQUEST (400)
  3. 对于案例 3,我还可以将 BAD_REQUEST (400) 与验证有效负载消息一起使用
  4. 对于案例 4,我还可以将 NOT_FOUND (404) 与 RESOURCE_NOT_FOUND 消息一起使用
  5. 如果由未捕获的异常引起,其他所有内容都可能是 INTERNAL_SERVER_ERROR。
  6. 200 OK 好东西

有什么想法吗?我对我的临时解决方案不是 100% 满意。想让它变得更好。我理解这里有两种动物:一种是客户端-服务器信号,另一种与数据有关(有效负载丢失等)

【问题讨论】:

    标签: api microservices


    【解决方案1】:

    一个微服务已关闭(物理上) - 我可以将 NOT_FOUND (404) 与有效负载一起使用:API_DOWN

    在这种情况下,您将无法控制消费者收到的响应代码。根据托管和管理服务的方式,您可能会收到 500 服务器错误、502 网关错误、503 不可用或 504 超时中的任何一种。但是,您将获得什么取决于您的基础架构和堆栈设置。

    一个微服务使用错误的 URL 调用另一个微服务 - 我可以使用 BAD_REQUEST (400)

    这在语义上与上述情况相同。尝试调用不可用的服务与尝试调用不存在的服务之间几乎没有区别。

    一个微服务使用正确的 URL 调用另一个微服务但错误 参数(例如查询参数,或 POST 正文验证失败) - 我也可以使用 BAD_REQUEST (400) 和验证有效负载消息

    这有几个变种。例如,一种是在仅支持 PATCH 的资源上调用 PUT。在这种情况下,有一个状态码,它是 405 Method not allowed。同样,您通常无法控制这里 - 如果您没有针对给定资源定义请求的操作,大多数服务框架会自动将此状态代码返回给消费者。

    另一个变体(如您的示例)是不正确的查询参数。同样,在这种情况下,大多数框架都会自动返回 400 Bad request(或 422 Unprocessable)。如果提供了查询参数但在某些其他方面无效,则 400 Bad request 是合适的。

    注意:通常不适合为“无效”路径参数返回 400 Bad 请求。

    一个微服务正在向另一个微服务请求资源,并且 在数据库中找不到特定资源(可以说是 findById 类型) - 我也可以使用 NOT_FOUND (404) 和 RESOURCE_NOT_FOUND 消息

    是的,404 Not found 是正确的状态码。

    如果由未捕获引起,其他一切都可能是 INTERNAL_SERVER_ERROR 例外。

    不一定。我经常使用的一个状态代码是 409 Conflict,用于那些输入正常但导致某种问题(如重复实体)的实例。

    200 OK 的好东西

    200 在许多情况下都可以。但是,如果添加了某些内容,请考虑 201 Created,如果调用无效(例如,如果您尝试创建资源但资源已经存在),则考虑 202 Accepted,或者如果您想明确指出不返回,请考虑 204 No Content类型应该是预期的。

    【讨论】:

    • 总体来说是一个不错的答案,但405 Method Not Allowed 不适合错误的查询字符串或正文内容;它指的是发送错误的方法,例如POST 仅允许 GET 时。有时,422 Unprocessable Entity 可能是合适的,但通常你只需要400 Bad Request
    • @IMSoP true - 我误解并认为 OP 指的是例如在仅支持 PATCH 的资源上调用 PUT。
    【解决方案2】:

    只是@tom-redfern 已经说过的一个小补充。 有一张我喜欢的漂亮地图。看起来像是一个地下计划。

    HTTP Status Map by Restlet

    在图片的右下方,您有很好的摘要。

    • 代码 100:信息性
    • 代码 200:成功
    • 代码 300:重定向
    • 代码 400:客户端错误
    • 代码 500:服务器错误

    您可以将鼠标悬停在状态代码上并获得简短的说明。也许这对您的实施有所帮助。

    例如,我们几乎在同一时间多次收到相同的请求。这会导致我们的弹性搜索中出现重复的条目。我们添加了一个 servlet 过滤器,用于捕获重复项并返回 409 CONFLICT 状态代码。

    409 的描述在示例中:

    表示由于冲突无法处理请求 在请求中,如多个编辑冲突的情况下 更新。

    【讨论】:

    • 虽然这很漂亮,但我不确定布局实际传达的是什么;路口名称和位置似乎完全是任意的。如果您想要可爱的 HTTP 状态列表,我会选择 http.cat
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多