View on GitHub

WePush

专注批量推送的小而美的工具,目前支持:模板消息-公众号、模板消息-小程序、微信客服消息、微信企业号/企业微信消息、阿里云短信、阿里大于模板短信 、腾讯云短信、云片网短信、E-Mail、HTTP请求、钉钉、华为云短信、百度云短信、又拍云短信、七牛云短信

ADR-0005:Provider 插件发现、隔离和更新

背景

WePush Provider 会引入不同厂商 SDK。它们可能依赖不同版本的 HTTP、JSON、加密和日志库。Provider 还需要携带 Descriptor、JSON Schema、UI Schema 和图标。插件机制需要减少依赖冲突,同时保证运行中任务不会被不安全的代码替换破坏。

决策

插件框架

插件包

wepush-provider-http-1.0.0.zip
├── plugin.jar
├── lib/
├── plugin.json
├── schemas/
├── assets/
├── LICENSES/
└── signature.ed25519

plugin.json 包含 Plugin ID、Provider ID、版本、SPI 版本、主类、依赖、平台限制、SHA-256 清单和签名 Key ID。

依赖隔离

ClassLoader 隔离只解决依赖冲突,不是恶意代码安全沙箱。JVM 内 Provider 被视为受信代码。需要运行不受信第三方插件时,必须增加独立进程 Provider Runner,不能宣称 PF4J 已提供安全隔离。

签名和信任

安装和激活

首期发行工具使用显式 Staging/Active/Rollback 目录;插件 ZIP 文件名必须包含稳定 Plugin ID 和版本:

plugins/
├── staging/
│   └── wepush-provider-http-1.1.0.zip
├── active/
│   └── wepush-provider-http-1.1.0.zip
└── rollback/
    └── wepush-provider-http-1.0.0.zip.20260823T010203Z

更新策略

Provider 删除

结果

该方案提供清晰的发现和依赖隔离,同时避免热替换引发线程、连接池、静态缓存和 ClassLoader 泄漏。代价是插件升级需要 Agent 重启,但滚动升级可以避免整体停机。

参考