与另一个内部微服务交互时如何防御?

How defensive to be when interacting with another internal microservice?

在这个场景中有两个 HTTP 微服务:

  1. 为客户端提供数据的public服务
  2. 验证对 public 服务的调用的内部微服务

服务 1 调用服务 2,要求它验证客户端提供给它的令牌。

协议("contract")是服务 2 应该回复 200 OK 和 JSON 关于认证用户的内容。

在服务 1 中,如果它收到响应 200 OK,是否值得进一步验证响应?

例如,响应的JSON主体被解析为一个对象。检查该对象是否已正确实例化而不是设置为 null 是否有价值?还是应该留给集成测试?

严格来说,200 仅表示请求已成功处理。从业务角度来看,这与调用的实际结果无关。

您实际上依赖 "we will throw an exception or otherwise fail the call if the user is not authenticated" 的约定来验证用户。

根据惯例,您可能会遇到这样一种情况:用户未通过身份验证但调用仍被成功处理。

从这个角度来看,让 service2 return 响应可能是值得的,然后可以询问该响应以关闭此循环。

或者,您可以让客户端直接调用身份验证服务,检索令牌,然后在任何其他请求中出示此令牌。这意味着 service1 不再负责知道调用者已通过身份验证。

The question is whether or not to then test in Service 1 each time the response is received

抱歉,我似乎有点误解了问题的精神。

我有点困惑 - 你是在问,如果被测系统是 service1 那么 service2 的任何响应是否也应该是该测试的一部分?

我想说你必须进行一些测试来证明 sercvice2 响应询问逻辑是正确的,但这可以在单元测试级别完成。我认为您不需要针对已部署的服务实例进行测试 运行,这本质上更多地是关于边界而不是内部的服务行为。

嗯,你的方法还不错!

某些 HTTP 状态代码是为格式错误的请求等情况保留的。但在您的情况下,您要求 Service2 提供 return 令牌信息!如果该令牌存在(您指定正确),则 Service2 必须 return 200 OK。现在你只需要指定如果令牌不再有效或者它不存在会发生什么(或者对这两种情况一视同仁......)。如果您指定,如果 Service2 不知道令牌或令牌已过期,则 Service2 必须 return 404 Not found,那么(在大多数情况下)Service1 不需要再继续了!解析状态代码在几乎任何 language/environment 中都很便宜,但是在成功和错误情况下强制反序列化内容相比之下非常昂贵。身份验证需要快速 - 所以我会在这里获取状态代码!

关键是,必须在某处指定此行为! (我们追求夸张的定义!)