我目前正在开发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
文件夹吗?
答案 0 :(得分:4)
对于所有微服务,我应该只使用一个package.json,只在一个node_modules文件夹中生成>
当您进行微服务时,您不必担心有多个node_modules目录,因为微服务的一个要点是能够将它们放在单独的主机上或单独的容器中,并且它们赢得了无论如何都能够分享他们的依赖。
每个微服务都应该是一个单独的服务。您应该避免紧密耦合以及可能因为与微服务架构作斗争并将它们连接在一起而导致的漏洞抽象。
当然,微服务并不是唯一可以在实践中运行的架构,但是你需要微服务,那么每个微服务应该是完全独立的。否则它不是微服务。
如果您可以在服务之间共享任何公共代码,则将其放入所有或部分服务所需的模块中。您可以在npm上保留私有模块,可以托管私有npm注册表,也可以直接从GitHub或GitLab私有目录安装该模块。要添加在GitHub上托管的私有(或公共)模块,您需要做的就是运行:
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');
如果你有大量的小型微服务,特别是当它们分成多个文件时,这可以简化一些事情。