实现了NestJS项目的健康检查API
前提 tí)
BFF(Backend For Frontend)作为位于前端和后端之间的特定类型的服务器,用于优化前端和后端之间的通信。本文将介绍如何在Amazon ECS(Amazon Elastic Container Service)上部署作为BFF功能的NestJS项目,并实现健康检查API。健康检查用于监控服务的健康状况,以便在出现问题时能够迅速处理。在Amazon ECS中,健康检查是必需的要求,如果失败将导致服务停止。
执行
在NestJS项目中,您需要创建一个健康检查控制器,并且可以通过向根模块添加包含健康检查控制器的模块,或者直接添加健康检查控制器的方式来实现。这将有效地监控服务的健康状况。
健康检查控制器 qì)
-
- HealthCheckService: ヘルスチェックのロジックをカプセル化します。
-
- HttpHealthIndicator: HTTPサービスのヘルスチェックを支援します。
- HealthCheck: 特定のメソッドがヘルスチェックエンドポイントとして機能することを示します。この例では、checkメソッドがヘルスチェックエンドポイントとして機能し、/healthエンドポイントにHTTP GETリクエストが送信されたときに呼び出されます。このメソッドはGraphQLサーバのヘルスチェックを行い、その結果をレスポンスとして返します。
import { Controller, Get } from "@nestjs/common";
import {
HealthCheckService,
HttpHealthIndicator,
HealthCheck,
} from "@nestjs/terminus";
import { AxiosResponse } from "@nestjs/terminus/dist/health-indicator/http/axios.interfaces";
type GraphQLHealthResponse = {
status: string;
};
@Controller("health")
export class HealthController {
constructor(
private health: HealthCheckService,
private http: HttpHealthIndicator,
) {}
@Get()
@HealthCheck()
check() {
return this.health.check([
() =>
this.http.pingCheck(
"GraphQL",
// ECSにデプロイしたら環境変数はタスク定義によってBFFエンドポイントを指定します
`${process.env.APP_URL}/.well-known/apollo/server-health`,
),
() =>
this.http.responseCheck(
"GraphQL",
// ECSにデプロイしたら環境変数はタスク定義によってBFFエンドポイントを指定します
`${process.env.APP_URL}/.well-known/apollo/server-health`,
function (res: AxiosResponse<GraphQLHealthResponse>) {
return res.data?.status === "pass";
},
),
]);
}
}
健康检查模块
- HttpModule: HTTPリクエストを行うためのモジュールです。
import { Module } from "@nestjs/common";
import { HttpModule } from "@nestjs/axios";
import { HealthController } from "@/controller/health.controller";
import { HealthCheckService, HttpHealthIndicator } from "@nestjs/terminus";
@Module({
imports: [HttpModule],
providers: [
HealthCheckService,
HttpHealthIndicator,
],
controllers: [HealthController],
})
export class HealthModule {}
根模块
-
- GraphQLModule: GraphQLサーバを設定します。
-
- ConfigModule: アプリケーションの設定を管理します。
-
- TerminusModule: ヘルスチェックとグレースフルシャットダウンのサポートを提供します。
- join: パスを結合するためのユーティリティ関数です。
import { HealthModule } from "@/modules/health/health.module";
import { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
import { GraphQLModule } from "@nestjs/graphql";
import { TerminusModule } from "@nestjs/terminus";
import { join } from "path";
@Module({
imports: [
GraphQLModule.forRoot({
autoSchemaFile: join(process.cwd(), "src/schema.gql"),
sortSchema: true,
}),
ConfigModule.forRoot({
envFilePath: [".env"],
}),
TerminusModule,
HealthModule,
],
})
export class AppModule {}
我发布这个帖子是为了记录自己的备忘录,如果对你有所帮助我会很开心!同时,如果有任何错误,请指正我会感激不尽!