假设我有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
的传播,如果可以的话想要将此行为添加到更多服务中,这涉及通过服务进行大量代码重复。另一方面,如果采用第二种方法,则会感到不对。
您知道此类问题的任何模式或库/框架吗?
答案 0 :(得分:2)
对于这种典型问题,您必须使用断路器样式。我建议您学习由Netflix团队开发的Hysterix断路器框架。点击这些链接。
https://github.com/Netflix/Hystrix/wiki/How-it-Works
https://spring.io/guides/gs/circuit-breaker/
如Turing85所评论的那样,在调用服务b和服务c时不应影响服务A。