【问题标题】:Error source propagation in micro-service architecture微服务架构中的错误源传播
【发布时间】:2019-11-19 10:14:55
【问题描述】:

我正在实现一个由 n 个微服务(Java、Spring)组成的产品。

问题是当某些用例集成 ex。 4 个这样通信的微服务:

A -> B -> C -> D

并且 D 在执行任务时抛出异常。服务 A 需要知道问题的根源是服务 D。

我知道我可以在服务 D 中实现一个自定义异常处理程序,它可以返回一些额外的属性,如 exceptionSource="D" 并将其传播到所有服务,但它并不是很酷,需要大量手动实现。

你知道有什么方法可以让它更自动化吗?也许有一些模式/库/魔术弹簧属性?

【问题讨论】:

  • 这似乎是跟踪传播的一个小扩展。例如。 Zipkin 或 Jaeger
  • 当我需要监控服务之间的通信时,Zipkin 非常棒,但是因为它不会扩展错误响应,所以服务 A 不会知道服务 D 中发生了问题。

标签: java spring rest api microservices


【解决方案1】:

在每个微服务中定义异常处理程序和错误消息转发器听起来确实是个坏主意。
它以一种不一定需要的方式解耦微服务实现。我们将解耦需要解耦的东西(例如数据、逻辑、部署),但微服务之间的横向需求不应在每个微服务实现中重复,总体而言,如果它们依赖于相同的技术。这显然是不可维护的。

我看到了完成任务的两种主要方法:

    1234563 br> 如果您已经在使用这种解决方案,或者如果您使用与微服务相关的异构实现,那么这种解决方案是有意义的。你好像不是这种情况。
  • 所有 Java Spring 微服务在共享库中定义异常处理程序 (@ControllerAdvice) 和 HTTP 拦截器 (ClientHttpRequestInterceptor)。
    这样,所有服务都会以类似的方式,毫不费力地执行异常处理和来自其他微服务响应的错误的处理。

警告:微服务实现并非旨在依赖于相同的技术(一种可能在 Java Spring 中,另一种可能在 Java EE 中,另一种在 NodeJS 中,下一个在 C# 中)。
因此,依赖 Spring 的特定功能现在可能会起作用,但如果以后您使用另一种技术,如 Java 和 Spring,可能会导致一些困难。

【讨论】:

  • 感谢您分享您的意见。我喜欢你的第一个想法,但在我的情况下它看起来有点像过度设计。共享库的第二种方法是我在其他情况下尝试过的,不幸的是,它不可维护。但你说得对,我应该避免使用特定于弹簧的方法。
  • 不客气。关于第二种方法,我认为目前它最符合您的需求,因为现在您已经满春(KISS)。您注意到哪个可维护性问题?这个库应该是完全通用的,只处理公共部分:应该主要用合适的“exceptionSource”信息丰富返回的响应。也许您应该编辑帖子以解释您处理这一点的实际方式。这是一件非常有趣的事情,所以当我有时间在空闲时间尝试一些东西时,我会编辑我的答案并提供反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2015-12-26
  • 2018-03-01
  • 2021-11-02
  • 2017-03-19
  • 2018-05-12
相关资源
最近更新 更多