本篇主要介紹了 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技術棧 」公衆號,關於這些後續實踐以後也會進行分享。