在 NodeJs 微服务架构中,我应该为每个服务使用 package.json 吗?

Posted

技术标签:

【中文标题】在 NodeJs 微服务架构中,我应该为每个服务使用 package.json 吗?【英文标题】:In a NodeJs microservices Architecture, should I use a package.json per service? 【发布时间】:2017-09-15 20:22:11 【问题描述】:

我目前正在 NodeJs 中开发微服务架构。我的第一种方法是每个服务一个package.json。虽然,对于所有微服务,访问公共区域(使用日志记录或数据库实用程序)时可能非常棘手。例如:

common-area >
    logger.js
    package.json - install module typeorm

service1 >
    app.js - use logger.js
    package.json - also install module typeorm

在运行node app.js(服务 1)时,我们最终会加载 2 个 typeorm 模块,一旦我们进行了两种不同的安装,一个在公共区域(由记录器使用),另一个在 service1。

我是否应该为所有微服务只使用一个package.json,导致只有一个node_modules 文件夹?

【问题讨论】:

如果你在这里使用微服务,我不会。每个服务都应该是隔离的,通常通过队列(RabbitMQ、Kafka)或删除请求(HTTP、RPC)进行通信。这看起来像您在service1 中加载logger“服务” - 这违背了这种做法。我认为您的logger.js 是在其他服务中重用的模块,而不是服务。也许将其发布为私有节点包? - 我可能完全误解了,所以如果我错了,请纠正我。 你是对的。 Logger.js 不是服务,只是一个通用模块,所有服务都使用。发布为私有节点包似乎是个好主意 :) 谢谢 【参考方案1】:

我是否应该为所有微服务只使用一个 package.json,从而>只使用一个 node_modules 文件夹?

当你在做微服务时,你不应该担心有多个 node_modules 目录,因为微服务的要点之一是能够将它们放在单独的主机或单独的容器中,并且它们将无法共享它们的无论如何都要依赖。

每个微服务都应该是一个单独的服务。您应该避免紧密耦合和可能因与微服务架构对抗并将它们连接在一起而导致的抽象泄漏。

当然,微服务并不是唯一在实践中有效的架构,但如果您想要微服务,那么每个微服务都应该是完全独立的。否则就不是微服务。

如果您可以在服务之间共享任何公共代码,则将其放入所有或部分服务所需的模块中。您可以在 npm 上保留私有模块,可以托管私有 npm 注册表,或者您可以直接从 GitHub 或 GitLab 私有存储库安装该模块。添加托管在 GitHub 上的私有(或公共)模块所需要做的就是运行:

npm install user/repo --save

user 是您在 GitHub 上的用户(或组织)名称,repo 是存储库的名称。请记住,如果要安装这样的模块,如果它位于私有 repo 中,则该机器上使用的 ssh 密钥必须属于对 repo 具有读取权限的用户。您还可以在 GitHub 上使用部署密钥以获得更大的灵活性。

您甚至可以通过创建一个单独的模块来简化在服务中加载外部依赖项,该模块包含所有依赖项并将它们一次性公开给您的服务。例如。如果您创建一个名为 dependencies 的模块,如下所示:

module.exports = 
  _: require('lodash'),
  P: require('bluebird'),
  fs: require('mz/fs'),
  // ...
;

然后您可以像这样在微服务中使用所有这些模块:

const  _, P, fs  = require('dependencies');

当您拥有大量小型微服务时,尤其是当它们被拆分为多个文件时,这可以大大简化事情。

【讨论】:

是的。那是我的第一种方法,试图实现服务之间的松散耦合。虽然遵循 DRY 原则,我在公共区域加入共享代码。正如@Caffeinated.tech 建议的那样,我会尝试用它制作一个私有模块。 @VBoss 是的,当然你可以制作私有模块来分解任何公共代码。你可以在 npm 上拥有私有和作用域的模块,你可以直接从 GitHub 或 GitLab 或任何其他 git repo 安装。请参阅我的更新答案。 如果外部依赖超过20+,如何处理?我们是否仍将其包含在 require('dependencies') 中?会不会导致部署规模很大?如果我的项目有超过 30 个微服务和超过 20 个私有包。更好的设计方法是什么?我应该将20个私有包更改为单个私有包吗? @rsp 我在另一篇文章中创建了一个关于私有包的问题。如果您有任何好的建议,将很高兴。 ***.com/questions/64201915/…

以上是关于在 NodeJs 微服务架构中,我应该为每个服务使用 package.json 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为什么应该使用微服务(Microservices) ?

在 NodeJS/Express 中使用 API 网关进行微服务 API 身份验证

CQRS微服务架构模式

CQRS微服务架构模式

微服务架构中的数据库位置

pay-interview