假设我有 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
的传播,如果它想将此行为添加到更多服务中,它涉及通过服务进行大量代码重复。另一方面,在第二种方法的情况下,感觉不对。
你知道这个问题的任何模式或库/框架吗?
我和Google的其他人基于Google专有的Java服务框架为此开发了一个解决方案。
我能用HTTP术语描述的最好的方法如下:
- 该解决方案以
Service Error Trace
的形式在上游(在服务 A 中)提供错误源。 Service Error Trace
类似于 Java 堆栈跟踪,不同之处在于服务错误跟踪包含表示错误传播链而不是 Java 类和行号的服务/端点元组列表。- 每个服务都使用负责生成此错误跟踪的错误处理程序进行检测。从头开始创建它,或将新的服务错误元素追加到跟踪。然后,处理程序使用响应端通道将此错误推送到上游(在 HTTP 中,响应端通道类似于 HTTP 响应标头)。
Service Error Trace
中的第一项将是错误源。错误的根源是我相信你正在寻求的。
希望能为您提供一些适合您用例的项目想法!
米.
对于这种典型问题,您必须使用断路器模式。我建议你学习Hysterix,这是一个由Netflix团队开发的断路器框架。点击这些链接。
https://github.com/Netflix/Hystrix/wiki/How-it-Works
https://spring.io/guides/gs/circuit-breaker/
正如图灵85所评论的那样,在调用服务B和服务C时,服务A不应受到影响。