【问题标题】:sharing code between microservices在微服务之间共享代码
【发布时间】:2016-11-05 21:21:28
【问题描述】:

我正在开发一个套件,其中包含几个微服务协同工作。 我正在使用 Docker 设置环境,效果很好。

我的项目组件如下:

  • MongoDB
  • Node.js 工作人员在 DB 上进行一些处理
  • 为用户服务的 Node.js Rest API

正如您可能猜到的那样,假设 2 个 Node.js 服务器使用相同的数据库。 现在我已经在其中一个项目中定义了我的模型,但我想知道在处理第二个项目时最佳实践是什么。 我真的很想避免复制粘贴我的代码,因为这意味着当我对 Schema 进行更改时,我必须让它们保持最新。 有没有什么好的方法可以在他们之间共享代码?

我的项目如下所示:

rest-api // My first Node.js application
    models
        MyFirstModel.js // This is identical to the one in the worker/models folder
        MySecondModel.js
    index.js
    package.json
    Dockerfile
worker // My second Node.js application
    models
        MyFirstModel.js
        MySecondModel.js
    index.js
    package.json
    Dockerfile
docker-compose.yml

任何输入都会有所帮助。

谢谢。

【问题讨论】:

  • 为什么有两个独立的应用程序?为什么模型相同?
  • 我已经解释过了。 2 个微服务使用同一个数据库
  • 我的意思是为什么你有两个微服务共享一个数据模型?为什么不只是一个?感觉可能是建模问题而不是技术问题

标签: node.js docker architecture


【解决方案1】:

普遍的看法是:两个微服务不应该共享相同的数据模型。有几篇关于它的文章和一些与此主题相关的问题。

How to deal with shared models in micro service architectures

但是我认为在某些情况下您需要它并且可以接受。即使一切都是内部的,信任也是一种奢侈品,因此必须考虑安全性和一致性。任何传入的对象都必须在对其进行任何处理之前进行规范化、验证和检查。这两个服务应该以相同的方式处理数据。

我用于共享模型的 API 和管理服务的解决方案: 我创建了 3 个存储库,一个用于 API,一个用于 Admin,第三个用于模型目录。模型应该存在于两个存储库中,因此我将其添加为 git 子模块。每当您更改架构上的某些内容时,都应该单独提交,但我认为这是管理更改而不复制代码的最佳解决方案。

【讨论】:

  • 实际上正确的做法是创建第三个微服务作为数据库的网关。它将获取 CRUD 请求以在数据库上执行并处理所有验证缓存等。
【解决方案2】:

当然可以。 你要做的就是把你的公共文件放在一个卷中,并与两个 Node 容器共享这个卷。

您应该设置一个数据卷,在其中放置您要共享的所有文件。更多关于此here 或其他任何地方的信息,请通过谷歌搜索。 干杯。

【讨论】:

  • 好的,所以我尝试了它,它确实有效,但它使事情变得更加复杂,因为我需要在代码中维护另一个在 package.json 上的共享模型。我希望更清洁的解决方案..
  • 您只需将要共享的文件放入该数据卷中即可。所以我不明白你的问题是什么。你能给我更多的细节吗? ;-)
  • 在我的common 文件夹中有模型文件,它需要mongoose 模块来创建模式。但是当它尝试要求它时失败,因为没有node_modules 在公共目录。这意味着我需要在公共库中添加另一层依赖管理
  • @dcohenb 一种可能的解决方法:放置一个 cron 脚本,将所有文件从 common 文件夹复制到模型文件夹中。否则我找不到更清洁的解决方案。
  • 我也在尝试创建类似的架构(例如,运行节点服务/进程 [workers] 的特定 Docker 容器)我认为这是一个常见解决方案的常见问题?
猜你喜欢
  • 2016-03-28
  • 2019-07-22
  • 2017-09-19
  • 2017-05-27
  • 2016-07-30
  • 1970-01-01
  • 2017-09-26
  • 2017-05-29
  • 2016-08-15
相关资源
最近更新 更多