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;
 const http = require('http');

  const terminus = require('@godaddy/terminus');

  const server = http.createServer(app);

  function onSignal() {

   console.log('server is starting cleanup');

   // start cleanup of resource, like databases or file descriptors

 } 

 async function onHealthCheck() {

   // checks if the system is healthy, like the db connection is live

   // resolves, if health, rejects if not

   console.log('HealthCheck is starting');

 }
terminus(server, { signal: 'SIGINT', healthChecks: { '/healthcheck': onHealthCheck, }, onSignal }); server.listen(3000);

目前,只需要修改一下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

nodejs微服务健康检查方案的更多相关文章

  1. hydra nodejs 微服务框架简单试用

    hydra 是一个以来redis 的nodejs 微服务框架 安装 需要redis,使用docker 进行运行 redis docker run -d -p 6379:6379 redis 安装yo ...

  2. nodejs微服务

    近来公司增加了nodejs微服务 它的主要任务是接收来自于现场的采集数据:作业记录和流转记录,动态构建一个基地的全景实时数据        暂时不涉及数据库. 如果要进行数据库操作,不建议使用本模块, ...

  3. 【Spring Cloud】微服务架构选型方案

    1.技术架构 2.组件介绍 1.服务注册与发现——Eureka 服务注册与发现中心采用Eureka,以AP为核心的高可用注册中心,保证高可用性和最终一致性,server之间互相注册的replicate ...

  4. Nginx实战|Nginx健康检查

    开源Linux 长按二维码加关注~ 上一篇:盘点提高国内访问Github的速度的9种方案 服务治理的一个重要任务是感知服务节点变更,完成服务自动注册及异常节点的自动摘除.这就需要服务治理平台能够:及时 ...

  5. SpringCloud微服务实战——搭建企业级开发框架(四十五):【微服务监控告警实现方式二】使用Actuator(Micrometer)+Prometheus+Grafana实现完整的微服务监控

      无论是使用SpringBootAdmin还是使用Prometheus+Grafana都离不开SpringBoot提供的核心组件Actuator.提到Actuator,又不得不提Micrometer ...

  6. 微服务与SpringCloud简介

    A.官网 https://spring.io/projects/spring-cloud B.简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用 ...

  7. Spring Cloud与微服务构建:Spring Cloud简介

    Spring Cloud简介 微服务因该具备的功能 微服务可以拆分为"微"和"服务"二字."微"即小的意思,那到底多小才算"微&q ...

  8. 微服务时代之网关相关技术选型及部署(nacos+gateway)

    1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...

  9. 构建安全可靠的微服务 | Nacos 在颜铺 SaaS 平台的应用实践

    作者 | 殷铭  颜铺科技架构师 本文整理自架构师成长系列 3 月 19 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "319",即可获取对应直播回放链接 ...

随机推荐

  1. WinServer-授权规则

    授权规则: 使用谓词可以限制网站只能使用某一种请求 来自为知笔记(Wiz)

  2. [转]收集android上开源的酷炫的交互动画和视觉效果

    原文链接:http://www.open-open.com/lib/view/open1411443332703.html 描述:收集android上开源的酷炫的交互动画和视觉效果. 1.交互篇 2. ...

  3. POJ3684 Physics Experiment 【物理】

    Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1031   Accepted: 365 ...

  4. csdn第五届在线编程大赛-全然平方

    题目详情 给定整数区间[A,B]问当中有多少个全然平方数. 输入格式: 多组数据,包括两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包括一个 ...

  5. scp报错:Host key verification failed. REMOTE HOST IDENTIFICATION HAS CHANGED!

    1 scp报错:REMOTE HOST IDENTIFICATION HAS CHANGED! [root@xx ~]# scp yum-3.4.3.tar.gz 10.xx.xx.12:/root ...

  6. OpenMp之reduction求和

    // OpenMP1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include"omp.h" #include& ...

  7. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  8. Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)

    原创,转载注明:http://blog.csdn.net/u012150179/article/details/34913315 一.目的. 在教程(二)(http://blog.csdn.net/u ...

  9. leetCode 72.Edit Distance (编辑距离) 解题思路和方法

    Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert  ...

  10. 屌丝也能开发安卓版2048(App Inventor)

    想编写安卓游戏.java太难.来试试App Inventor.尽管有人觉得他是中学生的玩具,可是也能编写2048这种火爆游戏,不须要太复杂的算法. 整个游戏有几个模块: 一.游戏初始化 数列转化为图形 ...