cocoon/healthcheck.h
xfy911 ca620c17f2 feat(healthcheck): 新增主动健康检查模块
- 新增 healthcheck.c / healthcheck.h 模块
- 每个后端支持独立配置探测路径(默认 /health)、间隔(默认 5s)、超时(默认 2s)
- 使用线程 + sleep 实现周期性探测
- 探测成功/失败更新后端 healthy 状态,与现有被动检测共用状态字段
- 配置 JSON 新增 healthcheck 字段(path, interval_ms, timeout_ms, enabled)
- 优雅启动/关闭:server_create 启动探测线程,server_destroy 停止并 join
- 编译零警告
- 142 单元测试 + 103 集成测试全部通过(新增 4 项健康检查测试)
2026-06-09 14:11:52 +08:00

78 lines
2.2 KiB
C

/**
* healthcheck.h - 主动健康检查模块
*
* 周期性向后端发送 HTTP 健康探测请求,提前发现并标记不健康后端。
* 与 proxy.c 中的被动健康检查共用 healthy/fail_count/success_count 字段。
*
* @author xfy
*/
#ifndef COCOON_HEALTHCHECK_H
#define COCOON_HEALTHCHECK_H
#include "proxy.h"
#include <pthread.h>
#include <stdbool.h>
/* 默认健康检查配置 */
#define HC_DEFAULT_PATH "/health"
#define HC_DEFAULT_INTERVAL_MS 5000
#define HC_DEFAULT_TIMEOUT_MS 2000
/**
* cocoon_healthcheck_thread_t - 健康检查线程上下文
*
* 每个代理规则(含多个后端)对应一个探测线程。
*/
typedef struct {
pthread_t thread; /**< 探测线程 */
volatile bool running; /**< 运行标志 */
cocoon_proxy_rule_t *rule; /**< 指向的代理规则(引用,不拥有) */
pthread_mutex_t *config_mutex; /**< 保护配置访问 */
} cocoon_healthcheck_thread_t;
/**
* cocoon_healthcheck_manager_t - 健康检查管理器
*/
typedef struct {
cocoon_healthcheck_thread_t threads[COCOON_MAX_PROXY_RULES]; /**< 每个规则一个线程 */
size_t count; /**< 当前线程数 */
} cocoon_healthcheck_manager_t;
/**
* healthcheck_manager_init - 初始化管理器
*/
void healthcheck_manager_init(cocoon_healthcheck_manager_t *mgr);
/**
* healthcheck_start - 为代理配置启动所有探测线程
*
* @param mgr 管理器
* @param proxy_cfg 代理配置
* @param global_timeout_ms 全局超时(作为默认值)
* @return true 成功
*/
bool healthcheck_start(cocoon_healthcheck_manager_t *mgr,
cocoon_proxy_config_t *proxy_cfg,
uint32_t global_timeout_ms);
/**
* healthcheck_stop - 停止所有探测线程并 join
*
* @param mgr 管理器
*/
void healthcheck_stop(cocoon_healthcheck_manager_t *mgr);
/**
* healthcheck_probe_once - 对单个后端执行一次探测
*
* 用于测试或手动触发。
*
* @param backend 后端
* @param timeout_ms 超时毫秒
* @return true 健康
*/
bool healthcheck_probe_once(cocoon_proxy_backend_t *backend, uint32_t timeout_ms);
#endif /* COCOON_HEALTHCHECK_H */