cocoon/load_balance.h
xfy911 bf9787e6e9 feat(phase4): 实现 Phase 4 全部生态扩展模块
新增 4 个核心模块,12 个新文件,约 8832 行源代码 + 测试:

1. 扩展内置中间件 (middleware_ext.c/h)
   - JWT 认证:HS256 (HMAC-SHA256) 签名验证,Base64Url 解码
   - Security Headers:HSTS / X-Frame-Options / CSP / X-XSS-Protection
   - Request ID:32 字符 hex 唯一追踪 ID 生成与透传
   - IP 过滤:IPv4 / CIDR 黑名单与白名单,X-Forwarded-For 解析

2. 分布式负载均衡 (load_balance.c/h)
   - 一致性哈希:MurmurHash3 x86 32-bit + 512 虚拟节点/后端
   - 最少连接:实时活跃连接数跟踪
   - 加权响应时间:EWMA 指数加权移动平均
   - 随机算法

3. gRPC 支持 (grpc.c/h)
   - gRPC over HTTP/2,LEB128 消息帧编解码
   - 四种 RPC 模式:Unary / Server Streaming / Client Streaming / Bidirectional
   - gRPC-Web 兼容,17 个 gRPC 状态码完整支持

4. HTTP/3 (QUIC) (http3.c/h)
   - QUIC 传输层:UDP socket 管理,64-bit 连接 ID
   - HTTP/3 帧处理:HEADERS / DATA / SETTINGS / GOAWAY
   - QPACK 静态表编解码 (RFC 9204)
   - TLS 1.3 集成接口

新增单元测试:
- test_middleware_ext.c: 53 项测试
- test_load_balance.c: 56 项测试
- test_grpc.c: 88 项测试
- test_http3.c: 64 项测试
- 新增合计:261 项,累计 451 项

同时替换 coco 子模块为内联 stub 头文件,
确保无需外部依赖即可编译。
2026-06-10 11:36:45 +08:00

213 lines
6.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file load_balance.h - 分布式负载均衡模块头文件
* @brief 支持多种负载均衡算法:一致性哈希、最少连接、加权响应时间、随机
*
* Phase 4 第二项:多种负载均衡算法
* 设计为独立模块,可集成到 proxy.c 替换现有轮询逻辑。
*
* @author xfy
*/
#ifndef COCOON_LOAD_BALANCE_H
#define COCOON_LOAD_BALANCE_H
#include "proxy.h"
#include "healthcheck.h"
#include <stdbool.h>
#include <stdint.h>
#include <pthread.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ===== 负载均衡算法枚举 ===== */
/**
* @enum cocoon_lb_algorithm_t
* @brief 支持的负载均衡算法
*/
typedef enum {
COCOON_LB_ROUND_ROBIN, /**< 加权轮询(已有平滑加权轮询在 proxy.c 中) */
COCOON_LB_LEAST_CONNECTIONS, /**< 最少连接 */
COCOON_LB_WEIGHTED_RESPONSE, /**< 加权响应时间 (EWMA) */
COCOON_LB_CONSISTENT_HASH, /**< 一致性哈希 */
COCOON_LB_RANDOM /**< 随机 */
} cocoon_lb_algorithm_t;
/* ===== 后端状态跟踪 ===== */
/**
* @struct cocoon_backend_stats_t
* @brief 后端实时统计信息
*
* 记录每个后端的连接数、请求数、响应时间等关键指标,
* 为负载均衡算法提供决策依据。
*/
typedef struct {
uint32_t active_connections; /**< 当前活跃连接数 */
uint32_t total_requests; /**< 总请求数 */
uint32_t total_failures; /**< 总失败数 */
uint64_t total_response_time_us; /**< 总响应时间(微秒) */
uint64_t last_response_time_us; /**< 上次响应时间 */
uint64_t ewma_response_time_us; /**< 指数加权移动平均响应时间 */
} cocoon_backend_stats_t;
/* ===== 一致性哈希环 ===== */
/**
* @def COCOON_HASH_RING_SIZE
* @brief 每个后端生成的虚拟节点数量
*/
#define COCOON_HASH_RING_SIZE 512
/**
* @def COCOON_HASH_RING_MAX_NODES
* @brief 哈希环最大节点总数
*/
#define COCOON_HASH_RING_MAX_NODES (COCOON_HASH_RING_SIZE * COCOON_MAX_PROXY_BACKENDS)
/**
* @struct cocoon_hash_ring_node_t
* @brief 哈希环上的单个虚拟节点
*/
typedef struct {
uint32_t node_hash; /**< 虚拟节点哈希值 */
size_t backend_index; /**< 指向的后端索引 */
} cocoon_hash_ring_node_t;
/**
* @struct cocoon_hash_ring_t
* @brief 一致性哈希环
*
* 虚拟节点按哈希值升序排列,支持二分查找。
*/
typedef struct {
cocoon_hash_ring_node_t nodes[COCOON_HASH_RING_MAX_NODES]; /**< 排序后的虚拟节点数组 */
size_t node_count; /**< 实际节点数量 */
bool initialized; /**< 是否已初始化 */
} cocoon_hash_ring_t;
/* ===== 负载均衡器 ===== */
/**
* @struct cocoon_load_balancer_t
* @brief 负载均衡器主结构体
*
* 包含算法选择、后端统计、哈希环和线程安全锁。
*/
typedef struct {
cocoon_lb_algorithm_t algorithm; /**< 当前使用的算法 */
cocoon_backend_stats_t stats[COCOON_MAX_PROXY_BACKENDS]; /**< 各后端统计 */
cocoon_hash_ring_t hash_ring; /**< 一致性哈希环 */
uint32_t alpha; /**< EWMA 平滑因子(默认 80即 0.8 */
pthread_mutex_t mutex; /**< 统计更新锁(线程安全) */
} cocoon_load_balancer_t;
/* ===== API ===== */
/**
* @brief 初始化负载均衡器
*
* 设置算法类型,初始化统计数组和互斥锁。
* 如果算法为 CONSISTENT_HASH不会自动构建哈希环
* 需要显式调用 lb_build_hash_ring()。
*
* @param lb 负载均衡器指针
* @param algo 负载均衡算法
*/
void lb_init(cocoon_load_balancer_t *lb, cocoon_lb_algorithm_t algo);
/**
* @brief 销毁负载均衡器
*
* 销毁互斥锁,清空所有状态。
*
* @param lb 负载均衡器指针
*/
void lb_destroy(cocoon_load_balancer_t *lb);
/**
* @brief 根据算法选择后端索引
*
* 根据配置的负载均衡算法,从规则的健康后端中选择一个。
* 对于 CONSISTENT_HASH 算法,需要提供 hash_key
* 如果 hash_key 为 NULL则回退到随机选择。
*
* @param lb 负载均衡器
* @param rule 代理规则(包含后端列表)
* @param hash_key 一致性哈希的键(如请求路径或客户端 IP可为 NULL
* @return 选择的后端索引,无可用后端返回 -1
*/
int lb_select_backend(cocoon_load_balancer_t *lb, cocoon_proxy_rule_t *rule,
const char *hash_key);
/**
* @brief 请求开始时更新统计
*
* 增加指定后端的活跃连接数和总请求数。
* 线程安全:内部加锁。
*
* @param lb 负载均衡器
* @param backend_idx 后端索引
*/
void lb_update_stats_request_start(cocoon_load_balancer_t *lb, size_t backend_idx);
/**
* @brief 请求结束时更新统计
*
* 减少活跃连接数,更新 EWMA 响应时间,记录成功/失败。
* 线程安全:内部加锁。
*
* @param lb 负载均衡器
* @param backend_idx 后端索引
* @param success 请求是否成功
* @param response_time_us 响应时间(微秒)
*/
void lb_update_stats_request_end(cocoon_load_balancer_t *lb, size_t backend_idx,
bool success, uint64_t response_time_us);
/**
* @brief 构建一致性哈希环
*
* 为规则中的所有健康后端生成虚拟节点并排序。
* 应在后端配置变更或健康状态变化时重新构建。
*
* @param ring 哈希环
* @param rule 代理规则
*/
void lb_build_hash_ring(cocoon_hash_ring_t *ring, cocoon_proxy_rule_t *rule);
/**
* @brief MurmurHash3 x86 32-bit 哈希函数
*
* 纯软件实现,不依赖外部库。
* 用于一致性哈希的键哈希。
*
* @param key 输入键
* @param len 键长度
* @return 32-bit 哈希值
*/
uint32_t lb_hash_key(const char *key, size_t len);
/**
* @brief 从哈希环中选取后端
*
* 使用二分查找定位最近的虚拟节点,支持哈希环环绕。
*
* @param ring 已构建的哈希环
* @param hash 要查找的哈希值
* @return 选中的后端索引
*/
size_t lb_pick_from_ring(cocoon_hash_ring_t *ring, uint32_t hash);
/**
* @brief 获取算法名称字符串
*
* @param algo 负载均衡算法
* @return 算法名称(静态字符串)
*/
const char *lb_algorithm_name(cocoon_lb_algorithm_t algo);
#ifdef __cplusplus
}
#endif
#endif /* COCOON_LOAD_BALANCE_H */