Java 微服务体系结构中的错误传播
假设我有3个微服务——A、B和C 通过这些服务的通信模式如下 这:Java 微服务体系结构中的错误传播,java,spring,rest,Java,Spring,Rest,假设我有3个微服务——A、B和C 通过这些服务的通信模式如下 这: A->B->C 服务B和C可以引发异常并向调用者返回500。在服务A中,我需要识别服务B还是C抛出异常(返回500)。这类问题的常见模式是什么?我在想: 向B和C的响应中添加表示引起问题的服务的附加字段,并通过服务传播,例如,如果服务C将返回500,则此字段将复制到服务B的响应中,并传播到服务A。另一方面,如果服务B会导致问题,它会将此字段添加到500响应中,其值表示服务B 识别由异常类或错误消息导致异常的服务 两种方法都有
A->B->C
服务B
和C
可以引发异常并向调用者返回500。在服务A
中,我需要识别服务B
还是C
抛出异常(返回500)。这类问题的常见模式是什么?我在想:
- 向
和B
的响应中添加表示引起问题的服务的附加字段,并通过服务传播,例如,如果服务C
将返回500,则此字段将复制到服务C
的响应中,并传播到服务B
。另一方面,如果服务A
会导致问题,它会将此字段添加到500响应中,其值表示服务B
B
- 识别由异常类或错误消息导致异常的服务
C
通过服务B
传播到服务A
,如果它想将此行为添加到更多服务中,则需要通过服务进行大量代码复制。另一方面,在第二种方法的情况下,感觉是错误的
您知道此类问题的模式或库/框架吗?对于此类典型问题,您必须使用断路器模式。我建议您学习Netflix团队开发的断路器框架。请点击以下链接
正如Turing85所评论的,调用服务b和服务c时,服务A不应受到影响。为什么
A
需要知道c
上发生了什么错误?微服务的一个优点是解耦。如果A
仅与B
通信,A
不需要知道C
上的错误。B
有责任将错误消息从C
重新映射到对A
有语义意义的内容(最好不要提及服务C
)。假设前端使用A
,而C
是其他人拥有的外部系统的网关。在前端,我想显示两条消息“外部系统故障,在C
中出现故障时联系外部系统所有者”和“我们的系统故障,如果B
中出现故障,请与我们联系。我认为您的回答无法回答我的问题。您可以在断路器回退方法中处理所有问题,包括自定义消息,以便妥善处理所有问题。此外,还有其他手动处理的方法。但是,您可以利用断路器功能。spring上的示例正好描述了您的问题。我相信spring Boot团队不赞成使用Hystrix。还有其他的实现需要探索。断路器建议是一个很好的观点。