Node.js + Consul 實現服務註冊、健康檢查、配置中心

圖片描述

本篇主要介紹了 Node.js 如何與 Consul 進行集成,Consul 只是服務註冊的一種實現,還有其它的例如 Zookeeper、Etcd 等,服務註冊發如今微服務架構中扮演這一個重要的角色,伴隨着服務的大量出現,服務與服務之間的配置管理、運維管理也變的難以維護,經過 Consul 能夠解決這些問題,實現服務治理、服務監控。node

關於 Consul 的更多知識點不在這裏贅述,可是在學習本節以前仍是但願您能先了解下,請移步我以前寫的 微服務服務註冊發現之 Consul 系列文章git

初始化 Consul 客戶端

初始化一個 Consul 客戶端,關於 Node.js 中的 Consul 客戶端如下項目使用 node-consul 模塊。github

核心配置說明面試

  • host (String, default: 127.0.0.1): 配置 Consul 地址
  • port (Integer, default: 8500): 配置 Consul 端口
  • secure (Boolean, default: false): 啓用 HTTPS
  • promisify (Boolean|Function, optional): 啓動 Promise 風格,默認爲 Callback

示例數組

const Consul = require('consul');

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

服務註冊與健康檢查

註冊一個服務並啓動健康檢查bash

核心配置說明架構

  • name (String): 註冊的服務名稱
  • id (String, optional): 服務註冊標識
  • tags (String[], optional): 服務標籤
  • address (String, optional): 須要註冊的服務地址(客戶端)
  • port (Integer, optional): 須要註冊的服務端口(客戶端)
  • check (Object, optional): 服務的健康檢查覈心參數以下
    • http (String): 健康檢查路徑, interval 參數爲必須設置
    • interval (String): 健康檢查頻率
    • timeout (String, optional): 健康檢查超時時間
  • checks (Object[], optional): 若是有多個檢查的路徑,可採用對象數組形式,參數參照上面的 check

簡單示例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管理控制檯

Consul 提供了 Key/Value 存儲,能夠作爲服務的配置中心,而且提供了 JSON、YAML、HCL 三種格式,在最先的 Consul 版本中只有一種 JSON 格式。負載均衡

如下是我爲 Consul 管控臺配置的數據,以下圖所示:運維

圖片描述

服務配置中心實現

Consul 的 Key/Value 功能能夠作爲服務的配置中心,對於項目中一些可變化的參數信息,可配置在 Consul 中,這樣當數據改變時候不用由於配置的更改而致使項目還要從新發布

獲取配置信息

這個 Key 爲咱們配置的路徑,例如我要獲取上面配置的 User 數據,Key 就爲 'develop/user'

consul.kv.get(key)
複製代碼

更新配置信息

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

注意:若是咱們要更新 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 調用將數據存入本地定時更新本地配置,但這要你本身去實現。

圖片描述

在Nodejs中進行測試

如下爲一個簡單的 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技術棧 」公衆號,關於這些後續實踐以後也會進行分享。

閱讀推薦

相關文章
相關標籤/搜索