Node.js自动导航模式在Docker的应用

简介: 本文讲的是Node.js自动导航模式在Docker的应用【编者的话】Joyent公司作为云计算和服务提供商,不久前刚被三星公司并购。该公司开源了两个Node.js模块,Consulite和Piloted,旨在使用Node.js来整合Docker容器。
本文讲的是Node.js自动导航模式在Docker的应用【编者的话】Joyent公司作为云计算和服务提供商,不久前刚被三星公司并购。该公司开源了两个Node.js模块,Consulite和Piloted,旨在使用Node.js来整合Docker容器。本文通过实例介绍了如何使用这两个模块在Node.js中应用AutoPilot Patten(自动导航模式)在Docker容器中快捷地构建应用。

自动导航模式使得当程序被部署的时候能够自动根据配置构建应用程序变得非常简单(容易在开发和测试的时候获得一个拷贝),当应用程序更新或者由于故障需要扩展或者缩减的时候。接下来我们将通过两个Node.js模块如何使用自动导航模式更容易地构建app。

这两个模块分别是 Consulite  和 Piloted ,使用 npm 安装和如何为自动导航模式程序提供常用功能,其中包含使用Consul进行交互以及因为拓扑结构变更而重新加载配置文件的内容。这些虽然不是自动导航模式所必需,但是提供了更加便捷的方式。

让我们看看这两个模块是如何工作的。

为Node.js提供容器导航

在我们演示这些模块如何使用之前,让我们先快速浏览下 容器导航 是如何与在Docker容器中运行的Node.js应用程序进行整合的。下面的图片说明了通常情况下一个应用程序的生命周期在 容器导航 中配置的要点。
app-lifecycle.png

如图所示, 容器导航 配置通常会发送一个 SIGHUP 信号给Node.js应用程序。一旦发送完毕,不论这个应用程序是否依赖后台的变更。当 容器导航 通知这些后台依赖变更的时候,他不会发送应用程序的后台主机名以及端口信息。这个任务留着给应用开发人员决定如何去实现它。下图演示一个类似 Consul 的典型数据流,从应用程序到 容器导航 再到服务注册的过程。
app-flow.png

上面的模块是设计被用来解决上图所示的经常遇到的问题,比如处理后台地址由于 onChange 事件而需要重新加载的情况。当后台服务变更的时候 onChange 事件触发。这有可能是因为某个后台服务突然不健康或者新的后台地址通过Consul注册而造成的。无论是哪种方式,容器导航都会执行已经配置好的命令通知Node.js应用。

保存一份应用依赖的健康的后台地址清单对 自动导航模式 而言影响重大。其中一个原因是最初的设计就是为了能够提前了解应用的健康情况,为了确保请求不会被发送到那些不健康的后台服务。这也意味着负载均衡器对部署一个应用及后台服务而言不再那么重要了。

Consulite

另一个对于 容器导航 目标而言, 自动导航模式 显著的收益是我们不需要注册你的应用到服务发现上了。服务导航为你管理这些常用任务,当出现中断或者任何应用依赖的服务发生变更的时候它会第一时间通知应用这一消息。

你无需再为服务注册和从注册订阅的消息担心,你需要知道的只是如何与注册者通信并定位应用依赖的主机及端口信息。 Consulite 有助于使得获取这些应用依赖的服务信息变得便捷。正如Consul的名字一样,它实现了如何与 consulite 进行通讯的注册实现。

实现注册路由

让我们通过一个实例来演示consulite是如何使得这一切变得便捷和有意义的。这个例子源自 Autopilot 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
});
});

在上面的例子中,没有任何消费者服务被缓存,那么Consul将使得一个请求获取到所有健康的服务地址列表。通常情况,会为一个特定服务提供多功能后台地址列表。为了建立这个服务, consulite 将会循环遍历这个地址列表。循环的逻辑从当前地址列表的第一个还没有被使用的地址直到最后一个地址完全被使用。这些在一个模块中实现功能的结果有助于减少使用Consul保持与这个地址列表通讯的资源消耗。

管理注册变更

Consulite 使得保持与缓存后的健康服务列表通讯变得异常容易,当服务器更新的时候也同时更新了这个服务列表。之前的例子中,已经演示了容器导航是如何当一个后台服务变更的时候通过向配置好的Node.js应用发送一个 SIGHUP 信号通知。下面的实例演示了在 容器导航 中如何使用 consulite 管理可配置的 onChange 行为来统一管理这些信号,目的是刷新这些本地服务缓存。
process.on('SIGHUP', () => {
Consulite.refreshService('customers', (err) => {
if (err) {
  console.error(err);
}
});
});

就算是一个应用开发人员都可以通过 consulite 很容易的调试 容器导航 ,他们的职责仅仅只需计算一直保持通信的初始化服务列表来管理进程事件而以。为了解决这个问题我们创建了 piloted 项目。

Piloted项目

为了代替应用程序开发人员去实现管理 SIGNUP 事件以及初始化服务地址列表加载,我们决定用 piloted 模块来处理这些工作。所有应用依赖的后台和服务们都已经配置在了 containerpilot.json 的配置文件中。因此应用开发人员可以通过 piloted 来替换这些配置信息,且它会自动加载,并为应用保存一份健康的后台地址信息列表。下面的例子演示了如何发送已经 piloted 的配置文件信息并取回 customers 服务的后台服务地址列表。

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更新这个列表信息到最新版本。

另一个使用这个模块的好处是你只需要配置一次 piloted ,就可以在运行时对同一线程获得对应用更广泛的服务地址的管理权限。

总结

综上所述,遵循 自动导航模式 构建Node.js应用将变得更加容易。如果你想查看完整的实例应用请访问 Autopilot Workshop 仓库。一如既往,我们希望得到您的任何反馈和建议,请为我们的仓库提交问题。

原文链接:Autopilot Pattern Node.js in Docker(翻译:隋鑫)

原文发布时间为:2016-09-13

本文作者:隋鑫

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Node.js自动导航模式在Docker的应用

相关文章
|
13天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
4天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
4天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
13天前
|
关系型数据库 MySQL Shell
4.Docker 应用部署
4.Docker 应用部署
|
1天前
|
存储 监控 JavaScript
使用Node.js构建实时聊天应用的技术指南
【5月更文挑战第12天】本文指导使用Node.js、Express.js和Socket.IO构建实时聊天应用。技术栈包括Node.js作为服务器环境、WebSocket协议、Express.js作为Web框架和Socket.IO处理实时通信。步骤包括项目初始化、安装依赖、搭建服务器、实现实时聊天功能、运行应用以及后续的完善和部署建议。通过这个指南,读者可以学习到创建简单实时聊天应用的基本流程。
|
4天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
4天前
|
机器学习/深度学习 人工智能 异构计算
【Docker 专栏】Docker 与 GPU 加速应用的结合
【5月更文挑战第9天】GPU加速技术在处理大规模数据和复杂计算时展现强大性能,尤其在AI和深度学习领域。Docker作为轻量级容器化工具,提供隔离、可移植和高效的环境。结合GPU加速,关键在于容器访问GPU设备和安装相应驱动。NVIDIA提供了支持工具,允许Docker利用GPU。应用场景包括人工智能、科学计算和视频处理。优势包括资源利用率提升和部署灵活性,但面临驱动兼容性、资源管理和监控调试的挑战。未来,随着技术发展,Docker与GPU加速在边缘计算中的应用将有广阔前景。
【Docker 专栏】Docker 与 GPU 加速应用的结合
|
5天前
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
【Docker 专栏】Docker 容器内应用的调试与故障排除
|
5天前
|
开发框架 安全 网络安全
【Docker 专栏】Docker 多平台应用构建与部署
【5月更文挑战第8天】Docker作为一种关键的容器化技术,简化了多平台应用的构建与部署。它提供一致的运行环境,确保应用在不同平台无缝运行;通过分层构建机制加速镜像创建,提升开发效率。Docker的可移植性、高效部署及资源利用率是其主要优势。流程包括开发环境准备、构建镜像、测试验证及部署。然而,面临操作系统差异、网络安全和资源限制等挑战,需注意安全、版本管理和性能优化。Docker在多平台场景的应用将持续发挥价值。
【Docker 专栏】Docker 多平台应用构建与部署
|
6天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用