我有两个模块(带有DB1的mod1和带有DB2的mod2)托管为微服务。这两个模块都有一些共同的功能,可以与DB1和DB2进行交互。
方法_1:-将另一个mod3作为通用组件的共享库jar并注入到两个模块中,以避免代码重复
方法_2:-为公用组件而不是共享库jar创建另一个微服务。
不确定在设计方面哪种方法更好,在这里我需要考虑哪些标准?
据我了解,它应该是共享库而不是微服务,因为它将与多个数据库交互。如果它是共享jar,则该模块在逻辑上与业务上的调用方模块同在。
答案 0 :(得分:2)
如果您有两个都可以访问相同两个数据库的微服务,并且您正在考虑将公共数据库访问代码分解到一个库中,那么您至少应该考虑一个想法,即您实际上只有一个微服务。
考虑一下,如果您更改其中一个数据库的架构,将会发生什么。您必须更新两个微服务才能处理更改。如果您有一个库,则必须更新该库,然后构建和发布这两个微服务。通过维护两个微服务而不是一个,您会获得什么?似乎还需要更多工作。
您可能会说,有时候我可能会做出仅影响一个微服务逻辑的更改,然后我才可以构建和发布该服务。没错,但是如果您只有一项微服务,那么您仍然只会构建和发布一项微服务。仅仅因为存在其他一些您尚未构建和发布的微服务,构建和发布一个微服务并不容易。
答案 1 :(得分:1)
如果您具有使用两个不同微服务的数据库的通用功能,请执行以下两个步骤:
请注意,更新第二个微服务数据库的轻微延迟(可能是几秒钟)可能并不像最初看起来的那样糟糕。 “道歉”在这里起着重要作用。许多电子商务站点向客户道歉,因为即使成功提交了订单也无法履行他们的订单。从这个角度来看,Saga模式可能有用,如果它不能应用第二个微服务中的更改,因为流事件到达第二个微服务时业务逻辑不再成立,它将在第一个微服务中补偿交易。
简而言之,您提到的两种方法与微服务架构相反