Select 微服务与库作为依赖?

Select micro services vs library as dependency?

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

Approach_1:- 制作另一个 mod3 作为公共组件的共享库 jar,并将其注入到两个模块中以避免代码重复

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

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

根据我的理解,它应该是一个共享库而不是微服务,因为它将与多个数据库交互。如果它是共享 jar,那么该模块在逻辑上属于调用者模块的业务。

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

想一想如果更改其中一个数据库的模式会发生什么。您必须更新这两个微服务才能处理更改。如果您有一个库,则必须更新该库,然后构建并发布这两个微服务。通过维护两个微服务而不是一个微服务,您可以获得什么?看起来工作量更大。

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

如果您有使用两个不同微服务的数据库的通用功能,请按照以下两个步骤操作:

  1. 重新检查限界上下文,即您做出将功能隔离到两个微服务的设计决策所依据的初步理解和假设。也许你需要在那里进行一些重构,也许不需要。
  2. 如果您确信您的限界上下文是正确的。尝试将通用功能合并到适当的微服务(两个服务之一)中,这样您将仅直接更新本地微服务数据库,并通过从另一个微服务公开的 API 更新另一个微服务数据库(这肯定会导致紧密耦合,但在某些情况下可能是合适的)或使用流式处理,如 .
  3. 中所述

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

简而言之,你提到的两种方式与微服务架构背道而驰