terminus:为任意 HTTP 应用添加优雅关闭与 Kubernetes 健康检查

Graceful shutdown and Kubernetes readiness / liveness checks for any Node.js HTTP applications

分支13Tags43
文件最后提交记录最后更新时间
2 年前
3 年前
3 年前
3 年前
8 年前
5 年前
5 年前
3 年前
3 年前
8 年前
2 年前
7 年前
7 年前
3 年前
3 年前

终止器(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上永远不会生效,因为在任务管理器中结束进程是无条件的,即应用程序无法检测或阻止这一行为。 为了更深入地了解SIGINTSIGBREAK等信号的意义以及它们在Windows上受支持的情况,请参考来自libuv的相关文档 - http://docs.libuv.org/en/v1.x/signal.html。 此外,您还可以查阅https://nodejs.org/api/process.html#process_signal_events,以获得更多关于Node.js中信号事件的信息。

项目介绍

优雅关机及为任何Node.js HTTP应用提供的Kubernetes就绪/存活检查【此简介由AI生成】

定制我的领域
261.91 K94访问 GitHub