Microservices 当与另一个内部微服务交互时,防御能力如何?

Microservices 当与另一个内部微服务交互时,防御能力如何?,microservices,defensive-programming,Microservices,Defensive Programming,在此场景中,有两个HTTP微服务: 为客户机提供数据的公共服务 对公共服务调用进行身份验证的内部微服务 服务1调用服务2,要求它对客户端提供给它的令牌进行身份验证 协议(“合同”)规定,服务2应回复200ok和关于认证用户的JSON内容 在服务1中,如果接收到响应200 OK,是否值得进一步验证响应 例如,响应的JSON主体被解析为一个对象。检查该对象是否正确实例化而不是设置为null是否有价值?或者,这应该留给集成测试吗?严格来说,200只表示请求已成功处理。从业务角度来看,这与电话的实际结果

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

  • 为客户机提供数据的公共服务
  • 对公共服务调用进行身份验证的内部微服务
  • 服务1调用服务2,要求它对客户端提供给它的令牌进行身份验证

    协议(“合同”)规定,服务2应回复
    200ok
    和关于认证用户的JSON内容

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


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

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

    实际上,您依赖“如果用户未经身份验证,我们将抛出异常或以其他方式使调用失败”的约定对用户进行身份验证

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


    从这个角度来看,让service2返回一个响应是值得的,然后可以通过询问来结束这个循环

    或者,您可以让客户端直接调用身份验证服务,检索令牌,然后将该令牌与任何其他请求一起呈现。这意味着service1不再需要知道调用方已通过身份验证

    问题是是否在每次测试时都在Service 1中进行测试 收到答复

    对不起,我似乎有点误解了问题的精神

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


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

    你的方法还不错

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


    关键是,必须在某个地方指定此行为!(我们选择了夸张的定义!)

    这个对象的内容是什么?服务1使用它吗?是的,服务1使用响应的内容。它包括与微服务测试方法相关的
    UserID
    。“从这个角度来看,让service2返回一个响应可能是值得的,然后可以通过询问来结束这个循环。”这确实是service2所做的。问题是是否在每次收到响应时都在服务1中进行测试,以验证它是否包含预期的属性。(争论的另一方面是不要在每个实时请求中麻烦,而让集成测试来完成。)谢谢,关于招摇过市的好提示。为了清楚起见,我需要解析用户ID的响应主体。因此,这是一个这样做的问题,假设我现在有一个具有用户ID的对象,或者如果没有返回该属性,则执行显式检查并引发异常。