Crater服务健康检查端点:自定义健康状态实现
健康检查端点概述
在现代应用开发中,服务健康检查(Health Check)是保障系统稳定性的关键组件。它通过定期检查应用的关键依赖(如数据库连接、缓存服务等)来确认系统是否正常运行,是监控告警、自动恢复机制的基础。Crater作为开源发票管理解决方案,虽然未提供默认健康检查端点,但可以通过简单扩展实现这一功能。
现有端点分析
通过分析Crater的路由配置文件,可以发现系统已存在基础的服务状态检查机制。在routes/api.php中定义了一个ping端点,代码如下:
// ping
//----------------------------------
Route::get('ping', function () {
return response()->json([
'success' => 'crater-self-hosted',
]);
})->name('ping');
该端点位于API路由文件的第125-129行,通过返回固定JSON响应来确认应用服务器是否可访问。但这只是最基础的存活检查,无法反映应用的实际健康状态。
自定义健康检查实现
1. 创建健康检查控制器
首先,创建一个专用的健康检查控制器,用于实现详细的健康状态检查逻辑:
<?php
namespace Crater\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Cache;
class HealthCheckController extends Controller
{
public function check()
{
$status = 'ok';
$database = 'down';
$cache = 'down';
// 检查数据库连接
try {
DB::connection()->getPdo();
$database = 'up';
} catch (\Exception $e) {
$status = 'error';
}
// 检查缓存服务
try {
Cache::put('health_check', true, 1);
$cache = 'up';
} catch (\Exception $e) {
$status = 'error';
}
$response = [
'status' => $status,
'services' => [
'database' => $database,
'cache' => $cache,
'app' => 'up',
'version' => config('app.version', 'unknown')
],
'timestamp' => now()->toISOString()
];
return response()->json($response, $status === 'ok' ? 200 : 503);
}
}
2. 注册健康检查路由
编辑routes/api.php文件,添加健康检查路由定义:
use Crater\Http\Controllers\HealthCheckController;
// 健康检查端点
//----------------------------------
Route::get('health', [HealthCheckController::class, 'check'])->name('health.check');
该路由应添加在现有ping端点附近,建议放在routes/api.php的第130行之后,保持路由文件结构清晰。
3. 配置Nginx状态检查
对于生产环境,建议在Nginx配置中添加健康检查支持,编辑docker-compose/nginx/nginx.conf文件:
location /health {
proxy_pass http://php:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
access_log off;
error_log /dev/null;
}
健康检查响应格式
实现后的健康检查端点将返回以下JSON响应:
{
"status": "ok",
"services": {
"database": "up",
"cache": "up",
"app": "up",
"version": "6.0.6"
},
"timestamp": "2025-10-30T02:48:46.000000Z"
}
- status: 整体健康状态,
ok表示所有关键服务正常,error表示至少一项服务异常 - services: 各组件详细状态
- database: 数据库连接状态
- cache: 缓存服务状态
- app: 应用本身状态
- version: 应用版本号
- timestamp: 检查时间戳
当任意关键服务(数据库或缓存)不可用时,状态码将变为503,便于监控系统快速识别异常。
健康检查集成方案
1. Docker健康检查配置
编辑docker-compose.yml文件,为应用服务添加健康检查配置:
services:
php:
build:
context: .
dockerfile: Dockerfile
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
2. 监控告警配置
可以将健康检查端点与Prometheus、Grafana等监控工具集成,通过以下Prometheus配置示例实现指标收集:
scrape_configs:
- job_name: 'crater'
metrics_path: '/health'
static_configs:
- targets: ['crater-instance:80']
高级扩展
自定义检查项
可以通过添加更多服务检查来扩展健康检查控制器,例如检查文件存储:
// 检查文件存储
$storage = 'down';
try {
$disk = \Storage::disk('local');
$testFile = 'health_check.txt';
$disk->put($testFile, 'test');
$disk->delete($testFile);
$storage = 'up';
} catch (\Exception $e) {
$status = 'error';
}
然后在services数组中添加存储状态:
'storage' => $storage,
权限控制
对于需要保护的健康检查端点,可以添加认证中间件,编辑routes/api.php:
Route::get('health', [HealthCheckController::class, 'check'])
->name('health.check')
->middleware('auth:sanctum');
实现总结
通过以上步骤,我们为Crater系统添加了功能完善的健康检查端点,相比基础的ping端点,新实现的health端点具有以下优势:
- 全面检查关键依赖服务状态
- 返回结构化的JSON响应
- 提供HTTP状态码指示健康状态
- 包含时间戳和版本信息
- 支持扩展自定义检查项
这一实现符合生产级应用的监控需求,可帮助管理员及时发现并解决系统问题,提高Crater服务的可靠性和稳定性。
完整的实现涉及以下文件修改:
- routes/api.php - 添加健康检查路由
- app/Http/Controllers/HealthCheckController.php - 健康检查控制器
- docker-compose/nginx/nginx.conf - Nginx配置
- docker-compose.yml - Docker健康检查配置
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



