gpt4 book ai didi

node.js - Dockering 具有外部依赖项的 nodejs 应用程序

转载 作者:搜寻专家 更新时间:2023-10-31 23:34:27 25 4
gpt4 key购买 nike

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

project the container gives me an error saying:
Error: Cannot find module '../../Utils/logger

这很有意义,因为我们正在微服务项目中构建 docker 镜像。这里需要做出的架构决策很少:

  1. 我们根据需要将实用程序代码移动到每个微服务中。

    • 优点:微服务完全 self 维持,不依赖任何其他包的代码级别。
    • 缺点:横切关注点的维护和更改会很麻烦。

2.创建一个私有(private)的npm模块,将依赖注入(inject)到微服务的package.json文件中。不确定这是否可行。

非常感谢对此的任何建议。

最好的,- 维巴夫

最佳答案

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

您应该避免将相同的文件用于具有符号链接(symbolic link)的微服务或从一个文件夹中请求,因为它会破坏松散耦合

Loose coupling is a design goal that seeks to reduce the inter-dependencies between components of a system with the goal of reducing the risk that changes in one component will require changes in any other component. Loose coupling is a much more generic concept intended to increase the flexibility of a system, make it more maintainable, and makes the entire framework more "stable".

简单地说,你不能有不同版本的记录器文件,但你可以有不同版本的记录器 npm 包。

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

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

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

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

关于node.js - Dockering 具有外部依赖项的 nodejs 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com