【问题标题】:node.js using domain driven designnode.js 使用领域驱动设计
【发布时间】:2019-05-03 14:00:57
【问题描述】:

我正在将应用程序从 c# 迁移到 node.js。我正在学习 node.js,所以我是 node.js 新手。我正在阅读《领域驱动设计的模式、原则和实践》这本书,并发现了很多我当前的项目可以从中受益的重要信息。

例如,在书中,有一个示例电子商务应用程序包含三个有界上下文:销售、运输和计费。每个有界上下文负责自己的数据库,每个有界上下文都在 NServiceBus 实例中运行。这似乎是一个很好的方法,因为一切都在相同的解决方案下运行,但不同的项目。在将其翻译为 node.js 时,我遇到了一些困惑。

1) 我很难找到将 node.js 与 ddd 结合在一起的好示例,例如上面的电子商务示例?这里的一些障碍是处理 OOP 的方式不同。

2) 如果在本书的示例代码中,每个有界上下文都在其自己的项目中并在 NServiceBus 中运行,这是否意味着在将其转换为 node.js 时,我使用 vscode 作为 GUI,我需要创建为每个项目创建一个单独的父文件夹(有界上下文),并为每个有界上下文提供不同的端口来监听,如果我希望所有有界上下文在同一台服务器上运行直到我需要相应地扩展?

3) NServiceBus 允许消息和事件来回传递。对于 node.js,存在什么服务总线技术,最好是开源的并且可以在基于 linux 的机器上运行,可以提供 NServiceBus 提供的功能并且可靠?我应该只考虑单独使用 rabbitmq 来提供这个功能,包括发送事件吗?

【问题讨论】:

  • 我在NodeJS中实现了一个真正的个人项目,因为我想学习并且我通过了一种务实的方式。我使用 Mongoose 静态和实例方法来驱动我的域。尽管您将业务逻辑紧缩到 Mongoose,但它仍然可以达到目的。
  • 我建议每个有界上下文都将是其自己的 git 存储库中的一个微服务,并拥有自己的部署过程作为云中的独立实例。我会选择抽象的东西,比如 aws elasticbeanstalk 或 docker 容器。它们都可以通过异步消息总线或同步 http 调用进行通信
  • @danfromisrael 这就是我的想法,因为每个有界上下文(微服务)都在自己的项目文件夹中。现在,如果我将 express api 作为接口运行以允许客户端通过 rest api 访问微服务,如果我使用 elasticbeanstalk 或 docker,微服务是否仍会在具有指定端口的 node.js 服务器中运行,或者他们会替换node.js 服务器设置的服务器方面?我是否应该考虑 AWS Lambda 以及它似乎是事件驱动的?我知道我需要为命令和事件考虑服务总线方案。
  • 当您部署到 elasticbeanstalk 时,您会获得服务的 url(默认端口 8080)。您可以从其他服务中使用它。要公开 REST api,您可以使用 express。 id 建议观看一些关于如何将 express 应用程序部署到 aws 的教程。 eb / docker 只是设置了你的机器 os + 依赖项并有一个应用入口点命令来启动你的服务器。
  • 使用 elasticbeanstalk,我假设我会得到一个 url,并且最初,如果扩展允许,为每个服务部署一个 docker 容器,如果不正确,请纠正我。我假设每个服务都必须从不同的端口监听并使用休息独立处理自己的请求。这是你建议的方向吗?我注意到上面你说 elasticbeanstalk 已经配备了异步消息传递功能。我看 lambda 的次数越多,由于有界上下文如何绑定在一起的性质,它似乎越不适合。

标签: node.js domain-driven-design nservicebus


【解决方案1】:

您可能对wolkenkit 感兴趣,这是一个适用于 Node.js 和 JavaScript 的 CQRS 和事件溯源框架,与域驱动设计 (DDD) 配合得非常好。

除了实际的框架(部署为 npm 模块 wolkenkit)之外,还有许多可用的示例应用程序展示了工作原理:

除此之外,您可能还想看看wolkenkit documentation,尤其是brochure you can download,它解释了DDD、事件溯源和CQRS,它们是什么,它们如何相互关联,以及以此类推……

PS:请注意,我是 wolkenkit 的作者之一,所以请对我的回答持保留态度。

【讨论】:

    【解决方案2】:

    我建议浏览带有 ddd 标记的 npm 模块:

    并用服务总线标记:

    还有一本 Philipp Fehre 的 JavaScript Domain-Driven Design 书。

    【讨论】:

    • 我有一本 Javascript 领域驱动设计书。我已经浏览了一些示例代码(他们设计了一个基于地牢的游戏)。计划在我读完 Patterns、Principles 等书后通读一遍。它没有我在《领域驱动设计的模式、原则和实践》一书中找到的那么详细,这一本非常详细,将近 750 页。问题是我想找到一些提供与 node.js 类似细节的示例,以消除我在翻译中遇到的一些困惑。
    【解决方案3】:

    这篇文章已经有几年的历史了,但对于仍然感兴趣的人来说,这里有一个 Typescript/node 的 DDD 框架:

    https://github.com/node-ts/ddd

    以及受 NServiceBus 启发的消息总线:

    https://node-ts.github.io/bus/

    它们旨在协同工作以使用节点构建消息驱动的 DDD 系统

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 2011-10-06
      • 2011-04-10
      • 2015-10-18
      • 2017-11-23
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多