黑人生命也是命。
支持平等正义倡议.

健康检查和优雅关闭

优雅关闭

当你部署应用程序的新版本时,你必须替换之前的版本。进程管理器首先会向应用程序发送一个 SIGTERM 信号,通知它将被终止。一旦应用程序收到此信号,它应该停止接受新请求,完成所有正在进行的请求,清理它使用的资源,包括数据库连接和文件锁,然后退出。

优雅关闭示例

const server = app.listen(port)

process.on('SIGTERM', () => {
  debug('SIGTERM signal received: closing HTTP server')
  server.close(() => {
    debug('HTTP server closed')
  })
})

健康检查

负载均衡器使用健康检查来确定应用程序实例是否健康并且可以接受请求。例如,Kubernetes 有两个健康检查

第三方解决方案

警告:此信息涉及第三方网站、产品或模块,这些网站、产品或模块不受 Expressjs 团队维护。在此列出并不构成 Expressjs 项目团队的认可或推荐。

Terminus

Terminus 是一个开源项目,它为你的应用程序添加了运行状况检查和优雅关闭,从而无需编写样板代码。你只需为优雅关闭提供清理逻辑,为运行状况检查提供运行状况检查逻辑,而 terminus 会处理其余部分。

按以下方式安装 terminus

$ npm i @godaddy/terminus --save

以下是一个基本的模板,说明如何使用 terminus。有关更多信息,请参阅 https://github.com/godaddy/terminus

const http = require('http')
const express = require('express')
const { createTerminus } = require('@godaddy/terminus')

const app = express()

app.get('/', (req, res) => {
  res.send('ok')
})

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
}

createTerminus(server, {
  signal: 'SIGINT',
  healthChecks: { '/healthcheck': onHealthCheck },
  onSignal
})

server.listen(3000)

Lightship

Lightship 是一个开源项目,它为你的应用程序添加了运行状况、就绪性和活动性检查。Lightship 是一项独立的 HTTP 服务,作为一项独立的 HTTP 服务运行;这允许拥有运行状况-就绪性-活动性 HTTP 端点,而无需在公共接口上公开它们。

按以下方式安装 Lightship

$ npm install lightship

说明如何使用 Lightship 的基本模板

const http = require('http')
const express = require('express')
const {
  createLightship
} = require('lightship')

// Lightship will start a HTTP service on port 9000.
const lightship = createLightship()

const app = express()

app.get('/', (req, res) => {
  res.send('ok')
})

app.listen(3000, () => {
  lightship.signalReady()
})

// You can signal that the service is not ready using `lightship.signalNotReady()`.

Lightship 文档 提供了相应的 Kubernetes 配置 的示例,以及与 Express.js 集成的完整示例。

http-terminator

http-terminator 实现了一个逻辑,用于优雅地终止一个 express.js 服务器。

在 Node.js 中终止一个 HTTP 服务器需要跟踪所有打开的连接,并向它们发出服务器正在关闭的信号。http-terminator 实现了一个逻辑,用于跟踪所有连接及其在超时后的终止。http-terminator 还确保优雅地将服务器关闭意图传达给当前正在从该服务器接收响应的任何客户端。

按以下方式安装 http-terminator

$ npm install http-terminator

说明如何使用 http-terminator 的基本模板

const express = require('express')
const { createHttpTerminator } = require('http-terminator')

const app = express()

const server = app.listen(3000)

const httpTerminator = createHttpTerminator({ server })

app.get('/', (req, res) => {
  res.send('ok')
})

// A server will terminate after invoking `httpTerminator.terminate()`.
// Note: Timeout is used for illustration of delayed termination purposes only.
setTimeout(() => {
  httpTerminator.terminate()
}, 1000)

http-terminator 文档 提供了 API 文档,并与其他现有的第三方解决方案进行了比较。

express-actuator

express-actuator 是一款中间件,用于添加端点以帮助你监视和管理应用程序。

按以下方式安装 express-actuator

$ npm install --save express-actuator

说明如何使用 express-actuator 的基本模板

const express = require('express')
const actuator = require('express-actuator')

const app = express()

app.use(actuator())

app.listen(3000)

express-actuator 文档 提供了不同的自定义选项。