【发布时间】:2019-07-10 18:03:59
【问题描述】:
假设我有 3 个微服务 - A、B 和 C。
通过这些服务的通信模式看起来像
这个:
A -> B -> C.
服务B 和C 可以抛出异常并向调用者返回500。在服务A 中我需要识别服务B 或C 是否抛出异常(返回500)。此类问题有哪些常见模式?我在想:
在
B和C的响应中添加附加字段,表示导致问题的服务并通过服务传播问题,例如如果服务C将返回 500,则该字段将被复制到服务B的响应中并传播到服务A。另一方面,如果服务B会导致问题,它会将此字段添加到其 500 响应中,其值代表服务B。通过异常类或错误消息识别哪个服务导致异常
这两种方法都有缺点 - 在第一种方法中,我必须处理将此字段附加到响应并将其从服务 C 通过服务 B 传播到服务 A,如果它想将此行为添加到更多的服务它通过服务涉及大量的代码重复。另一方面,如果第二种方法感觉不对。
您知道此类问题的任何模式或库/框架吗?
【问题讨论】:
-
为什么
A需要知道C发生了什么错误?微服务的一个优点是解耦。如果A仅与B通信,则A不需要知道C上的错误。B负责将错误消息从C重新映射到对A具有语义意义的内容(最好不要提及服务C)。 -
假设前端使用
A和C是其他人拥有的外部系统的网关。在前端我想在C出现故障时显示两条消息“外部系统失败,请联系外部系统所有者”,如果B出现故障,则显示“我们的系统失败,请联系我们”