Node.js + Consul 實(shí)現(xiàn)服務(wù)注冊(cè)、健康檢查、配置中心

圖片描述

本篇主要介紹了 Node.js 如何與 Consul 進(jìn)行集成,Consul 只是服務(wù)注冊(cè)的一種實(shí)現(xiàn),還有其它的例如 Zookeeper、Etcd 等,服務(wù)注冊(cè)發(fā)現(xiàn)在微服務(wù)架構(gòu)中扮演這一個(gè)重要的角色,伴隨著服務(wù)的大量出現(xiàn),服務(wù)與服務(wù)之間的配置管理、運(yùn)維管理也變的難以維護(hù),通過(guò) Consul 可以解決這些問(wèn)題,實(shí)現(xiàn)服務(wù)治理、服務(wù)監(jiān)控。

關(guān)于 Consul 的更多知識(shí)點(diǎn)不在這里贅述,但是在學(xué)習(xí)本節(jié)之前還是希望您能先了解下,請(qǐng)移步我之前寫的 微服務(wù)服務(wù)注冊(cè)發(fā)現(xiàn)之 Consul 系列文章

初始化 Consul 客戶端

初始化一個(gè) Consul 客戶端,關(guān)于 Node.js 中的 Consul 客戶端以下項(xiàng)目使用 node-consul 模塊。

核心配置說(shuō)明

  • host (String, default: 127.0.0.1): 配置 Consul 地址
  • port (Integer, default: 8500): 配置 Consul 端口
  • secure (Boolean, default: false): 啟用 HTTPS
  • promisify (Boolean|Function, optional): 啟動(dòng) Promise 風(fēng)格,默認(rèn)為 Callback

示例

const Consul = require('consul');

const consul = new Consul({
    host: '192.168.6.128',
    port: 8500,
    promisify: true,
});

服務(wù)注冊(cè)與健康檢查

注冊(cè)一個(gè)服務(wù)并啟動(dòng)健康檢查

核心配置說(shuō)明

  • name (String): 注冊(cè)的服務(wù)名稱
  • id (String, optional): 服務(wù)注冊(cè)標(biāo)識(shí)
  • tags (String[], optional): 服務(wù)標(biāo)簽
  • address (String, optional): 需要注冊(cè)的服務(wù)地址(客戶端)
  • port (Integer, optional): 需要注冊(cè)的服務(wù)端口(客戶端)
  • check (Object, optional): 服務(wù)的健康檢查核心參數(shù)如下
    • http (String): 健康檢查路徑, interval 參數(shù)為必須設(shè)置
    • interval (String): 健康檢查頻率
    • timeout (String, optional): 健康檢查超時(shí)時(shí)間
  • checks (Object[], optional): 如果有多個(gè)檢查的路徑,可采用對(duì)象數(shù)組形式,參數(shù)參照上面的 check

簡(jiǎn)單示例

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 + ' 注冊(cè)成功!');
})

配置Consul管理控制臺(tái)

Consul 提供了 Key/Value 存儲(chǔ),可以做為服務(wù)的配置中心,并且提供了 JSON、YAML、HCL 三種格式,在最早的 Consul 版本中只有一種 JSON 格式。

以下是我為 Consul 管控臺(tái)配置的數(shù)據(jù),如下圖所示:

圖片描述

服務(wù)配置中心實(shí)現(xiàn)

Consul 的 Key/Value 功能可以做為服務(wù)的配置中心,對(duì)于項(xiàng)目中一些可變化的參數(shù)信息,可配置在 Consul 中,這樣當(dāng)數(shù)據(jù)改變時(shí)候不用因?yàn)榕渲玫母亩鴮?dǎo)致項(xiàng)目還要重新發(fā)布

獲取配置信息

這個(gè) Key 為我們配置的路徑,例如我要獲取上面配置的 User 數(shù)據(jù),Key 就為 'develop/user'

consul.kv.get(key)

更新配置信息

  • key (String): 更新的路徑,例如 'develop/user'
  • value (String|Buffer): 更新的數(shù)據(jù)信息

注意:如果我們要更新 JSON 中的某個(gè)字段,首先我們需要先通過(guò) consul.kv.get 讀取到 JSON 對(duì)象,程序處理之后,做為 set 的第二個(gè)參數(shù)進(jìn)行傳遞更新。

consul.kv.set('develop/user', JSON.stringify(user))

HTTP API 調(diào)用

還可以直接通過(guò) HTTP API 接口直接調(diào)用,例如:http://192.168.6.128:8500/v1/kv/develop/user?raw,如果你只想用 Consul 做為配置中心,也可以通過(guò)簡(jiǎn)單的 HTTP API 調(diào)用將數(shù)據(jù)存入本地定時(shí)更新本地配置,但這要你自己去實(shí)現(xiàn)。

圖片描述

在Nodejs中進(jìn)行測(cè)試

以下為一個(gè)簡(jiǎn)單的 Demo 展示了在 Node.js 如何與 Consul 之間進(jìn)行服務(wù)注冊(cè)、健康檢查及配置中心的應(yīng)用,可以很好的將上面講解的理論知識(shí)進(jìn)行實(shí)踐。

封裝 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,
        });
        
        // 服務(wù)注冊(cè)與健康檢查配置
        this.consul.agent.service.register({
            name: serviceName,
            address: '192.168.20.193', // 注意:192.168.20.193 為我本地的內(nèi)網(wǎng) ip,通過(guò) 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 + ' 注冊(cè)成功!');
        })
    }
    
    async getConfig(key) {
        const result = await this.consul.kv.get(key);

        if (!result) {
            return Promise.reject(key + '不存在');
        }

        return JSON.parse(result.Value);
    }
    
    // 讀取 user 配置簡(jiǎn)單封裝
    async getUserConfig(key) {
        const result = await this.getConfig('develop/user');

        if (!key) {
            return result;
        }

        return result[key];
    }

    // 更新 user 配置簡(jiǎn)單封裝
    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;

編寫啟動(dòng)文件

// app.js
const http = require('http');
const ConsulConfig = require('./consul');
const consul = new ConsulConfig();

http.createServer(async (req, res) => {
    const {url, method} = req;

    // 測(cè)試健康檢查
    if (url === '/health') {
        res.end('OK!');
    }

    // 測(cè)試動(dòng)態(tài)讀取數(shù)據(jù)
    if (method === 'GET' && url === '/user/info') {
        const user = await consul.getUserConfig();
        res.end(`你好,我是 ${user.name} 今年 ${user.age}`);
    }

    // 測(cè)試數(shù)據(jù)更新
    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 為我本地的內(nèi)網(wǎng) ip,通過(guò) ifconfig 查看

接口測(cè)試

健康檢查接口

該接口在服務(wù)啟動(dòng)后且向 Consul 配置中心注冊(cè)后,根據(jù) consul.js 文件配置的服務(wù)注冊(cè)和健康檢查信息進(jìn)行自動(dòng)調(diào)用。

$ curl http://192.168.20.193:3000/health
OK!

注冊(cè)成功后展示我們服務(wù)的名稱及健康檢查結(jié)果如下:

圖片描述

圖片描述

獲取配置信息接口

$ curl http://192.168.20.193:3000/user/info
你好,我是 Jack 今年 20

更新配置信息接口

$ curl -X POST http://192.168.20.193:3000/user
OK!

更新之后重新獲取配置

可以看到使用 Consul 做為配置中心之后,在我的項(xiàng)目沒(méi)有重啟的情況下也是可以實(shí)現(xiàn)數(shù)據(jù)動(dòng)態(tài)變更的。

$ curl http://192.168.20.193:3000/user/info
你好,我是 Jack 今年 18

本節(jié)源碼 Github 地址:Node.js + Consul 實(shí)現(xiàn)服務(wù)注冊(cè)、健康檢查、配置中心 Demo

總結(jié)

總結(jié)起來(lái)本文主要講解了 Consul 的三個(gè)功能點(diǎn)在 Node.js 中的應(yīng)用,客戶端進(jìn)行服務(wù)注冊(cè)成功之后,則可以在 Consul 管控臺(tái)看到當(dāng)前的服務(wù)列表。健康檢查功能,可以檢查接口的可用性,進(jìn)一步還可以做運(yùn)維監(jiān)控報(bào)警,配置中心這個(gè)對(duì)于我們開(kāi)發(fā)者是很實(shí)用的,有了它可以做一些運(yùn)行時(shí)配置。

Consul 的應(yīng)用并非只有上面介紹的三點(diǎn),通過(guò) Consul 還可以做負(fù)載均衡、分布式鎖,有沒(méi)有感覺(jué)很厲害 ing,這個(gè)功能是我之前在看 Spring Cloud Consul 的時(shí)候了解到的,歡迎關(guān)注「Nodejs技術(shù)棧 」公眾號(hào),關(guān)于這些后續(xù)實(shí)踐之后也會(huì)進(jìn)行分享。

閱讀推薦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容