Graceful shutdown and Kubernetes readiness / liveness checks for any Node.js HTTP applications
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 8 年前 | ||
| 5 年前 | ||
| 5 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 8 年前 | ||
| 2 年前 | ||
| 7 年前 | ||
| 7 年前 | ||
| 3 年前 | ||
| 3 年前 |
以下内容由 AI 翻译,如有问题请 点此提交 issue 反馈
终止器(Terminus)
为任意HTTP应用程序添加优雅的关闭机制和Kubernetes就绪/存活检查。
安装
通过npm安装:
npm install @godaddy/terminus --save
使用
const http = require('http');
const { createTerminus } = require('@godaddy/terminus');
// 处理信号(如服务清理)
function onSignal() {
console.log('服务器正在启动清理过程');
return Promise.all([
// 添加您的清理逻辑,例如关闭数据库连接
]);
}
// 关闭前执行的操作
function onShutdown() {
console.log('清理完成,服务器即将关闭');
}
// 健康检查函数
function healthCheck({ state }) {
// `state.isShuttingDown` 显示服务器是否正在进行关闭
return Promise.resolve(
// 可选地包括一个解析值,以包含在健康检查响应中作为信息
);
}
const server = http.createServer((request, response) => {
response.end(`
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
`);
});
// 终结器配置选项
const options = {
// 健康检查设置
healthChecks: {
'/healthcheck': healthCheck, // 健康检查函数,返回服务健康状况的承诺,
verbatim: true, // 是否直接使用/healthcheck返回的对象作为响应内容,默认为false,
__unsafeExposeStackTraces: true // 如果健康检查抛出错误,是否在错误响应中返回堆栈跟踪,默认为false
},
// 可选参数,包括成功和失败的响应码与消息,
// 清理选项,
timeout: 1000, // 强制退出前的毫秒数,默认为1000,
signal: 'SIGTERM', // 监听的信号,默认为'SIGTERM',
...更多可选配置项,
// 创建终结器实例
createTerminus(server, options);
// 启动监听
server.listen(PORT || 3000);
自定义错误消息
const { createTerminus, HealthCheckError } = require('@godaddy/terminus');
createTerminus(server, {
healthChecks: {
'/healthcheck': async () => {
const errors = [];
try {
// 这里执行所有健康检查
} catch (error) {
errors.push(error);
}
if (errors.length) {
throw new HealthCheckError('健康检查失败', errors);
}
}
}
});
自定义响应头
const { createTerminus, HealthCheckError } = require('@godaddy/terminus');
const app = express();
// 配置健康检查及响应头
createTerminus(server, {
healthChecks: {/*...*/},
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "OPTIONS, POST, GET"
}
});
server.listen(3000);
结合Express框架
const app = express();
const server = http.createServer(app);
// 设置终止器选项并应用
createTerminus(server, { /* 选项 */ });
server.listen(PORT || 3000);
在Koa框架中使用
const app = new Koa();
const server = http.createServer(app.callback());
createTerminus(server, { /* 配置 */ });
server.listen(PORT || 3000);
结合Kubernetes使用
当在Kubernetes环境中运行时,可以通过配置beforeShutdown来延迟关闭进程,确保与Kubernetes就绪探针协同工作,避免客户端连接突然中断。还可以利用useExit0: true告知Kubernetes容器已正常退出。
function beforeShutdown() {
return new Promise(resolve => setTimeout(resolve, 5000)); // 等待5秒,匹配Kubernetes就绪探针间隔
}
createTerminus(server, {
beforeShutdown,
useExit0: true
});
详细讨论可在提供的链接和GitHub仓库中找到,以实现与Kubernetes环境的最佳集成。
对Windows支持有限
由于平台固有限制,terminus在Windows上具有有限的支持。
您可以期待SIGINT正常工作,以及SIGBREAK和一定程度上的SIGHUP。
然而,SIGTERM在Windows上永远不会生效,因为在任务管理器中结束进程是无条件的,即应用程序无法检测或阻止这一行为。
为了更深入地了解SIGINT、SIGBREAK等信号的意义以及它们在Windows上受支持的情况,请参考来自libuv的相关文档 - http://docs.libuv.org/en/v1.x/signal.html。
此外,您还可以查阅https://nodejs.org/api/process.html#process_signal_events,以获得更多关于Node.js中信号事件的信息。