nodejs微服務健康檢查方案


1. 前言

針對目前雲平台方案,因為網絡、主機狀態等諸多因素,單台主機上的服務出現問題的幾率大大增加。這就要求我們能夠監控每台主機、每個微服務實例的健康狀態。因此對於nodejs相關項目需要做相關的微服務健康檢查接口。

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

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

2. 方案實現demo

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

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鏈接狀態等。

 2.1 依賴庫terminus

 安裝依賴

npm i @godaddy/terminus --save

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

2.2 有限的Windows支持

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

2.3 Terminus源碼GitHub地址

https://github.com/godaddy/terminus

3. Kubernetes對應的接口

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

livenessProbe: httpGet: path: /healthcheck      #對應應用的健康路徑
            port: 3000 #統一的健康檢查端口,在雲平台內部不會出現端口沖突 initialDelaySeconds: 15 periodSeconds: 5 timeoutSeconds: 1
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM