Node.js自动导航模式在Docker的应用
Posted 分布式实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js自动导航模式在Docker的应用相关的知识,希望对你有一定的参考价值。
Joyent公司作为云计算和服务提供商,不久前刚被三星公司并购。该公司开源了两个Node.js模块,Consulite和Piloted,旨在使用Node.js来整合Docker容器。本文通过实例介绍了如何使用这两个模块在Node.js中应用AutoPilot Patten(自动导航模式)在Docker容器中快捷地构建应用。
自动导航模式使得当程序被部署的时候能够自动根据配置构建应用程序变得非常简单(容易在开发和测试的时候获得一个拷贝),当应用程序更新或者由于故障需要扩展或者缩减的时候。接下来我们将通过两个Node.js模块如何使用自动导航模式更容易地构建app。
这两个模块分别是Consulite 和Piloted,使用npm
安装和如何为自动导航模式程序提供常用功能,其中包含使用Consul进行交互以及因为拓扑结构变更而重新加载配置文件的内容。这些虽然不是自动导航模式所必需,但是提供了更加便捷的方式。
让我们看看这两个模块是如何工作的。
在我们演示这些模块如何使用之前,让我们先快速浏览下容器导航(https://www.joyent.com/containerpilot)是如何与在Docker容器中运行的Node.js应用程序进行整合的。下面的图片说明了通常情况下一个应用程序的生命周期在容器导航中配置的要点。
如图所示,容器导航配置通常会发送一个SIGHUP
信号给Node.js应用程序。一旦发送完毕,不论这个应用程序是否依赖后台的变更。当容器导航通知这些后台依赖变更的时候,他不会发送应用程序的后台主机名以及端口信息。这个任务留着给应用开发人员决定如何去实现它。下图演示一个类似Consul(https://www.consul.io/)的典型数据流,从应用程序到容器导航再到服务注册的过程。
另一个对于容器导航目标而言,自动导航模式显著的收益是我们不需要注册你的应用到服务发现上了。服务导航为你管理这些常用任务,当出现中断或者任何应用依赖的服务发生变更的时候它会第一时间通知应用这一消息。
你无需再为服务注册和从注册订阅的消息担心,你需要知道的只是如何与注册者通信并定位应用依赖的主机及端口信息。Consulite(https://github.com/joyent/node-consulite)有助于使得获取这些应用依赖的服务信息变得便捷。正如Consul的名字一样,它实现了如何与consulite进行通讯的注册实现。
实现注册路由
让我们通过一个实例来演示consulite是如何使得这一切变得便捷和有意义的。这个例子源自Autopilot workshop(https://github.com/autopilotpattern/workshop),一个标准的销售者服务。
const Consulite = require('consulite'); const Wreck = require('wreck'); Consulite.getService('customers', (err, host) => { if (err) { return console.error(err); } Wreck.get(`http://${host.address}:${host.port}/data`, (err, res, customers) => { // Handle error or respond with relevant customer data }); });
管理注册变更
Consulite使得保持与缓存后的健康服务列表通讯变得异常容易,当服务器更新的时候也同时更新了这个服务列表。之前的例子中,已经演示了容器导航是如何当一个后台服务变更的时候通过向配置好的Node.js应用发送一个SIGHUP
信号通知。下面的实例演示了在容器导航中如何使用consulite管理可配置的onChange
行为来统一管理这些信号,目的是刷新这些本地服务缓存。
process.on('SIGHUP', () => { Consulite.refreshService('customers', (err) => { if (err) { console.error(err); } }); });
就算是一个应用开发人员都可以通过consulite很容易的调试容器导航,他们的职责仅仅只需计算一直保持通信的初始化服务列表来管理进程事件而以。为了解决这个问题我们创建了piloted项目。
Usage
const Piloted = require('piloted'); const Wreck = require('wreck'); const ContainerPilot = require('/etc/containerpilot.json'); Piloted.config(ContainerPilot, () => { const host = Piloted('customers'); Wreck.get(`http://${host.address}:${host.port}/data`, (err, res, customers) => { // Handle error or respond with relevant customer data }); });
上面的例子中容器导航的配置文件被加载到piloted中。在这之后,piloted将会维护一份本地的应用依赖健康服务列表。在这个事件中,一旦这些服务中有变更发生,piloted将会通过Consul更新这个列表信息到最新版本。
综上所述,遵循自动导航模式(https://www.joyent.com/blog/category:Autopilot+Pattern)构建Node.js应用将变得更加容易。如果你想查看完整的实例应用请访问Autopilot Workshop(https://github.com/autopilotpattern/workshop)仓库。一如既往,我们希望得到您的任何反馈和建议,请为我们的仓库提交问题。
本文为翻译文章,点击阅读原文链接可查看原文。
以上是关于Node.js自动导航模式在Docker的应用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 dokku node.js 应用程序中运行 docker 命令?