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

In a NodeJs microservices Architecture, should I use a package.json per service?

我目前正在使用 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 文件夹?

Should I use only one package.json, for all micro-services, resulting >in only one node_modules folder?

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

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

当然,微服务并不是唯一在实践中起作用的架构,但你想要微服务,那么每个微服务都应该完全独立。否则就不是微服务了。

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

npm install user/repo --save

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

您甚至可以通过创建一个单独的模块来简化在您的服务中加载外部依赖项,该模块包含所有依赖项并将它们同时暴露给您的服务。例如。如果您创建一个名为 dependencies 的模块,它看起来像这样:

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

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

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

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