## 健康檢查(Terminus)
Nestjs Terminus集成提供了可讀的/實時的健康檢查。在復雜的后臺設置中健康檢查是非常重要的。簡而言之,在web開發領域所說的健康檢查通常由一系列特定地址組成,例如,https://my-website.com/health/readiness 通過一個服務,或者一個你的基礎設施的一個部件(例如Kubernetes)來持續檢查這個地址。依賴于向這一地址發出的`GET`請求返回的HTTP狀態碼,該服務會在收到“不健康”響應時采取行動。由于你的服務中對“健康”和“不健康”的定義可能有所不同,Nestjs Teminus支持一系列健康指示。
作為示例,如果你的服務器使用 MongoDB來存儲數據,MongoDB是否正常運行就成了一個至關重要的信息。在這種情況下,你可以使用`MongooseHealthIndicator`。如果配置正常--按后續內容配置--你的健康檢查地址將根據MongoDB是否運行來返回健康或者不健康HTTP狀態碼。
### 入門
要開始使用 `@nestjs/terminus` ,我們需要安裝所需的依賴項。
```bash
$ npm install --save @nestjs/terminus
```
### 建立一個健康檢查
健康檢查表示健康指標的摘要。健康指示器執行服務檢查,無論是否處于健康狀態。 如果所有分配的健康指示符都已啟動并正在運行,則運行狀況檢查為正。由于許多應用程序需要類似的健康指標,因此 `@nestjs/terminus` 提供了一組預定義的健康指標,例如:
- `DNSHealthIndicator`
- `TypeOrmHealthIndicator`
- `MongooseHealthIndicator`
- `MicroserviceHealthIndicator`
- `GRPCHealthIndicator`
- `MemoryHealthIndicator`
- `DiskHealthIndicator`
要開始我們第一個健康檢查,我們需要在`AppModule`引入`TerminusModule`。
> app.module.ts
```typescript
import { Module } from '@nestjs/common';
import { TerminusModule } from '@nestjs/terminus';
@Module({
imports: [TerminusModule]
})
export class AppModule { }
```
我們的健康檢查可以使用控制器來執行,使用`Nestjs CLI`可以快速配置:
```typescript
$ nest generate controller health
```
> 強烈建議在你的應用程序中使用關機鉤子。如果啟用,Terminus將使用其生命周期事件。在[這里](https://docs.nestjs.com/fundamentals/lifecycle-events#application-shutdown)閱讀更多關于關機鉤子的內容。
### DNS 健康檢查
我們安裝了`@nestjs/terminus`后,導入`TerminusModule`并創建一個新的控制器,我們就準備好創建一個新的健康檢查了。
> health.controller.ts
```typescript
@Controller('health')
export class HealthController {
constructor(
private health: HealthCheckService,
private dns: DNSHealthIndicator,
) {}
@Get()
@HealthCheck()
check() {
return this.health.check([
() => this.dns.pingCheck('nestjs-docs', 'https://docs.nestjs.com'),
]);
}
}
```
我們的健康檢查現在將發送一個Get請求到`https://docs.nestjs.com`地址,如果我們從該地址得到一個健康響應,我們的路徑`http://localhost:3000/health`將在返回200狀態碼同時返回一個如下對象。
```json
{
"status": "ok",
"info": {
"nestjs-docs": {
"status": "up"
}
},
"error": {},
"details": {
"nestjs-docs": {
"status": "up"
}
}
}
```
該返回對象可以接口可以通過`@nestjs/terminus`包的`HealthCheckResult`接口來訪問。
名稱|內容|類型
--|--|--
status|如果任何健康檢查失敗了,狀態將是'error'。如果NestJS應用即將關閉,但仍然能接受HTTP請求,狀態檢查將會返回'shutting_down'狀態|'error'\|'ok'\|'shutting_down'
info|對象包括每個狀態是`up`(或者說健康)的健康指示器的信息|`object`
error|對象包括每個狀態是`down`(或者說不健康)的健康指示器的信息|`object`
details|對象包括每個健康指示器的所有信息|`object`
### 自定義健康指標
在某些情況下,`@nestjs/terminus` 提供的預定義健康指標不會涵蓋您的所有健康檢查要求。 在這種情況下,您可以根據需要設置自定義運行狀況指示器。
讓我們開始創建一個代表我們自定義健康指標的服務。為了基本了解健康指標的結構,我們將創建一個示例 `DogHealthIndicator` 。如果每個 `Dog` 對象都具有 `goodboy` 類型,則此健康指示器應具有 `'up'` 狀態,否則將拋出錯誤,然后健康指示器將被視為 `'down'` 。
> dog.health.ts
```typescript
import { Injectable } from '@nestjs/common';
import { HealthIndicator, HealthIndicatorResult, HealthCheckError } from '@nestjs/terminus';
export interface Dog {
name: string;
type: string;
}
@Injectable()
export class DogHealthIndicator extends HealthIndicator {
private dogs: Dog[] = [
{ name: 'Fido', type: 'goodboy' },
{ name: 'Rex', type: 'badboy' },
];
async isHealthy(key: string): Promise<HealthIndicatorResult> {
const badboys = this.dogs.filter(dog => dog.type === 'badboy');
const isHealthy = badboys.length === 0;
const result = this.getStatus(key, isHealthy, { badboys: badboys.length });
if (isHealthy) {
return result;
}
throw new HealthCheckError('Dogcheck failed', result);
}
}
```
我們需要做的下一件事是將健康指標注冊為提供者。
> app.module.ts
```typescript
import { Module } from '@nestjs/common';
import { TerminusModule } from '@nestjs/terminus';
import { DogHealthIndicator } from './dog.health';
@Module({
controllers: [HealthController],
imports: [TerminusModule],
providers: [DogHealthIndicator]
})
export class AppModule { }
```
> 在應用程序中,`DogHealthIndicator` 應該在一個單獨的模塊中提供,例如 `DogModule` ,然后由 `AppModule` 導入。
最后需要做的是在所需的運行狀況檢查端點中添加現在可用的運行狀況指示器。 為此,我們返回到 `HealthController` 并將其實現到 `check` 函數中。
> health.controller.ts
```typescript
import { HealthCheckService } from '@nestjs/terminus';
import { Injectable } from '@nestjs/common';
import { DogHealthIndicator } from './dog.health';
@Injectable()
export class HealthController {
constructor(
private health: HealthCheckService,
private dogHealthIndicator: DogHealthIndicator
) {}
@Get()
@HealthCheck()
healthCheck() {
return this.health.check([
async () => this.dogHealthIndicator.isHealthy('dog'),
])
}
}
```
- 介紹
- 概述
- 第一步
- 控制器
- 提供者
- 模塊
- 中間件
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 自定義裝飾器
- 基礎知識
- 自定義提供者
- 異步提供者
- 動態模塊
- 注入作用域
- 循環依賴
- 模塊參考
- 懶加載模塊
- 應用上下文
- 生命周期事件
- 跨平臺
- 測試
- 技術
- 數據庫
- Mongo
- 配置
- 驗證
- 緩存
- 序列化
- 版本控制
- 定時任務
- 隊列
- 日志
- Cookies
- 事件
- 壓縮
- 文件上傳
- 流式處理文件
- HTTP模塊
- Session(會話)
- MVC
- 性能(Fastify)
- 服務器端事件發送
- 安全
- 認證(Authentication)
- 授權(Authorization)
- 加密和散列
- Helmet
- CORS(跨域請求)
- CSRF保護
- 限速
- GraphQL
- 快速開始
- 解析器(resolvers)
- 變更(Mutations)
- 訂閱(Subscriptions)
- 標量(Scalars)
- 指令(directives)
- 接口(Interfaces)
- 聯合類型
- 枚舉(Enums)
- 字段中間件
- 映射類型
- 插件
- 復雜性
- 擴展
- CLI插件
- 生成SDL
- 其他功能
- 聯合服務
- 遷移指南
- Websocket
- 網關
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 適配器
- 微服務
- 概述
- Redis
- MQTT
- NATS
- RabbitMQ
- Kafka
- gRPC
- 自定義傳輸器
- 異常過濾器
- 管道
- 守衛
- 攔截器
- 獨立應用
- Cli
- 概述
- 工作空間
- 庫
- 用法
- 腳本
- Openapi
- 介紹
- 類型和參數
- 操作
- 安全
- 映射類型
- 裝飾器
- CLI插件
- 其他特性
- 遷移指南
- 秘籍
- CRUD 生成器
- 熱重載
- MikroORM
- TypeORM
- Mongoose
- 序列化
- 路由模塊
- Swagger
- 健康檢查
- CQRS
- 文檔
- Prisma
- 靜態服務
- Nest Commander
- 問答
- Serverless
- HTTP 適配器
- 全局路由前綴
- 混合應用
- HTTPS 和多服務器
- 請求生命周期
- 常見錯誤
- 實例
- 遷移指南
- 發現
- 誰在使用Nest?