与另一个内部微服务交互时如何防御?
How defensive to be when interacting with another internal microservice?
在这个场景中有两个 HTTP 微服务:
- 为客户端提供数据的public服务
- 验证对 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 中都很便宜,但是在成功和错误情况下强制反序列化内容相比之下非常昂贵。身份验证需要快速 - 所以我会在这里获取状态代码!
关键是,必须在某处指定此行为! (我们追求夸张的定义!)
在这个场景中有两个 HTTP 微服务:
- 为客户端提供数据的public服务
- 验证对 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 中都很便宜,但是在成功和错误情况下强制反序列化内容相比之下非常昂贵。身份验证需要快速 - 所以我会在这里获取状态代码!
关键是,必须在某处指定此行为! (我们追求夸张的定义!)