Skip to content

[Proposal] 重构 Apollo WebHook 机制,支持插件化与安全增强 #5461

@tacklequestions

Description

@tacklequestions

背景

现有 WebHook 机制实现简单,存在以下问题:

  • 硬编码实现:仅支持 RestTemplate POST,无法扩展其他协议
  • 静态配置:WebHook URL 写死在配置文件,修改需重启服务
  • 事件类型单一:只支持配置发布,无法订阅回滚、合并等事件
  • 缺乏安全性:没有签名或认证,易被伪造
  • 缺乏可观测性:无调用日志,无 UI 管理,无失败重试

改造目标

  1. 插件化:支持 HTTP、MQ、gRPC、Email、企业微信等通知方式
  2. 动态管理:提供 API + UI 管理 WebHook 订阅
  3. 安全性:通过 HMAC-SHA256 签名保证请求可信
  4. 可靠性:异步调用 + 重试机制,失败不影响主流程
  5. 可观测性:记录调用日志,支持查询与调试

技术方案

1. 插件化架构

  • 设计标准 SPI 接口:NotificationHandlerNotificationConfigNotificationContext

  • 插件管理器 WebHookPluginManager,支持插件注册、验证、运行时加载

  • 内置插件:

    • HTTP WebHook
    • MQ 通知
    • gRPC
    • 企业微信 / Email

2. 数据库表设计

  • Webhook:存储订阅配置(AppId, Url, Secret, 启用状态)
  • WebhookEvent:存储订阅的事件类型(RELEASE, ROLLBACK 等)
  • WebhookLog:存储调用日志(请求体、响应体、状态码、是否成功)

3. API 设计

  • POST /apps/{appId}/webhooks:创建订阅(返回一次性 secret)
  • GET /apps/{appId}/webhooks:查询订阅列表
  • PUT /webhooks/{id}:更新订阅
  • DELETE /webhooks/{id}:删除订阅
  • GET /webhooks/{id}/logs:查询调用日志

4. 安全与可靠性

  • 签名:请求头 X-Apollo-Signature-256 携带 HMAC-SHA256 签名
  • 异步投递:独立线程池执行,不阻塞主发布流程
  • 失败重试:1min、5min、15min 三次重试机制
  • 错误隔离:单个 WebHook 失败不影响其他订阅

5. Portal 扩展

  • 新增 WebHook 管理界面
  • 支持插件配置、调试与启停

实施计划

  • 阶段 1:实现 SPI 接口、插件管理器、HTTP 插件、数据库表结构
  • 阶段 2:扩展 MQ、企业微信、邮件插件,提供管理界面
  • 阶段 3:支持插件热加载、性能监控、重试与熔断机制

Checklist

  • 设计 SPI 接口与插件框架
  • 新建数据库表(Webhook, WebhookEvent, WebhookLog)
  • 实现 HTTP WebHook 插件
  • 提供 WebHook CRUD API
  • 增加 HMAC-SHA256 签名验证
  • 实现调用日志与查询 API
  • Portal 增加 WebHook 管理界面

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions