我正在实现一个由 n 个微服务(Java,Spring)组成的产品。
问题是某些用例集成了ex。像这样进行通信的4种微服务:
A -> B -> C -> D
,D在执行任务时会引发异常。服务A需要知道问题的根源是服务D。
我知道我可以在服务D中实现一个自定义的异常处理程序,该处理程序可以返回一些附加属性,例如exceptionSource="D"
并将其传播到所有服务中,但这并不是很酷,并且需要大量的手动实现。
您知道使它更加自动化的任何方法吗?也许有一些模式/库/魔术弹簧属性?
答案 0 :(得分:1)
在每个微服务中定义异常处理程序和错误消息转发器听起来确实是个坏主意。
它以不必要的方式解耦微服务实现。我们将解耦需要解耦的事物(例如数据,逻辑,部署),但是如果每个微服务实现都依赖于相同的技术,则在每个微服务实现中都不应重复出现横向需求。这显然是无法维持的。
我看到完成任务的两种主要方法:
依赖于第三个应用程序,该应用程序啮合/丰富了通信,并通过错误消息(通过特定模式)拦截了错误消息的响应,并丰富了每个调用方的响应,这将使源消息出现错误,直到原始调用方为止。 br /> 如果您已经使用了这种解决方案,或者使用了与微服务有关的异构实现,那么这种解决方案就很有意义。您似乎不是这种情况。
所有Java Spring微服务在共享库中定义异常处理程序(@ControllerAdvice
)和HTTP拦截器(ClientHttpRequestInterceptor
)。
这样,所有服务将以类似的方式并且无需任何努力即可执行异常处理和对来自其他微服务的响应的错误的处理。
仅需警告:微服务实现并非旨在仅仅依赖同一技术(一种可能在Java Spring中,另一种可能在Java EE中,另一种可能在NodeJS中,而另一种可能在NodeJS中)在C#中)。
因此,依靠Spring的特定功能现在可能会起作用,但是如果以后使用Java和Spring等其他技术,可能会造成一些困难。