# License Manager Go SDK 需求 ## 背景 - 当前客户端 demo 直接对接服务端,集成复杂且不利于复用。 - 多个需要授权的产品希望以库的形式快速接入授权能力。 - 需要一个接口简洁、易于扩展、对调用方入侵极低的 Go SDK。 ## 目标 1. 封装授权激活、许可证校验、心跳续期等流程,减少业务方重复开发。 2. 提供清晰的配置与生命周期管理,支持 CLI、服务和嵌入式场景。 3. 兼容已有 License Manager 服务端接口,未来接口升级时对调用方透明。 4. 支持在线 / 离线两种工作模式,满足联网和隔离环境的授权需求。 ## SDK 架构 | 模块 | 职责 | |------|------| | `license.Client` | SDK 入口,负责生命周期管理。 | | `config` | 统一的配置结构体,支持代码、环境变量、配置文件三种来源。 | | `hardware` | 硬件指纹采集,默认实现可被自定义扩展。 | | `activation` | 激活接口封装、授权码加载、许可证缓存。 | | `validator` | 对许可证内容、有效期、功能限制进行校验。 | | `heartbeat` | 心跳轮询、动态间隔调整、失败退避策略。 | | `storage` | 许可证加解密与本地持久化,支持自定义存储后端。 | | `logger` | 统一日志接口,默认输出到标准输出,可注入业务日志实现。 | ### 硬件指纹采集策略 1. **标准组合指纹(默认)**:采集首个物理 MAC、CPU 型号、主机 ID,组合字符串后做哈希。 2. **可插拔字段选择**:调用方可通过配置决定纳入哪些硬件字段(如磁盘序列号、主板序列号等),SDK 保证字段顺序与哈希算法一致。 3. **自定义采集器**:提供 `hardware.Provider` 接口,允许业务方完全自定义指纹生成逻辑(适配虚拟化、容器等环境)。 4. **匿名化/脱敏模式**:支持在上报前对字段进行额外哈希或加盐,满足隐私/合规要求。 5. **实时采集策略**:每次需要校验时即时采集,避免任何形式的本地缓存,以消除被复制或伪造的风险;若采集失败需有清晰的回退与错误提示。 ## 核心功能需求 1. **初始化** - 必填配置:服务端地址(离线模式可选)、产品标识、版本号、授权码来源或许可证文件路径、服务端 RSA 公钥(可通过路径或内容提供)。 - 可选配置:心跳间隔、超时、日志级别、硬件指纹采集策略、自定义 HTTP 客户端。 2. **许可证加载与激活** - **在线模式**:启动优先读取本地许可证;不存在或失效时自动激活,激活请求包含硬件指纹、产品信息、授权码,支持附加自定义字段。激活成功后自动校验并落盘,加解密沿用 AES-GCM;需使用配置中提供的 RSA 公钥验证服务端签名。 - **离线模式**:仅校验本地许可证文件合法性(签名/有效期/硬件绑定),不访问网络;当本地许可证缺失或过期时返回明确错误,由业务方决定更新方式。需通过配置显式提供许可证文件路径(默认 `license_code/license.lic` 可覆盖)及 RSA 公钥拷贝,保证可独立校验签名。 3. **许可证校验** - 校验内容:签名/加密、有效期、硬件绑定、功能/限制字段。 - 提供同步 API(`Validate()`)供业务方在关键操作前主动检查。 - 提供只读访问接口(如 `client.CurrentLicense()`),可在业务运行时获取最新许可证的功能限制、配额等字段,便于执行业务级限制判断;当许可证更新时需即时刷新缓存并触发回调。 4. **心跳服务** - 仅在在线模式启用:成功激活后自动启动,默认间隔 300s,可从服务器动态调整。 - 支持暂停/恢复接口,网络异常时指数退避并记录原因。 - 服务器返回新的许可证时自动替换并回调通知。 - 离线模式不启动心跳,SDK 需暴露显式 API 让业务层触发本地校验。 5. **事件与回调** - 需支持 `OnLicenseUpdated`, `OnHeartbeatError`, `OnActivationRequired` 等回调。 - 回调在独立 goroutine 执行,避免阻塞主流程。 6. **错误处理** - 统一错误类型,区分可重试与不可重试场景。 - 提供错误码枚举,便于业务层按类型处理。 7. **线程安全** - SDK 所有公开方法需并发安全,核心状态(许可证、心跳)内部加锁。 8. **可测试性** - 对 HTTP、时间、硬件指纹、存储等外部依赖提供接口,方便 Mock。 ## 使用方式 ```go cfg := license.Config{ Server: "https://license.example.com", Product: "edge-gateway", Version: "2.3.1", AuthCode: license.FromFile("license_code/authorization_code.txt"), PublicKey: license.FromFile("license_code/rsa_public_key.pem"), } client, err := license.NewClient(cfg) defer client.Close() if err != nil { /* ... */ } if err := client.Validate(context.Background()); err != nil { // 业务自定义处理 } ``` ## 交付物 - SDK 源码与 go.mod。 - `README`:安装、Quick Start、常见问题。 - 示例程序:最小化控制台示例 + 与现有 client-demo 等价的高级示例。