nodejs微服務健康檢查方案

1. 前言

針對目前雲平臺方案,由於網絡、主機狀態等諸多因素,單臺主機上的服務出現問題的概率大大增長。這就要求咱們可以監控每臺主機、每一個微服務實例的健康狀態。所以對於nodejs相關項目須要作相關的微服務健康檢查接口。html

在不改動原有express框架的基礎上,我在express官方網站上查找到相應的健康檢查的樣例,作成demo供你們參考。node

(連接https://expressjs.com/en/advanced/healthcheck-graceful-shutdown.html)git

2. 方案實現demo

我是以agent作的demo,如下是我修改的app.js代碼:紅色代碼爲我添加的的部分。爲容器提供對應的健康檢查端口。github

var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session'); var RedisStore = require('connect-redis')(session); var config = require('./config/config').getInstance().config; var logg = config.logger; var moment = require('moment'); var comm = require('./middlewares/comm'); var routes = require('./routes/index'); var app = express(); app.set('env', config.debug ? 'development' : 'production'); app.set('port', process.env.PORT || config.port); app.set('trust proxy', config.proxy); // 指定子網和 IP 地址
 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); //session redis存儲
 const store = new RedisStore({ host: config.redis.host, port: config.redis.port, pass: config.redis.passwd, }); //設置session
 app.use(session({ store: store, name: 'ghjhgz', secret: 'dfgdfgfdgdfgdfgderte435sd', resave: true, rolling: true, saveUninitialized: false, cookie: {domain: config.domain} })); // 添加模板必需的變量
 app.use(function (req, res, next) { res.locals.user = ''; next(); }); routes(app); // error handler
 app.use(function (err, req, res, next) { // set locals, only providing error in development
 logg.error(err); res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page
 res.status(err.status || 500); if(config.debug){ res.render('error'); }else{ res.render('404'); } }); /* istanbul ignore next */

if (!module.parent) { app.listen(config.port, function () { console.log('listening on port: ' + config.port); }); } module.exports = app;
View Code

 

 1 const http = require('http');  2 
 3  const terminus = require('@godaddy/terminus');  4 
 5  const server = http.createServer(app);  6 
 7  function onSignal() {  8 
 9   console.log('server is starting cleanup'); 10 
11   // start cleanup of resource, like databases or file descriptors
12 
13 } 14 
15 async function onHealthCheck() { 16 
17   // checks if the system is healthy, like the db connection is live
18 
19   // resolves, if health, rejects if not
20 
21   console.log('HealthCheck is starting'); 22 
23 } 24 terminus(server, { 25 
26   signal: 'SIGINT', 27 
28  healthChecks: { 29 
30     '/healthcheck': onHealthCheck, 31 
32  }, 33 
34  onSignal 35 
36 }); 37 
38 server.listen(3000);
View Code

 目前,只須要修改一下app.js,onHealthCheck函數接口爲健康檢查接口,後續能夠提供檢查對應的系統健康,好比數據庫或者redis連接狀態等。redis

 2.1 依賴庫terminus數據庫

 安裝依賴express

npm i @godaddy/terminus --save

Terminus是一個開放源代碼項目,它將健康檢查和正常關閉添加到您的應用程序中,從而無需編寫樣板代碼。您只需提供用於正常關閉的清理邏輯和用於運行情況檢查的運行情況檢查邏輯,而終點則處理其他部分。npm

2.2 有限的Windows支持

因爲固有的平臺限制,terminus對Windows的支持有限。你能夠指望SIGINT工做,以及在SIGBREAK某種程度上SIGHUP。可是,SIGTERM在Windows上永遠不會工做,由於在任務管理器中查殺進程是無條件的,也就是說,應用程序沒法檢測或阻止進程。json

2.3 Terminus源碼GitHub地址

https://github.com/godaddy/terminuscookie

3. Kubernetes對應的接口

使用livenessProbe探針對開放的端口進行檢測。

livenessProbe: httpGet: path: /healthcheck      #對應應用的健康路徑
            port: 3000 #統一的健康檢查端口,在雲平臺內部不會出現端口衝突 initialDelaySeconds: 15 periodSeconds: 5 timeoutSeconds: 1
View Code
相關文章
相關標籤/搜索