当前位置: 首页 > news >正文

godaddy/terminus 健康检查

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

相关文章:

  • node 中nextjs
  • 利用visual source safe管理代码
  • 【Nest 极速指南】应用篇之 ElasticSearch
  • next 微服务
  • 服务器拉取git代码
  • 专用来回TOO OLD的用的火星帖,今天翻出来又再感叹一下!
  • [技术娱乐]How to make love
  • [Nginx]反向代理Node将3000端口访问转换成80端口
  • nginx报错nginx: [error] open() “/run/nginx.pid” failed (2: No such file or directory)
  • 大连出现今年首次浮尘天气 全市大气重度污染
  • Nginx重启时提示nginx: [emerg] bind() to 0.0.0.0解决方法 老蒋 发布于 2019-06-03 分类:运维笔记 评论(0) 2000+站长交流QQ群: 59
  • 个人签名备份一下
  • create-react-app安装react项目,yurn一直报错 create-react-app安装react项目,yurn一直报错,错误如下图
  • 时空数据模型简介
  • mysql 5.7.18版本安装说明
  • [nginx文档翻译系列] 控制nginx
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 技术发展面试
  • 目录与文件属性:编写ls
  • 算法-插入排序
  • ​学习一下,什么是预包装食品?​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Linux(make工具和makefile文件以及makefile语法)
  • (9)STL算法之逆转旋转
  • (C语言)球球大作战
  • (Git) gitignore基础使用
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (九)信息融合方式简介
  • (转)Linq学习笔记
  • (转)大型网站的系统架构
  • (轉貼) UML中文FAQ (OO) (UML)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .net FrameWork简介,数组,枚举
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET单元测试
  • .NET的微型Web框架 Nancy
  • .NET和.COM和.CN域名区别
  • [ C++ ] STL---仿函数与priority_queue
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [HDOJ4911]Inversion
  • [HNOI2018]排列
  • [IE编程] 如何获得IE版本号
  • [leetcode] 103. 二叉树的锯齿形层次遍历
  • [Linux]于Mac在配置Linuxserver安装Nginx+PHP
  • [Operating System] {ud923} P4L4: Datacenter Technologies
  • [Shell]Linux常用快捷键
  • [Spring Boot 2]整合持久层技术
  • [week5]每周总结与工作计划
  • [编]使用AutoCompleteExtender实现文本框自动匹配