【问题标题】:Sharing custom code between two NodeJS microservices在两个 NodeJS 微服务之间共享自定义代码
【发布时间】:2017-09-19 23:14:25
【问题描述】:
我正在为该应用创建 Web 应用和 micorservice,两者都需要使用 Sequelize 创建相同的数据库模型。用 NodeJS 处理这个任务的方法是什么?
我正在考虑为我的数据库模型创建单独的模块并将其保存在私有 git 中,然后将此私有 git 作为 npm 依赖项添加到我的 Web 应用程序和微服务中。
但我想知道在几个微服务之间分离共享私有模块是正确的方法还是正确的方法,在我的情况下是数据库模型?
我应该选择 DRY 吗?
提前致谢!
【问题讨论】:
标签:
javascript
node.js
git
shared-libraries
microservices
【解决方案1】:
您不应该不要在微服务中使用 DRY。想想使用它们的好处之一:您可以随时将一个微服务替换为其他堆栈(PHP + Apache),只要遵守合同,系统就不会在意。
您可以阅读更多内容here,第 59 页,DRY and the Perils of Code Reuse in Microservices World。
【解决方案2】:
关于微服务,没有规定不能重用代码。事实上,在微服务中说 DRY 通常是错误的是危险的。相反,您应该问以下问题:Will the shared code be a separate module with a dedicated purpose that rectifies a separately managed lifecycle and releases? 如果是,您绝对应该将其作为单独发布的模块重用 - 类似于您如何重用任何第三方库。这可以确保您在共享代码和微服务之间没有强耦合,因为每个微服务团队都可以自行决定是否要保留模块的特定发布版本或升级到更新版本。您要避免的是在重用库更改时强制您更改微服务的依赖项(避免连锁反应)。
还有一件事 - 因为您提到它是与数据库相关的模式,所以您必须问另一个问题:Will the schemas being reused in separate DBs or will they refer to the same physical DB in the end?。如果他们最终将使用共享数据库,那么您实际上是紧密耦合了两个微服务,因此它们可能应该被视为同一服务的一部分,而不是独立的。
在不了解您的服务和目标的情况下,我只能说这么多。