选择微服务还是库作为依赖项?

时间:2019-02-13 03:45:28

标签: design-patterns microservices solid-principles

我有两个模块(带有DB1的mod1和带有DB2的mod2)托管为微服务。这两个模块都有一些共同的功能,可以与DB1和DB2进行交互。

方法_1:-将另一个mod3作为通用组件的共享库jar并注入到两个模块中,以避免代码重复

方法_2:-为公用组件而不是共享库jar创建另一个微服务。

不确定在设计方面哪种方法更好,在这里我需要考虑哪些标准?

据我了解,它应该是共享库而不是微服务,因为它将与多个数据库交互。如果它是共享jar,则该模块在逻辑上与业务上的调用方模块同在。

2 个答案:

答案 0 :(得分:2)

如果您有两个都可以访问相同两个数据库的微服务,并且您正在考虑将公共数据库访问代码分解到一个库中,那么您至少应该考虑一个想法,即您实际上只有一个微服务。

考虑一下,如果您更改其中一个数据库的架构,将会发生什么。您必须更新两个微服务才能处理更改。如果您有一个库,则必须更新该库,然后构建和发布这两个微服务。通过维护两个微服务而不是一个,您会获得什么?似乎还需要更多工作。

您可能会说,有时候我可能会做出仅影响一个微服务逻辑的更改,然后我才可以构建和发布该服务。没错,但是如果您只有一项微服务,那么您仍然只会构建和发布一项微服务。仅仅因为存在其他一些您尚未构建和发布的微服务,构建和发布一个微服务并不容易。

答案 1 :(得分:1)

如果您具有使用两个不同微服务的数据库的通用功能,请执行以下两个步骤:

  1. 重新检查有限的上下文,即您最初的理解和假设,您以此为基础做出了设计决策,将功能划分为两个微服务。也许您需要在那里进行一些重构。
  2. 如果您确信自己的有限上下文是正确的。尝试将通用功能合并到适当的微服务(两个服务之一)中,这样您就可以直接通过其他微服务公开的API直接更新本地微服务数据库,并更新另一个微服务数据库(这肯定会导致紧密耦合,但是也许在某些情况下是合适的),或者使用此answer中所述的流式传输。

请注意,更新第二个微服务数据库的轻微延迟(可能是几秒钟)可能并不像最初看起来的那样糟糕。 “道歉”在这里起着重要作用。许多电子商务站点向客户道歉,因为即使成功提交了订单也无法履行他们的订单。从这个角度来看,Saga模式可能有用,如果它不能应用第二个微服务中的更改,因为流事件到达第二个微服务时业务逻辑不再成立,它将在第一个微服务中补偿交易。

简而言之,您提到的两种方法与微服务架构相反