Files
2026-02-27 14:29:48 +08:00

3.7 KiB

License Manager Python SDK 设计

1. 设计目标

  • 提供统一、低侵入的 Python SDK 以封装激活、校验、心跳、许可证管理流程。
  • 兼容现有 License Manager 服务端接口,在线/离线模式对业务透明。
  • 高可扩展与可测试性:硬件指纹、存储、网络协议处理器等核心可替换(duck typing 理念)。

2. 交付范围

  • 符合 PEP 标准的 Python 包源码。
  • 依赖描述文件(requirements.txt / setup.py)。
  • 示例:最小化直接调用的基础示例 examples/basic/main.py。
  • 面向 Python 的技术文档。

3. 核心模块设计说明

  • client.Client (门面模式)
    • 组合各模块,提供 __init__, validate, current_license, close 等方法。
    • 维护内部状态,并通过 threading.Lock 等保证线程安全访问当前 License 版本。
  • config (配置与数据校验)
    • 定义明确具有 Type hints 的类或 dataclasses,支持将环境及文件属性覆盖。
    • 静态检查:在线模式验证服务端必须 URL / 密码文件;离线模式检验证书位置。
  • activation (激活)
    • 基于标准的 requests(带连接池和自动超时重试策略)发起网络激活通信。
    • 接收加密串后调用 validator 核验,成功后通过 storage 保存。
  • validator (强安全验证)
    • 依托强大的 cryptography 包处理 RSA (建议为 PSS padding 等现代方法,具体匹配服务端实现)。
    • 对解包出的许可证时间 ExpiresAt、硬件指纹进行 CPU 负载级的精确比较并验证未发生人为修改。
  • heartbeat (心跳维护)
    • 取代 Go 的 goroutine 使用,改用由 threading.Thread 的轮询服务。设置 daemon=True 防止卡顿主进程。
    • 设计线程安全的 threading.Event() 实现如 pause, resume, stop 这些外部调度接口。
    • 对于网络闪断具有一定指数回退 (Exponential backoff) 容量。
  • hardware (多态指纹搜集)
    • 抽象采集策略,利用系统底层命令及 uuid、platform 以避免绑定复杂的原生编译依赖(如果在 CPython 环境可引入 psutil 或仅靠 standard libs 执行降级采集策略)。
  • storage (凭证安全落地)
    • 文件加解密适配 cryptography 在 AES-GCM 算法下使用 256bit 动态密钥做密文打包,防本地脱机逆向嗅探。
  • logger & exceptions (日志体系监控)
    • 使用标准的 logging 获取当前全局记录器。
    • 设计带有分类标记的 LicenseManagerError, NetworkError, ValidationError 提供可分辨的控制流分支。

4. 关键生命周期总结

  1. 实例化:加载配置 → 初始化硬件信息/日志/存储机制 → 调用 validator 验算本地既有证书 → 按需挂起并调用 activation 发在线网路激活申请。
  2. 后台伴生:启动 heartbeat daemon → 在给定 interval 进行上游 pinging → 若上游发来更新证,回调主线程数据结构;若请求重新激活,则触发 callback 进入阻塞警报。
  3. 断网本地态:应用随时拉起 client.validate()。验证不通过抛出 SDK 特有 Exception,应用层捕获异常并决定关停自身业务。

5. 对比补充与潜在风险

  • 包依赖风险:为降低部署繁杂度,若系统有条件应考虑避免引用含有大量 C 扩展的包,优先利用 Python 3 自带库封装;必须时则明确说明并列在依赖清单首位 (如 cryptography)。
  • 定时锁和 GIL 干扰:心跳网络收发本质是 I/O 阻塞型操作,采用线程天然适合,且不易阻断业务代码,但在多线程中覆盖验证缓存 current_license 必须添加明确锁保护(threading.RLock()),确保不产生竞争读写现象。