Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 微服务体系结构中的错误传播_Java_Spring_Rest - Fatal编程技术网

Java 微服务体系结构中的错误传播

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 识别由异常类或错误消息导致异常的服务 两种方法都有

假设我有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
,如果它想将此行为添加到更多服务中,则需要通过服务进行大量代码复制。另一方面,在第二种方法的情况下,感觉是错误的


您知道此类问题的模式或库/框架吗?

对于此类典型问题,您必须使用断路器模式。我建议您学习Netflix团队开发的断路器框架。请点击以下链接


正如Turing85所评论的,调用服务b和服务c时,服务A不应受到影响。

为什么
A
需要知道
c
上发生了什么错误?微服务的一个优点是解耦。如果
A
仅与
B
通信,
A
不需要知道
C
上的错误。
B
有责任将错误消息从
C
重新映射到对
A
有语义意义的内容(最好不要提及服务
C
)。假设前端使用
A
,而
C
是其他人拥有的外部系统的网关。在前端,我想显示两条消息“外部系统故障,在
C
中出现故障时联系外部系统所有者”和“我们的系统故障,如果
B
中出现故障,请与我们联系。我认为您的回答无法回答我的问题。您可以在断路器回退方法中处理所有问题,包括自定义消息,以便妥善处理所有问题。此外,还有其他手动处理的方法。但是,您可以利用断路器功能。spring上的示例正好描述了您的问题。我相信spring Boot团队不赞成使用Hystrix。还有其他的实现需要探索。断路器建议是一个很好的观点。