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

Nest集成健康检查

文章目录

  • 前言
    • ✅ NestJS 健康检查集成思路(标准实践)
      • 📦 推荐使用官方包:
    • 🧱 结构设计
      • ✅ 1. 创建健康模块
      • ✅ 2. 集成 `@nestjs/terminus`
        • `health.module.ts`
        • `health.controller.ts`
      • ✅ 3. 在 AppModule 注册模块
    • 🔍 支持的指标组件(可选引入)
    • 📋 典型输出格式(符合 Kubernetes 要求):
    • 💡 增强建议


前言

健康检查(Health Check)是服务治理的基础能力,主要用于让运维平台、K8s、负载均衡、监控系统等自动探测你的服务是否健康可用,并在服务异常时自动重启、摘除或告警。

  1. 核心思路
    暴露一个健康检查接口(如 /health、/actuator/health),外部系统定时访问。
    接口返回服务健康状态(如 200 OK + 简明 JSON)。
    检查内容可扩展:不仅仅是进程存活,还可以检测数据库、缓存、外部依赖、磁盘空间等。

在NestJS 项目中,健康检查(Health Check)模块是必须集成的组件,尤其是部署在 Kubernetes、ECS、容器平台或对接服务网关时,便于实现:

  • 存活探针(liveness)
  • 就绪探针(readiness)
  • 服务自我诊断(数据库、缓存、第三方接口)
  • Prometheus 状态采集

✅ NestJS 健康检查集成思路(标准实践)

📦 推荐使用官方包:

pnpm add @nestjs/terminus

🧱 结构设计

✅ 1. 创建健康模块

nest g module health
nest g controller health

✅ 2. 集成 @nestjs/terminus

health.module.ts
import { Module } from '@nestjs/common';
import { TerminusModule } from '@nestjs/terminus';
import { HealthController } from './health.controller';@Module({imports: [TerminusModule],controllers: [HealthController],
})
export class HealthModule {}

health.controller.ts
import {Controller,Get,
} from '@nestjs/common';
import {HealthCheckService,HttpHealthIndicator,TypeOrmHealthIndicator,HealthCheck,
} from '@nestjs/terminus';@Controller('health')
export class HealthController {constructor(private health: HealthCheckService,private http: HttpHealthIndicator,private db: TypeOrmHealthIndicator, // 或 MongooseHealthIndicator、PrismaHealthIndicator) {}@Get()@HealthCheck()check() {return this.health.check([() => this.http.pingCheck('nestjs-docs', 'https://docs.nestjs.com'),() => this.db.pingCheck('database'),]);}
}

// src/health/health.service.ts

import { Injectable, Inject } from '@nestjs/common';
import {HealthIndicatorResult,HealthCheckError,
} from '@nestjs/terminus';
import { Logger } from 'winston';
import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston';
import Redis from 'ioredis';
import { DingTalkHelper } from '../utils/ding.helper';
import { PrismaService } from '../prisma/prisma.service';
import DailyRotateFile from 'winston-daily-rotate-file';@Injectable()
export class HealthIndicatorService {constructor(private readonly prisma: PrismaService,@Inject('REDIS_CLIENT') private redisClient: Redis,@Inject(WINSTON_MODULE_NEST_PROVIDER)private readonly logger: Logger,) {}async checkDb(): Promise<HealthIndicatorResult> {try {await this.prisma.$queryRaw`SELECT 1`;return { database: { status: 'up' } };} catch (e) {this.logger.error('[HealthCheck] Prisma DB down', e);await DingTalkHelper.alert('🔴Prisma数据库连接失败');throw new HealthCheckError('Prisma DB failed', e);}}async checkRedis(): Promise<HealthIndicatorResult> {try {await this.redisClient.ping();return { redis: { status: 'up' } };} catch (e) {this.logger.error('[HealthCheck] Redis down', e);await DingTalkHelper.alert('🟠Redis连接失败');throw new HealthCheckError('Redis failed', e);}}
}

✅ 3. 在 AppModule 注册模块

@Module({imports: [HealthModule,// your other modules],
})
export class AppModule {}

🔍 支持的指标组件(可选引入)

指标组件描述
HttpHealthIndicator检查第三方 HTTP 是否通
TypeOrmHealthIndicator检查数据库连接
MongooseHealthIndicator检查 MongoDB
RedisHealthIndicator检查 Redis 连接
GRPCHealthIndicator检查 gRPC 服务

📋 典型输出格式(符合 Kubernetes 要求):

{"status": "ok","info": {"nestjs-docs": { "status": "up" },"database": { "status": "up" }},"error": {},"details": {"nestjs-docs": { "status": "up" },"database": { "status": "up" }}
}

💡 增强建议

项目推荐实践
🚦 readiness 与 liveness 分开路径/health/live, /health/ready
📈 Prometheus Export可接入 @willsoto/nestjs-prometheus 或定制 exporter
🔐 授权保护可为健康检查加入白名单机制或 token 认证
🧪 异常告警机制health 状态为 down 时自动告警或推送
🧰 集成 log/tracing在健康检查中也记录 traceId 或日志

http://www.xdnf.cn/news/125227.html

相关文章:

  • Redis中的hash数据结构设置过期时间的坑!!!
  • 纯真社区IP库离线版发布更新
  • 2025年3月电子学会青少年机器人技术(五级)等级考试试卷-理论综合
  • LeetCode算法题(Go语言实现)_59
  • Java函数式编程深度解析:从Lambda到流式操作
  • Allegro23.1新功能之铜皮替换成Via功能操作指导
  • PowerBI-使用参数动态修改数据源路径
  • 注意力机制:Transformer如何用“数学凝视“统治AI?
  • QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信
  • 第二章:langchain文本向量化(embed)搭建与详细教程-openai接口方式(上)
  • 软件开发过程通常包含多个阶段,结合 AI 应用,可规划出以下 Markdown 文件名称的资料来记录各阶段内容
  • 每日JavaScript 4.24
  • nacos配置springboot配置信息,并且集成金仓数据库
  • loading加载中效果 css实现
  • 【AI论文】ToolRL:奖励是工具学习所需的一切
  • windows 部署cAdvisor
  • SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
  • 使用vue2开发一个医疗预约挂号平台-前端静态网站项目练习
  • 携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放
  • Gazebo 仿真环境系列教程(一):环境安装与基础使用
  • ubuntu20.04(ROS noetic版)安装cartographer
  • 一次丝滑的手工SQL注入
  • 深度剖析RLHF:语言模型“类人输出”的训练核心机制
  • 全面认识Chroma 向量数据库中的索引和相似度
  • Python基础语法:标识符,运算符,数据输入input(),数据输出print(),转义字符,续行符
  • 如何通过CRM管理软件提升客户满意度:实战策略与系统应用解析
  • java项目中分库分表使用场景?具体应该如何实现?
  • Streamlit从入门到精通:构建数据应用的利器
  • 数据中台-数据质量管理系统:从架构到实战
  • ai如何赋能艺术教育