我有一个 Node 应用程序,它由几个独立的模块组成,通过 AMQP 相互通信。该应用程序由一个 index.js 文件启动,该文件实例化我的项目的不同文件夹中的所有其他 index.js,进而实例化实际的模块。
我一直在阅读有关微服务的内容,并且想将我的应用程序转换为 Docker 容器。我找到了如何将简单的 Node 应用程序转换为 Docker 的示例,但我想分离我的应用程序,以便每个模块都位于独立的 Node 容器中(这是因为每个模块都是独立的,不依赖于其他模块来运行)工作。它们从消息队列接收工作,并将结果放入消息队列。
我找不到有关如何组织和部署代码的信息。我是否应该为每个模块创建一个不同的 Node 项目(带有单独的 packages.json)?或者我应该为所有模块创建一个 Node 项目并单独部署每个模块?
组织好项目后,是否有一个脚本工具可以生成(构建*并部署)我的每个模块到其自己的容器?到目前为止,我发现的所有示例都是“hello world”级别的示例,仅打包一个应用程序。
在开发过程中,我是否必须为测试的每个更改部署新容器?
*:构建是因为我使用 ES6 并且必须使用 Babel。
最佳答案
Should I have a separate packages.json for each Dockerfile? From what I've read, I understand the Dockerfile will actually run NPM and download the actual packages. If I have a single packages file I would have a lot of bloat in each of my images, with unused modules.
当然你会臃肿,这就是微服务的美妙之处,并且That's the curse of Microservice .
Should I have a separate packages.json?
好吧,让我尝试具体解决这个问题。假设您的 moduleA 使用 lodash.x.x.x。并且您想在 moduleB 中使用 lodash.x+1.x.x。您确定 lodash.x+1.x.x 不向后兼容 lodash.x.x.x。因此,现在您必须使 ModuleA 的代码与 lodash.x+1.x.x 兼容。如果上述说法听起来属实,那么我们将这些应用程序称为单体应用程序,而不是微服务。要回答你的问题,是的,你可能需要单独的packages.json,除非你可以有一个具有共同依赖项的父package.json和带有它自己的package.json的子模块(我不是来自node-land,所以不确定package.json是否是这样的) json有这样的能力)
What I can't find is information on how I should organize and deploy my code. Should I have a different Node project (with separate packages.json) for each of my modules? Or should I have a single Node project for all my modules and deploy each of them individually?
我已经看到了这两种模式(单独的项目以及同一项目中的子模块)。我个人的观点(就其值(value)而言)是拥有单独的项目和单独的代码库,因为您的“模块”已经在通过与语言无关的协议(protocol) - AMQP 进行通信。明天,您可能想使用 golang/kotlin 来实现“ModuleB”(微服务B,取决于您如何看待它:)),谁知道呢。
After I have my project organized, is there a script tool that will generate (build* and deploy) each of my modules to its own container?
这里需要澄清的一件事是,一个微服务的开发和部署不应该强制您更改/部署其他微服务,只要它们之间的契约保持完整,否则它就是一个分布式单体(哇..我是不是只是发明一个新术语?太棒了!!)。当契约(Contract)发生变化时,您应该升级版本并让两个版本运行一段时间,直到所有相关方(您的其他微服务)都有机会升级。
关于node.js - 将我的 Node 应用程序转换为 Docker/Kubernetes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46975781/