2017-08-12 42 views
3

我们正在构建Node.js微服务。对于一些可重用组件,我们创建了一个utils文件夹。此文件夹不在实际的微服务包中。当我们运行微服务时,我们可以使用require(../../utils/logger)来引用该代码,它就像一个魅力。 但是当试图为我的微服务停靠具有外部依赖关系的nodejs应用程序

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

这使得有很大的意义,因为我们正在建设的微服务项目中的泊坞窗图像创建泊坞窗图像。 有一个需要在这里采取的一些架构决策:

  1. 我们移动utils的代码到每个微服务的要求。

    • 专业:微服务仍然完全自我维持,没有代码级别依赖任何其他包。
    • 缺点:维护横切问题和更改会很麻烦。

2.创建一个私人NPM模块和依赖注入到微服务的package.json文件。不知道这是否会奏效。

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

最佳, - Vaibhav的

回答

1

它不是你的问题的一部分来阐述如何应对微服务,生态系统共享库和如何避免出现,但如果你喜欢,你应该阅读这件事,让你至少要列出“分享”的利弊。

除此之外,你可以创建一个库容器,它只提供这个库被安装。

version: "2" 

services: 
    shared: 
    image: me/mysharelib 
    m1: 
    volume_from: 
     - shared:ro 
    m2: 
    volume_from: 
     - shared:ro 

,而你的mysharedlib图像看起来或多或少像这样

FROM busybox 

COPY bin/busyscript.sh /usr/local/bin/busyscript 

WORKDIR /your/lib/folder 
VOLUME /your/lib/folder 

CMD ["busyscript"] 

和你busyscript就是这样

#!/bin/sh 
#set -x 

pid=0 

# SIGTERM-handler 
term_handler() { 
    if [ $pid -ne 0 ]; then 
    kill -SIGTERM "$pid" 
    wait "$pid" 
    fi 
    exit 143; # 128 + 15 -- SIGTERM 
} 

# setup handlers 
# on callback, kill the last background process, which is `tail -f /dev/null` and execute the specified handler 
trap 'kill ${!}; term_handler' SIGTERM 

echo "Started DW php code" 
# wait forever 
while true 
do 
    tail -f /dev/null & wait ${!} 
done 

正如你看到的,M1/M2的虚拟... m10挂载了图书馆,它真正在所有微服务中共享。

替代品: 您可以确保使用私有NPM软件包或在映像构建期间将共享库简单打包到微服务m1..m10中。

上面什么形容,当你想用很少的开销,以取代在堆栈中的共享库,并希望确保该库特别适合你以及在同步所有容器instancs

4

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

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

Loose coupling是一个设计目标,旨在减少系统组件之间的 相互依赖关系与 减少改变一个组件,就需要改变 在任何其他组件的风险的目的。松耦合是一个更为通用的概念,旨在增加系统的灵活性,使其更易于维护,并使整个框架更“稳定”。

简而言之,您不能拥有不同版本的记录器文件,但是您可以拥有不同版本的记录器npm软件包。使用NPM模块,可重用的组件Node.js的微服务

实现细节:

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

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

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

这是很好的信息..谢谢你们 – vaibhav