将nodejs应用程序与外部依赖项对接

vai*_*hav 3 containers node.js docker microservices

我们正在构建Node.js微服务.对于一些可重用的组件,我们创建了一个utils文件夹.此文件夹位于实际的微服务包之外.当我们运行微服务时,我们可以使用require(../../utils/logger)它来引用该代码,它就像一个魅力.但是在尝试为我的微服务创建docker镜像时

project the container gives me an error saying:
Error: Cannot find module '../../Utils/logger
Run Code Online (Sandbox Code Playgroud)

当我们在微服务项目中构建docker镜像时,这很有意义.这里需要采取的架构决策很少:

  1. 我们根据需要将utils代码移动到每个微服务中.

    • Pro:微服务完全保持自我维持,并且没有代码级依赖于任何其他包.
    • 缺点:维护交叉问题和变化将是麻烦的.

2.创建一个私有的npm模块,并将依赖注入microservice package.json文件.不确定这是否有效.

对此的任何建议都非常感谢.

最好的, - Vaibhav

gal*_*kin 5

不要使用require(../../utils/logger),使用npm包

你应该避免使用相同的文件用于带有符号链接的微服务或要求从一个文件夹,因为它会破坏Loose coupling.

Loose coupling是一个设计目标,旨在减少系统组件之间的相互依赖性,目标是降低一个组件中的更改需要更改任何其他组件的风险.松散耦合是一个更通用的概念,旨在提高系统的灵活性,使其更易于维护,并使整个框架更"稳定".

简而言之,您不能拥有不同版本的记录器文件,但您可以使用不同版本的记录器npm包.

使用npm模块作为Node.js微服务的可重用组件的实现细节:

  1. 选择包的命名约定.我的建议是范围包.例:@vaibhav/logger
  2. 选择npm注册表.有这样的选择:

    • 2.1.npmjs.com和公共包.它是免费的,但是你的软件包应该只有通用代码而没有任何有商业价值的细节.
    • 2.2 npmjs.com私人套餐.这很快,但不是免费的.
    • 2.3 verdaccio你自己的npm注册服务器.它是免费的简单Node.js解决方案,应该在您的基础架构中作为服务器安装.
    • 2.4 nexus.具有npm和docker支持的通用私有注册表.
  3. 如果您使用2.3或2.4解决方案,则需要为您的服务器选择ip或link.我的建议是使用链接.例https://your-registry.com

  4. 如果使用2.3或2.4解决方案,则需要在微服务中的.npmrc文件中选择安装方法.有两种选择:
    • 从注册表安装所有必需的包..npmrc文件看起来像registry=https://your-registry.com.您的注册表应该能够缓存公共包.
    • 只从您的注册表安装您的包,从公共注册表安装其他包..npmrc文件看起来像@vaibhav:registry=https://mycustomregistry.example.org
  5. microservice package-lock.json文件中定义包开发,发布和更新包版本的过程.在我们的项目中,我们以这种方式定义流程:
    • 我们使用GitHub流程进行包开发.只有用于发布的主分支和用于开发的功能分支.只有来自开发人员的拉取请求或来自CI服务器的提交才能更新主分支.
    • 我们使用Jenkins作为自动更新版本的继续集成服务器,在合并拉取请求后发布.Jenkins 为更新版本运行npm version命令,然后将新提交发布到master分支,然后发布到npm注册表.詹金斯检查我们的一些规则,并使用npm version带有patchminorPARAM.更新主要版本正在发生变化,我们会手工制作.
    • 我们没有100%自动化的过程来更新微服务中的软件包版本.我们只使用package-lock.json文件中的新包版本自动打开拉取请求.开发人员应检查构建状态并手动按合并按钮.