本篇主要介绍了 Node.js 如何与 Consul 进行集成,Consul 只是服务注册的一种实现,还有其它的例如 Zookeeper、Etcd 等,服务注册发如今微服务架构中扮演这一个重要的角色,伴随着服务的大量出现,服务与服务之间的配置管理、运维管理也变的难以维护,经过 Consul 能够解决这些问题,实现服务治理、服务监控。node
关于 Consul 的更多知识点不在这里赘述,可是在学习本节以前仍是但愿您能先了解下,请移步我以前写的 微服务服务注册发现之 Consul 系列文章。git
初始化一个 Consul 客户端,关于 Node.js 中的 Consul 客户端如下项目使用 node-consul 模块。github
核心配置说明面试
示例数组
const Consul = require('consul');
const consul = new Consul({
host: '192.168.6.128',
port: 8500,
promisify: true,
});
复制代码
注册一个服务并启动健康检查bash
核心配置说明架构
简单示例app
consul.agent.service.register({
name: serviceName,
address: '192.168.20.193',
port: 3000,
check: {
http: 'http://192.168.20.193:3000/health',
interval: '10s',
timeout: '5s',
}
}, function(err, result) {
if (err) {
console.error(err);
throw err;
}
console.log(serviceName + ' 注册成功!');
})
复制代码
Consul 提供了 Key/Value 存储,能够作为服务的配置中心,而且提供了 JSON、YAML、HCL 三种格式,在最先的 Consul 版本中只有一种 JSON 格式。负载均衡
如下是我为 Consul 管控台配置的数据,以下图所示:运维
Consul 的 Key/Value 功能能够作为服务的配置中心,对于项目中一些可变化的参数信息,可配置在 Consul 中,这样当数据改变时候不用由于配置的更改而致使项目还要从新发布
获取配置信息
这个 Key 为咱们配置的路径,例如我要获取上面配置的 User 数据,Key 就为 'develop/user'
consul.kv.get(key)
复制代码
更新配置信息
注意:若是咱们要更新 JSON 中的某个字段,首先咱们须要先经过 consul.kv.get 读取到 JSON 对象,程序处理以后,作为 set 的第二个参数进行传递更新。
consul.kv.set('develop/user', JSON.stringify(user))
复制代码
HTTP API 调用
还能够直接经过 HTTP API 接口直接调用,例如:http://192.168.6.128:8500/v1/kv/develop/user?raw,若是你只想用 Consul 作为配置中心,也能够经过简单的 HTTP API 调用将数据存入本地定时更新本地配置,但这要你本身去实现。
如下为一个简单的 Demo 展现了在 Node.js 如何与 Consul 之间进行服务注册、健康检查及配置中心的应用,能够很好的将上面讲解的理论知识进行实践。
封装 Consul
// consul.js
const Consul = require('consul');
class ConsulConfig {
constructor () {
const serviceName = 'consul-demo';
// 初始化 consul
this.consul = new Consul({
host: '192.168.6.128',
port: 8500,
promisify: true,
});
// 服务注册与健康检查配置
this.consul.agent.service.register({
name: serviceName,
address: '192.168.20.193', // 注意:192.168.20.193 为我本地的内网 ip,经过 ifconfig 查看
port: 3000,
check: {
http: 'http://192.168.20.193:3000/health',
interval: '10s',
timeout: '5s',
}
}, function(err, result) {
if (err) {
console.error(err);
throw err;
}
console.log(serviceName + ' 注册成功!');
})
}
async getConfig(key) {
const result = await this.consul.kv.get(key);
if (!result) {
return Promise.reject(key + '不存在');
}
return JSON.parse(result.Value);
}
// 读取 user 配置简单封装
async getUserConfig(key) {
const result = await this.getConfig('develop/user');
if (!key) {
return result;
}
return result[key];
}
// 更新 user 配置简单封装
async setUserConfig(key, val) {
const user = await this.getConfig('develop/user');
user[key] = val;
return this.consul.kv.set('develop/user', JSON.stringify(user))
}
}
module.exports = ConsulConfig;
复制代码
编写启动文件
// app.js
const http = require('http');
const ConsulConfig = require('./consul');
const consul = new ConsulConfig();
http.createServer(async (req, res) => {
const {url, method} = req;
// 测试健康检查
if (url === '/health') {
res.end('OK!');
}
// 测试动态读取数据
if (method === 'GET' && url === '/user/info') {
const user = await consul.getUserConfig();
res.end(`你好,我是 ${user.name} 今年 ${user.age}`);
}
// 测试数据更新
if (method === 'POST' && url === '/user') {
try {
await consul.setUserConfig('age', 18) // 将 age 更改成 18
res.end('OK!');
} catch (err) {
console.error(err);
res.end('ERROR!');
}
}
}).listen(3000, '192.168.20.193'); // 192.168.20.193 为我本地的内网 ip,经过 ifconfig 查看
复制代码
健康检查接口
该接口在服务启动后且向 Consul 配置中心注册后,根据 consul.js 文件配置的服务注册和健康检查信息进行自动调用。
$ curl http://192.168.20.193:3000/health
OK!
复制代码
注册成功后展现咱们服务的名称及健康检查结果以下:
$ curl http://192.168.20.193:3000/user/info
你好,我是 Jack 今年 20
复制代码
更新配置信息接口
$ curl -X POST http://192.168.20.193:3000/user
OK!
复制代码
更新以后从新获取配置
能够看到使用 Consul 作为配置中心以后,在个人项目没有重启的状况下也是能够实现数据动态变动的。
$ curl http://192.168.20.193:3000/user/info
你好,我是 Jack 今年 18
复制代码
本节源码 Github 地址:Node.js + Consul 实现服务注册、健康检查、配置中心 Demo
总结起来本文主要讲解了 Consul 的三个功能点在 Node.js 中的应用,客户端进行服务注册成功以后,则能够在 Consul 管控台看到当前的服务列表。健康检查功能,能够检查接口的可用性,进一步还能够作运维监控报警,配置中心这个对于咱们开发者是很实用的,有了它能够作一些运行时配置。
Consul 的应用并不是只有上面介绍的三点,经过 Consul 还能够作负载均衡、分布式锁,有没有感受很厉害 ing,这个功能是我以前在看 Spring Cloud Consul 的时候了解到的,欢迎关注「Nodejs技术栈 」公众号,关于这些后续实践以后也会进行分享。