微服务HttpStatus代码

时间:2019-07-04 00:35:03

标签: api microservices

这是与微服务架构中各种API之间的通信信号传递的良好实践有关的问题。

我正面临以下“事件”:

  1. 一个微服务已关闭(实际上)
  2. 一个微服务正在使用错误的URL呼叫另一个
  3. 一个微服务正在使用正确的URL但错误的参数(例如查询参数或POST正文验证失败)调用另一个微服务
  4. 一个微服务正在向另一个微服务索要资源,并且该特定资源无法在数据库中找到(比如说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好

有什么想法吗?对于临时解决方案,我不是100%满意。想要做得更好。我知道这里有两种动物:一种是客户端-服务器信号传输,另一种是与数据有关(有效载荷丢失等)

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

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

  

一个微服务正在使用正确的URL调用另一个,但是错误   参数(例如查询参数,或POST主体验证失败)-我也可以将BAD_REQUEST(400)与验证有效载荷消息一起使用

有两个变体。例如,一种方法是在仅支持PATCH的资源上调用PUT。在这种情况下,有一个状态码,不允许使用405方法。同样,这里通常不受您的控制-如果您未针对给定资源定义请求的操作,则大多数服务框架都会自动将此状态代码返回给使用者。

另一个变体(如您的示例)是不正确的查询参数。同样,在这种情况下,大多数框架会自动返回400错误请求(或422无法处理)。如果提供了查询参数,但以其他方式无效,则400 Bad请求是适当的。

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

  

一个微服务正在向另一个微服务索要资源,   在数据库中找不到特定的资源(比如说findById类型)-我也可以将NOT_FOUND(404)与RESOURCE_NOT_FOUND消息一起使用

是,404未找到是正确的状态代码。

  

其他所有可能是INTERNAL_SERVER_ERROR的原因是未捕获   

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

  

200好,好东西

200在许多情况下都可以。但是,如果添加了某些内容,则考虑“ 201已创建”,如果呼叫无效,则考虑“ 202已接受”。就像您创建资源一样,没有任何更改,因为资源已经存在。

答案 1 :(得分:2)

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

HTTP Status Map by Restlet

在图像的右下方,您可以看到很好的摘要。

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

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

例如,我们几乎在同一时间多次获得相同的请求。这导致我们的elasticsearch中的条目重复。我们添加了一个Servlet过滤器,该过滤器捕获重复项并返回409 CONFLICT状态代码。

例如,对409的描述:

  

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