# LicenseManager Platform - 技术架构设计文档 (TAD)

| 项目 | 内容 |
| --- | --- |
| 文档版本 | v1.0 |
| 文档类型 | Technical Architecture Design(TAD) |
| 关联文档 | [LicenseManager-Platform-RDP-v1.0.1.md](./LicenseManager-Platform-RDP-v1.0.1.md) |
| 基础组件 | LicenseManager.Core v1.0(原 LSXPrime/Aegis v1.4.0 重命名) |
| 目标读者 | 架构师、技术负责人、核心开发、SRE |
| 文档日期 | 2026-07-23 |

---

## 0. 修订历史

| 版本 | 日期 | 修订内容 |
| --- | --- | --- |
| v1.0 | 2026-07-23 | 初稿,基于 RDP v1.0.1 架构部分展开 |
| v1.1 | 2026-09 | 按代码实测同步:会话改为 JWT 8 小时、无 refresh(refresh 列路线图);基础设施改实际架构(默认 MySQL、IMemoryCache、进程内后台 worker,无 RabbitMQ/Quartz,Redis 可选);登录锁定 15 分钟;Webhook 事件目录 46 条 |
| v1.2 | 2026-10-08 | 商业化裁剪:移除/标注资金流相关内容(架构分层/服务地图/集成表/ADR 中的 Payment/PSP/对账组件,数据模型 Order/Invoice/Payment/BrandProfile,密钥生命周期 PSP 凭据/发票行等),移交外部销售系统;保留订阅续期(每小时自动扫描 + `POST /v1/admin/subscriptions/renewal/execute`) |
| v1.2-arch | 2026-09 | 按代码实测同步:离线激活收敛至 `AirgapActivationService` 校验链并补 revocations/airgap-sync 端点;认证双轨(主 API Authorization 三方案 / 浮动服务器 X-Api-Key);`GET /v1/keys` 公钥分发与 SigningKeyStore 密钥轮换(key_version);修正 §3.1 Core 边界(无 DbContext、浮动服务器为独立项目 `LicenseManager.Server`)、ADR-018、登录尝试改 EF 持久化 |
| v1.3 | 2026-10-16 | 按 P0–P2 改造同步:TenantId 全局过滤器实体 27 → 17 个(另有 14 个 TenantId 索引);4 张安全台账表已在各方言 `InitialCreate` 迁移中建表(删除"需补迁移"注记) |

> **阅读提示**:本文部分章节(服务地图、HA、事件总线、缓存分层等)描述**目标架构**;与当前实现的差异以"现状"注记标出,代码为准。当前实现要点:单体 `LicenseManager.Api`(端口 8080)+ 独立浮动服务器 `LicenseManager.Server`(端口 8083);默认 MySQL(`Database:Provider=MySql`,仅 MySQL 走 EF Migrate,其余提供器走 EnsureCreated);缓存为进程内 `IMemoryCache`;后台任务(Webhook 投递等)为进程内 `BackgroundService`;Redis 可选(配置后启用分布式限流/缓存);**无 RabbitMQ、无 Quartz.NET、无 FluentValidation/AutoMapper/Testcontainers**。

---

## 1. 概述

### 1.1 文档目的
定义 LicenseManager Platform 的技术架构,作为详细设计、编码、测试、部署、运维的总纲。与 RDP 互补:RDP 定义"做什么",TAD 定义"怎么做、为什么这么做"。

### 1.2 范围
- 整体架构原则与目标
- 逻辑架构与模块视图
- 物理/部署架构
- 数据架构
- 集成架构
- 关键流程时序
- 横切关注点
- 性能、可扩展、可用性
- 安全架构
- 技术选型
- 架构决策记录(ADR)

### 1.3 非范围
- 详细 API 契约(见 [API Spec](./LicenseManager-Platform-API-Spec-v1.0.md))
- 数据库表结构(见 [Database Design](./LicenseManager-Platform-Database-Design-v1.0.md))
- 部署步骤(见 [Deployment Guide](./LicenseManager-Platform-Deployment-Guide-v1.0.md))
- LMC 重构细节(见 [Core Dev Guide](./LicenseManager.Core-Development-Guide-v1.0.md))

---

## 2. 架构原则与目标

### 2.1 原则

| 原则 | 说明 |
| --- | --- |
| **私有化优先** | 离线可装、可运行、可升级;不依赖外网 |
| **核心稳定、外围可换** | LMC 内核 24 个月向后兼容;业务层/集成层可快速迭代 |
| **数据归属客户** | 客户数据归客户所有;私钥不出客户环境(原 PSP 凭证相关要求已随商业化裁剪移除) |
| **可审计一切** | 关键操作不可篡改,actor 快照写死 |
| **多租户/多品牌** | 单一二进制支持多租户(平台级)(原多品牌/白标已随商业化裁剪移除) |
| **异步优先** | 长任务(导入、迁移)异步化;Webhook 推送而非轮询(原对账任务已随商业化裁剪移除) |
| **可降级** | 任意外部依赖不可用时,平台仍能提供核心能力(只读/离线/降级) |
| **可观测内建** | 结构化日志/指标/追踪作为一等公民 |
| **安全左移** | SDLC 中集成 SCA、SBOM、代码审计、密钥管理 |

### 2.2 目标(质量属性)

| 维度 | 目标值 | 备注 |
| --- | --- | --- |
| 性能 - 在线验证 P95 | < 100ms | 单实例 10w 活跃授权 |
| 性能 - 激活 P95 | < 300ms | 含 DB 写入 |
| 可用性 - 单实例 | 99.5% | 含计划维护 |
| 可用性 - HA | 99.9% | RTO < 5min / RPO < 1min |
| 扩展性 | 10x 数据规模下 P95 不劣化 > 30% | 需读扩展、缓存、外置状态 |
| 安全 | 0 个高危 CVE 进入 GA | SCA 卡阈值 |
| 可观测 | 100% 关键操作可追踪 | 分布式追踪 |
| 兼容性 | SDK 向后兼容 1 主版本 | LMC 24 个月 |
| 私有化 | 全功能离线安装,无外网依赖 | |
| 数据规模 | 单实例 100w 授权 / 1000w 审计 / 1000 并发 | |

---

## 3. 逻辑架构

### 3.1 分层

```
┌───────────────────────────────────────────────────────────────────┐
│  Client SDK (.NET / Java / C++ / Python / Go / iOS / Android)      │
│  Admin Console (Vue 3)         Customer Portal (Vue 3)             │
│  Marketing Site · Docs Site · Status Page · Sandbox               │
└───────────────────────────────────────────────────────────────────┘
                                  │
                          ┌───────┴────────┐
                          │   API Gateway  │  (路由、限流、鉴权、TLS 终结)
                          └───────┬────────┘
                                  │
┌─────────────────────────────────┴─────────────────────────────────┐
│  Application Layer (LicenseManager.Platform)                      │
│   Product · Customer · License · Device · Floating · Consumption   │
│   Subscription · Bundle · Release · Audit · Webhook (Payment 已裁剪)│
├──────────────────────────────────────────────────────────────────┤
│  Domain Core (LicenseManager.Core.Abstractions,独立程序集)        │
│   ILicenseGenerator · ILicenseManager · IFeatureManager           │
│   IHardwareIdProvider · Models(SignedLicense / LicenseContext 等) │
├──────────────────────────────────────────────────────────────────┤
│  LicenseManager.Core (原 Aegis)                                    │
│   License / LicenseBuilder / LicenseGenerator / FeatureManager    │
│   Utils(SignatureUtils / HardwareUtils / LicenseKeyGenerator)     │
│   Abstractions(ILicenseStore / IValidationRule) · Validation      │
│   Security/SigningKeyStore(RSA 密钥轮换,key_version)              │
└──────────────────────────────────────────────────────────────────┘
                                  │
┌─────────────────────────────────┴─────────────────────────────────┐
│  Infrastructure (LicenseManager.Infrastructure)                   │
│   EF Core · Redis(可选) · ObjectStorage · KMS/HSM                  │
│   IdP · Email/SMS · OTel · Sentry (PSP Adapters 已裁剪)           │
└──────────────────────────────────────────────────────────────────┘
                                  │
                  MySQL(默认) / PostgreSQL · Redis(可选) · S3 · KMS
```

> **现状注记**:上图中的 RabbitMQ(消息总线)在当前版本**不存在**——异步事件与 Webhook 投递由 API 进程内 `BackgroundService`(如 `WebhookDeliveryWorker`)完成;缓存为进程内 `IMemoryCache`(Redis L2 可选);默认数据库为 MySQL(`DatabaseOptions` 代码默认 PostgreSQL,但 `appsettings.json` 默认 `MySql`,仅 MySQL 走 EF Migrate,其余提供器走 EnsureCreated)。外置 MQ / L2 缓存 / Quartz 集群调度列路线图。
>
> **Core 与浮动服务器边界**:`LicenseManager.Core` **不含任何 DbContext**——许可证持久化经 `ILicenseStore` 接口由 `LicenseManager.Infrastructure`(`LicenseManagerDbContext`)实现;浮动租约服务不由 Core 提供,而是独立进程 **`LicenseManager.Server`**(`lm-floating-server`:8083,原 Aegis.Server,见 §3.3/ADR-018)。

### 3.2 模块视图

按 DDD 划分 bounded context:

| Context | 核心聚合 | 上下游 |
| --- | --- | --- |
| **Catalog** | Product, ProductVersion, Feature, EntitlementSet, LicenseTemplate, Bundle | 下游:License |
| **Customer** | Organization, Reseller, Customer, CustomerUser, UserGroup | 下游:License |
| **License** | License, Activation, RefreshToken, LicenseEvent, ConsumptionLog | 上游:Catalog/Customer;下游:Device/Audit |
| **Device** | Device, Heartbeat, DeviceGroup | 上游:License |
| **Floating** | Lease, FloatingServer, FloatingServerSyncLog | 上游:License;下游:Audit |
| **Subscription** | Subscription, SubscriptionInterval, MaintenancePolicy, SubscriptionLog | 上游:Customer/License;下游:Webhook |
| **Release** | Release, ReleaseFile, Channel, UpdatePolicy | 下游:License |
| **Identity** | User, Role, Permission, ApiKey, PersonalAccessToken, IdPConfig | 全局 |
| **Legal** | LegalDocument, EulaUseType | 全局 |
| **Integration** | WebhookEndpoint, WebhookDelivery, ImportJob, ExportJob | 上游:所有 Context |
| **Audit** | AuditLog (append-only) | 订阅:所有写操作 |
| **Notification** | Notification, NotificationTemplate, NotificationPreference | 订阅:所有事件 |
| **Commerce** | Plan, PlanFeature, BillingAccount, SubscriptionLifecycle, Credit | 上游:Payment |
| **Support** | Ticket, TicketEvent, KBArticle | 上游:所有 Context |
| **Marketing** | Lead, TrialRequest, CaseStudy, Whitepaper, WebhookLead | 上游:Customer |
| **Operation** | Incident, MaintenanceWindow, StatusComponent, SLO | 上游:所有 |

### 3.3 服务地图

> **现状注记**:当前版本实际进程为 `lm-api`(8080,含进程内后台任务)与 `lm-floating-server`(`LicenseManager.Server`,代码未固定端口——无 launchSettings/UseUrls,经 `ASPNETCORE_URLS`/`--urls` 指定,文档约定示例 8083);`lm-admin`/`lm-portal`/`lm-status` 等为静态前端 SPA(非独立 BFF 进程);`lm-worker`/`lm-scheduler`/`lm-notifier` 为进程内 `BackgroundService`,未独立部署。下表为目标形态,端口以实际为准。

| 服务 | 类型 | 职责 | 端口(默认) |
| --- | --- | --- | --- |
| `lm-api` | Web API | 统一 API 入口(管理/客户/Webhook;原支付入口已随商业化裁剪移除) | 8080 |
| `lm-admin` | Web App | 管理控制台(静态 SPA) | 经 Nginx 托管 |
| `lm-portal` | Web App | 客户门户(静态 SPA) | 经 Nginx 托管 |
| `lm-floating-server` | Web API | 浮动 server(M44 独立分发) | 8083 |
| `lm-worker`(进程内) | BackgroundService | 异步任务(导入/重试/Webhook 投递;原对账任务已随商业化裁剪移除) | - |
| `lm-scheduler`(进程内) | BackgroundService | 定时任务(订阅续期自动扫描/到期清理;原对账任务已随商业化裁剪移除) | - |
| `lm-notifier`(进程内) | BackgroundService | 邮件/Webhook 通知 | - |
| `lm-doc` | Static Site | 文档站 | 静态托管 |
| `lm-site` | Static Site | 营销官网 | 静态托管 |
| `lm-status` | Web App | 状态页(静态 SPA) | 静态托管 |

### 3.4 模块依赖原则

- 严格分层:Domain Core 不依赖任何具体实现(EF Core / Redis / RabbitMQ)
- 业务 Context 通过 Application Service 编排,不允许跨 Context 直接访问 DB
- 跨 Context 通信走:
  - 同步:Application Service 接口调用
  - 异步:Domain Event → Message Bus → 目标 Context
- 任何 Context 写操作必须发布 `XxxChanged` 事件,Audit/Notification/Webhook 订阅
- LMC 作为"工具库"被业务层调用,不直接处理业务事件

---

## 4. 物理/部署架构

### 4.1 私有化(主) - 单实例

> **现状注记**:当前版本最小部署 = `lm-api` + MySQL(或 PostgreSQL);Redis 可选(分布式限流);**无 RabbitMQ**;S3 兼容存储按配置启用。下图为目标形态。

```
[Load Balancer (HAProxy/Nginx,可选)]
         │
   ┌─────┴─────┐
   │  lm-api    │ ← 用户/SDK 请求
   └─────┬─────┘
         │
   ┌─────┴──────────────────────────────┐
   │  MySQL / PostgreSQL (主)             │
   │  Redis (缓存/限流,可选)              │
   │  S3 兼容对象存储 (Release/导出,可选)  │
   └───────────────────────────────────────┘
```

### 4.2 私有化 HA

> **现状注记**:当前版本无 RabbitMQ Cluster、无 Quartz.NET;多实例部署时需注意限流需 Redis(`RateLimit:Distributed=true`)、幂等缓存为进程内不共享。下图为目标形态。

```
        ┌─→ lm-api (instance A)
Client ─┤
        └─→ lm-api (instance B) ──→ MySQL / PostgreSQL Primary
                                   │
                                   ├─→ Read Replica 1
                                   └─→ Read Replica 2
            Redis Sentinel (3 nodes,可选)
            RabbitMQ Cluster (3 nodes,路线图)
```

- 浮动席位状态外置到 Redis Cluster(共享存储)
- API 无状态,水平扩展
- Worker/Scheduler 多实例通过 Quartz.NET 集群调度(路线图;当前为进程内 BackgroundService)

### 4.3 气隙(Air-gapped)

- 无外网,无 DNS,无 NTP
- 离线安装包/镜像一次性导入
- 文件模式传递激活/Refresh 请求响应
- 短码模式(M10.3)传递激活
- LicenseManager.Core 内置 `OfflineActivation` 工具链
- 时钟漂移由 `LicenseManager.Core` 防回拨(M3.6)

### 4.4 云托管(可选)

- 多区域(US/EU/AP)
- RDS Multi-AZ / Aurora
- ElastiCache / Memorystore
- SQS / SNS
- KMS 集中托管
- ALB + WAF + Shield
- 全量 CDN(WAF 之外)

### 4.5 容器化(推荐私有化方案)

| 制品 | 说明 |
| --- | --- |
| Docker 镜像 | `lm-api:1.0.0` / `lm-worker:1.0.0` / `lm-floating-server:1.0.0` |
| Helm Chart | `license-manager` 一个 chart 管所有组件 |
| docker-compose | 单机/小规模用 |
| 离线镜像包 | `license-manager-offline-1.0.0.tar`(含镜像 + DB 初始化 + 密钥工具) |

---

## 5. 数据架构

### 5.1 数据模型(高阶 ER)

> 详见 [Database Design](./LicenseManager-Platform-Database-Design-v1.0.md)

```
Tenant ─┬─ User ─── Role ─── Permission
        ├─ Organization (层级树) ── Reseller
        ├─ Product ─┬─ ProductVersion
        │           ├─ Feature
        │           ├─ EntitlementSet ── Tier
        │           ├─ LicenseTemplate ── ValidationRule
        │           └─ Bundle ── BundleItem
        ├─ License ─┬─ LicenseFeature (含 consumption)
        │           ├─ Activation
        │           ├─ Device ── Heartbeat
        │           ├─ ConsumptionLog
        │           ├─ RefreshToken
        │           └─ LicenseEvent
        ├─ Order ── Invoice ── Payment   (已随商业化裁剪移除)
        ├─ Subscription (外部对接)   (已随商业化裁剪移除)
        ├─ BrandProfile   (已随商业化裁剪移除)
        ├─ Release ── ReleaseFile ── Channel
        ├─ ApiKey / PersonalAccessToken
        ├─ AuditLog (不可变,actor 快照)
        ├─ WebhookEndpoint ── WebhookDelivery
        ├─ Ticket
        ├─ Plan (保留:许可配额语义)
        └─ SystemKey (RSA 密钥版本)
```

### 5.2 数据分区

| 表 | 分区策略 | 原因 |
| --- | --- | --- |
| `license_event` | 月份 RANGE | 时序,过期数据冷存 |
| `audit_log` | 月份 RANGE | 同上 |
| `heartbeat` | 月份 RANGE + 删除 | 高频写入,3 个月后清理 |
| `consumption_log` | 月份 RANGE | 同上 |
| `webhook_delivery` | 月份 RANGE + 删除 | 投递记录定期清理 |
| `usage_metric` | 日期 RANGE | 监控数据 |

### 5.3 多租户

- 平台级多租户:`TenantId` 列 + **EF Core 全局查询过滤器**(`LicenseManagerDbContext` 通过反射为 27 个含 `TenantId` 的实体动态附加;数据库级 RLS 列路线图)
- ~~客户级多品牌:`brand_id` 列 + 隔离~~(已随商业化裁剪移除)
- 单实例支持 ≥ 1000 客户(读多写少)
- 大客户单独实例(白手套)

### 5.4 数据生命周期

| 数据类别 | 在线 | 冷存储 | 归档 | 删除 |
| --- | --- | --- | --- | --- |
| 授权主数据 | 永久 | - | - | 不可删除 |
| LicenseEvent | 12 个月 | 3 年 | 7 年(合规) | - |
| AuditLog | 12 个月 | 5 年 | 7 年 | - |
| Heartbeat | 3 个月 | - | - | 3 个月后清理 |
| ConsumptionLog | 12 个月 | 3 年 | - | - |
| WebhookDelivery | 90 天 | 1 年 | - | 90 天清理 |
| API Key 凭据 | 永久(可撤销) | - | - | 撤销后 30 天清理 |
| ~~PSP 凭据~~ | ~~永久(可轮换)~~ | - | - | ~~轮换后保留历史~~(已随商业化裁剪移除) |
| ~~客户发票~~ | ~~永久~~ | - | ~~10 年(法规)~~ | - |(已随商业化裁剪移除) |

### 5.5 软删除与硬删除

- **现状**:**无软删除**(全库无 `deleted_at`/`IsDeleted` 字段),删除均为物理删除;软删除(`deleted_at` 列 + `HasQueryFilter`)列路线图
- **硬删除**:GDPR DSR 申请;由支持 Agent 审批 + 法务复核
- **匿名化**:客户销户后 PII 字段加密随机化(保留业务统计)

---

## 6. 集成架构

### 6.1 同步 vs 异步

> **现状注记**:表中"RabbitMQ"通道在当前版本均为 **API 进程内队列 + `BackgroundService`**(如 Webhook 投递的 `WebhookDeliveryWorker`:5 秒轮询、单轮最多 50 条);外置 MQ 列路线图。

| 场景 | 模式 | 通道 |
| --- | --- | --- |
| 在线激活/验证 | 同步 | HTTP |
| 创建授权/吊销 | 同步 | HTTP |
| License 签发/续期 | 同步 | HTTP |
| Webhook 投递(出去) | 异步 | 进程内队列 → Worker(外置 MQ 列路线图) |
| ~~支付 Webhook 接收(进来)~~ | ~~异步落库 + 同步响应~~ | ~~HTTP → DB → 异步处理~~(已随商业化裁剪移除) |
| 邮件/短信通知 | 异步 | 进程内队列 → Notifier |
| 批量导入/迁移 | 异步 + 进度查询 | 进程内队列 + Job 状态(原对账任务已随商业化裁剪移除) |
| 定时任务(续费/清理) | 异步 | 进程内 BackgroundService(Quartz 集群列路线图) |
| License 签发(批量 1000+) | 异步 + 进度 | Job |
| Release 包发布 | 异步 | Job |

### 6.2 内部事件总线

- **现状**:**无外置消息总线**——领域事件在进程内分发,Webhook 投递由 `WebhookDeliveryWorker` 轮询数据库投递表执行
- **目标技术选型**:RabbitMQ(主流、可靠、私有化友好) / Azure Service Bus(云托管)(路线图)
- **事件格式**:CloudEvents 1.0
- **Topic**:`<context>.<aggregate>.<action>`,例 `license.license.activated`
- **订阅模式**:每个 Bounded Context 可订阅多个 topic
- **At-least-once**:消费者幂等处理
- **死信队列**:消费失败 N 次入 DLQ,人工重放

### 6.3 Webhook(出站)

- **签名**:HMAC-SHA256 + 时间戳(仅当端点配置了 Secret 时下发签名头)
- **重试**:指数退避(5s → 10s → 20s → …,上限 1 小时),默认最大尝试次数 5(`WebhookDelivery.MaxAttempts`)
- **挂起重试**:达到最大尝试次数后标记 Failed(不删除订阅),管理员可经管理端点手动重放
- **清理**:终态投递记录(Delivered/Failed)保留 30 天后由后台清理归档

### 6.4 第三方集成

| 集成 | 模式 | 适配器 |
| --- | --- | --- |
| ~~Stripe~~ | ~~Webhook + API~~ | ~~`IPaymentProvider`~~(已随商业化裁剪移除) |
| ~~PayPal~~ | ~~Webhook + API~~ | ~~同上~~(已随商业化裁剪移除) |
| ~~Alipay~~ | ~~Webhook + API~~ | ~~同上~~(已随商业化裁剪移除) |
| ~~WeChat Pay~~ | ~~Webhook + API~~ | ~~同上~~(已随商业化裁剪移除) |
| Azure AD / Okta | OIDC | `IIdPAdapter` |
| SendGrid / Postmark | API | `IEmailProvider` |
| Twilio | API | `ISmsProvider` |
| Datadog / Prometheus | 推送 | `IMetricsSink` |
| Sentry | 推送 | `IErrorSink` |

---

## 7. 关键流程

### 7.1 在线激活

```
SDK → POST /v1/customer/licenses/activate
  { activationKey, hardwareId, hostname, os, sdkVersion }
   ↓
API: 校验激活码(未使用/未吊销/未超期/席位可用)
   ↓
LMC: LicenseGenerator.GenerateAsync(活跃签名密钥,负载含 key_version)
   ↓
DB: 创建 Activation + Device + LicenseEvent
   ↓
LMC: 返回签名 license
   ↓
SDK: 存储本地缓存(加密)
   ↓
Webhook: license.activated
```

### 7.2 离线激活

> **现状注记**:离线激活的**校验与签发已收敛到共享服务 `AirgapActivationService`**(`src/LicenseManager.Api/Services/AirgapActivationService.cs`),客户自助入口 `POST /v1/customer/licenses/airgap-activate` 与 Portal 离线入口 `POST /v1/portal/offline/airgap-activate` **共用同一校验链**,任一入口都不得绕过校验直接签发。校验链(按序):**归属 → 状态 → 硬件绑定 → 席位占用 → 签发**:
>
> 1. **归属**:激活码须是当前客户名下许可证的密钥;不存在/非本人统一返回 404(文案一致,避免泄露存在性);
> 2. **状态与有效期**:Revoked/Disabled/Suspended/Expired 各返回 422,ProblemDetails `title` 为机器可读错误码 `LICENSE_REVOKED` / `LICENSE_DISABLED` / `LICENSE_SUSPENDED` / `LICENSE_EXPIRED`;
> 3. **硬件绑定**:许可证已绑定硬件或配置 `AllowedHardwareIds` 白名单时,请求 `HardwareId` 不匹配返回 422 `HARDWARE_MISMATCH`;
> 4. **席位占用**:`MaxDevices > 0` 的许可证必须携带 `HardwareId` 并经 `ILicenseManager.ActivateOrVerifyAsync` 占用激活席位(缺 HardwareId 返回 422 `HARDWARE_ID_REQUIRED`,席位不足返回 422 `ACTIVATION_LIMIT_REACHED` 等);`MaxDevices = -1`(不限)时 HardwareId 可选、不占座;
> 5. **签发**:负载携带真实 `LicenseType` / `ExpiresAt` / `MaxDevices` / `MaxActivations` / `Features`(不再硬编码 NodeLocked + 永不过期),经 `ILicenseGenerator.GenerateAsync` 签名(含 `key_version`)。
>
> 配套离线端点(客户自助,`CustomerController`):
> - `POST /v1/customer/licenses/airgap-decode`:离线解码/验签(含负载 HardwareId 比对,不符 422 `HARDWARE_MISMATCH`);
> - `GET /v1/customer/licenses/revocations`:**离线吊销列表**(返回当前客户已吊销许可证的 `license_id` / `license_key` / `reason`),离线客户端偶尔联网拉取并缓存,本地验签通过后若命中吊销列表应降级或停止服务;
> - `POST /v1/customer/licenses/{licenseId}/airgap-sync`:**离线用量回传对账**,离线期间累计的功能消费增量逐条入账(`UpdateFeatureConsumptionAsync`),超出上限的增量逐条返回失败原因,不影响其余增量入账。
>
> 另有 .req/.resp 文件交换通道(`OfflineActivationService`,`POST /v1/portal/offline/upload-req` 上传 .req,管理端处理后下发 .resp)。下图为文件交换通道的目标流程:

```
终端:
  1. 用户输入 activationKey
  2. 生成 .req 文件(含硬件指纹 + 公钥;Core 提供请求生成能力)
  3. 用户通过 U 盘/邮件传 .req 到控制台/门户
门户/管理端:
  4. 上传 .req(POST /v1/portal/offline/upload-req,接收后排队处理)
  5. AirgapActivationService 校验链(归属→状态→硬件绑定→席位占用)后签发
     (ILicenseGenerator.GenerateAsync,负载含 key_version)
  6. 返回 .resp 文件
终端:
  7. 用户加载 .resp
  8. LMC 验签(按 key_version 取公钥)+ 应用 license
```

### 7.3 浮动借出

```
SDK 启动 → 借出请求
  { productId, hardwareId, leaseDuration }
   ↓
Floating Server: 校验席位池
   ↓
  - 若有席位:扣减,返回 leaseToken,记录 Lease(过期时间 = now + leaseDuration)
   ↓
  - 若无席位:进入排队 OR 返回 429(可借用模式)
   ↓
SDK 周期心跳: refresh leaseToken(renew expiry)
   ↓
到 leaseDuration 未续:自动归还席位
   ↓
License 继续可用(本地缓存),无网络可继续到本地 lease 缓存期
```

### 7.4 订阅续费(自动)

```
Scheduler 每天扫描:subscription.renew_at <= today + 7
   ↓
T-7 通知:邮件 + 站内
T-3 通知
T-1 通知
T 触发续费:系统自动执行续期(后台每小时扫描,亦可手动触发)
   ├─ 成功: license.expires_at += interval, 发 license.renewed 事件
   └─ 失败: 保持 PastDue 并按周期重试, 发 subscription.payment_failed 事件
```

### 7.5 退款回收(已移交)

> 退款属于资金流转,已随商业化裁剪移交外部销售系统。许可证吊销与设备停用由管理员在授权管理中手动执行,或由外部系统回调触发;吊销后发 `license.revoked` 事件并联动 DSR/数据清理(若适用)。

---

## 8. 横切关注点

### 8.1 认证授权

- **内部用户**:OIDC + 本地账号
- **客户用户**:OIDC / 邮箱密码 + MFA
- **SDK/API Key**:API Key(`Authorization: ApiKey keyId:secret`)或 HMAC 签名(`Authorization: Hmac keyId:signature`,签名输入 `timestamp+"\n"+body`)或 JWT(`Authorization: Bearer <jwt>`)——三方案由平台主 API 的 `AuthenticationMiddleware` 统一识别
- **认证双轨(现状)**:平台主 API(`lm-api`)走 `Authorization` 头三方案(Bearer JWT / ApiKey / Hmac);**独立浮动服务器 `LicenseManager.Server` 不走该模型**,其 `ApiKeyMiddleware` 只认 **`X-Api-Key`** 请求头,与 `FloatingLicensing:ApiKey` 配置比较(`string.Equals` Ordinal 比较):失败 401 `INVALID_API_KEY`,未配置密钥 503 `SERVER_NOT_CONFIGURED`(fail-closed),豁免 `/health`、`/healthz`、`/swagger`、`/openapi`
- **个人访问令牌 (PAT)**:Bearer + scope
- **授权**:RBAC + 资源范围(`org_id` / `customer_id`)
- **会话**:JWT **8 小时**,**无 refresh token**(过期后重新登录;refresh token 机制列路线图)
- **公钥分发(免认证)**:`GET /v1/keys` 列入 `PublicPathRegistry` 白名单,返回签名公钥(key_version/algorithm/public_key/public_key_pem/status/activated_at/retired_at),供离线客户端按 `key_version` 验签;`Retired` 状态密钥仍保留在分发列表,保证历史签名可验证(密钥轮换见 §10.3)
- **多租户隔离**:EF Core Global Query Filter(17 个实体,反射动态附加)+ `TenantId` 列(14 个未被复合索引覆盖的实体另有 `TenantId` 普通索引,迁移 `AddTenantAndLookupIndexes`);数据库级 RLS 列路线图

### 8.2 日志/审计/追踪

| 类别 | 存储 | 保留 |
| --- | --- | --- |
| 应用日志(结构化 JSON) | ELK / Loki | 30 天 |
| 访问日志 | PostgreSQL + S3 归档 | 12 个月 |
| 审计日志(不可变) | PostgreSQL 独立表 + WORM 存储 | 7 年 |
| 性能指标 | Prometheus / VictoriaMetrics | 13 个月 |
| 分布式追踪 | Jaeger / Tempo | 30 天 |
| 错误 | Sentry | 90 天 |
| 安全事件 | SIEM(可选 Splunk / Elastic SIEM) | 1 年 |

- **关联 ID**:每个请求由服务端生成 `requestId`,贯穿所有日志/追踪
- **审计 actor 快照**:用户变更不影响历史(联动 M14.3)
- **PII 脱敏**(路线图):日志中 email/电话/IP 默认脱敏——当前版本未实现,以代码为准

### 8.3 错误处理

- **统一错误响应**(信封,见 API Spec §4.2):
  ```json
  {
    "success": false,
    "error": {
      "code": "license.NotFound",
      "message": "License was not found.",
      "details": { "...": "..." }
    },
    "requestId": "...",
    "timestamp": "2026-07-23T12:00:00.000Z"
  }
  ```
- **错误码字典**:统一注册,`GET /v1/error-codes` 可拉取(41 个码)
- **HTTP 状态语义**:4xx 客户端错,5xx 服务端错
- **业务异常基类**:`DomainException` / `ValidationException` / `ConcurrencyException`,由 `ExceptionHandlingMiddleware` 统一映射

### 8.4 缓存

| 缓存项 | TTL | 失效策略 |
| --- | --- | --- |
| License 详情 | 60s | 写时失效 |
| 客户配置 | 5min | 写时失效 |
| 角色权限 | 10min | 写时失效 |
| 产品/特性 | 10min | 写时失效 |
| RSA 公钥 | 24h | 密钥轮换时主动失效 |
| 限流计数 | 1min | 固定窗口 |
| 错误码字典 | 1h | 启动加载 |

- **现状缓存**:进程内 `IMemoryCache`(L1);Redis(L2)为可选组件,配置 `ConnectionStrings:Redis` 后启用(如分布式限流),未配置时全部回退进程内
- **防缓存击穿**:single-flight(目标)
- **防雪崩**:TTL 抖动 ±10%(目标)

### 8.5 限流

> **现状**:固定窗口限流(每分钟),默认 100 次/分(代码默认;仓库 `appsettings.json` 配置 600,`RateLimit:PerMinute` 可配);已认证请求按 `sub` claim(回退 `NameIdentifier`)限流(`sub:` + sub),匿名请求按客户端 IP 限流;超限返回 429 + `Retry-After: 60`,错误体 `error.details` 含 `limit` / `window_seconds` / `retry_after_seconds`,**无 `X-RateLimit-*` 头**。多实例需配置 Redis 并设 `RateLimit:Distributed=true`,否则为实例级内存限流。下表其余维度为目标形态。

| 维度 | 默认 | 配置 |
| --- | --- | --- |
| 已认证用户 sub / 匿名 IP(现状已实现双维度) | 100 次/分(仓库配置 600) | `RateLimit:PerMinute` |
| API Key 全局 | 1000 QPS(目标) | 套餐配额 |
| API Key 单端点 | 100 QPS(目标) | |
| 登录 | 15 分钟内 5 次失败即锁定 | `LoginSecurityService` |
| 激活 | 10 次/min/Key(目标) | 防暴力 |
| Webhook 投递 | 单轮最多 50 条,5 秒轮询 | `WebhookDeliveryWorker` |
| SDK 心跳 | 6 次/小时/lease | 客户端配置 |

### 8.6 时钟与时间

- **NTP**:所有节点强制 NTP 同步(气隙:由操作员配置)
- **服务端时间**:UTC 存储,按用户时区展示(M21.2)
- **客户端防回拨**:`LicenseManager.Core` 记录 last-known-time,检测回拨(M3.6/M45)
- **过期宽限期**:`grace_period` 默认 1h,可配

---

## 9. 性能、可扩展、可用性

### 9.1 性能

- 关键路径:P95 < 100ms(在线验证)、< 300ms(激活)
- 大批量操作异步化(批量签发 1000 个 license ≤ 30s)
- DB 索引覆盖 95% 常见查询
- 慢查询阈值 > 200ms 告警
- APM 自动 profiling(CPU/内存/IO)

### 9.2 可扩展

- **横向**:API 无状态,N 副本并行
- **纵向**:PostgreSQL 读写分离
- **席位状态**:外置 Redis Cluster
- **事件总线**:RabbitMQ 集群
- **存储**:S3 兼容(对象存储)水平扩展
- **多区域**:云托管模式支持

### 9.3 可用性

| 模式 | RTO | RPO | 适用 |
| --- | --- | --- | --- |
| 单实例 | N/A | 0(本地备份) | 演示/小客户 |
| HA(同区域) | < 5min | < 1min | 中型客户 |
| 多区域(云托管) | < 1h | < 5min | 大型客户 |
| 灾备(异地) | < 24h | < 1h | 金融/医疗 |

- **熔断**:Polly,目标服务不可用时降级
- **降级**:外部依赖(IdP)失败时,只读 + 缓存继续可用(原 PSP 依赖已随商业化裁剪移除)
- **限流保护**:服务过载时拒绝新请求,保护核心

### 9.4 容量规划(基线)

| 资源 | 单实例 | HA |
| --- | --- | --- |
| CPU | 8 vCPU | 16 vCPU × 2 |
| 内存 | 16 GB | 32 GB × 2 |
| 存储 | 500 GB SSD | 1 TB SSD × 2(主+从) |
| 网络 | 1 Gbps | 1 Gbps × 2 |
| DB 连接池 | 100 | 200 |
| Redis | 4 GB | 8 GB Cluster |
| RabbitMQ | 4 GB | 8 GB Cluster |

---

## 10. 安全架构

### 10.1 纵深防御

```
┌─ 网络层: WAF · DDoS · TLS 1.2+ · mTLS(可选)
├─ 主机层: 最小化 OS · SELinux/AppArmor · SSH Key
├─ 应用层: CSP · XSS · CSRF · SQLi(参数化)
├─ 业务层: RBAC · 资源范围 · 输入校验
└─ 数据层: 字段级加密 · 脱敏 · 审计
```

### 10.2 加密

- **传输**:TLS 1.2+ 强制,可选 mTLS
- **静态**:
  - DB 透明加密(TDE)或文件系统加密
  - PII 字段级加密(AES-GCM)
  - 密钥分层:KMS/HSM 主密钥 → 数据加密密钥
- **代码签名**:SDK 内置 RSA 验证,license 必须经私钥签名

### 10.3 密钥管理

- **LMC RSA 密钥**:Core 层由 `LicenseManager.Core.Security.SigningKeyStore` 统一管理(PKCS#1 RSA 密钥对,`SigningKey(Version, PublicKey, PrivateKey)`);`LicenseManager.Tools keygen`(lmcli)可生成独立密钥对文件
- **私钥存储**:
  - Core 内存存储为默认(测试/示例);配置 `License:SigningKeyPath`(映射 `LicenseManagerCoreOptions.SystemKeyPath`)后,密钥**全版本持久化到 JSON 文件**(原子写 tmp+move,Unix 0600),进程重启后自动恢复——否则重启会使既有签名许可证全部验签失败
  - 平台侧另有 `system_key` 表(`SystemKey` 实体,公钥 Base64 + 私钥密文,状态 `SystemKeyStatus { Active, Retired, Compromised }`)供平台级密钥台账
  - 生产环境建议叠加 KMS/HSM 静态加密(路线图)
- **密钥轮换(已实现)**:`SigningKeyStore.Rotate(RotationPolicy)` 生成新版本密钥并设为活跃,**旧版本保留**以便既有签名仍可验证;签名负载携带 `key_version`(`SignedLicense.KeyVersion`),验证端按版本取对应公钥(未知版本报 `KEY_VERSION_UNKNOWN`);`GET /v1/keys` 分发全部版本公钥(含 `Retired`,见 §8.1)
- **API Key Secret**:KMS 加密存储(目标);当前 `SecretProtector` 静态加密(原 PSP Secret 已随商业化裁剪移除)
- **JWT 签名密钥**:KMS 加密,定期轮换(目标)

### 10.4 身份与访问

- **内部用户**:OIDC 优先 + 本地账号备选
- **MFA**:Super Admin / Sales / Support 强制 TOTP/WebAuthn
- **客户用户**:邮箱 + 密码 + MFA(可选)
- **SDK**:API Key + 签名 + 限流
- **会话**:JWT Bearer(8 小时,无 refresh)
- **失败处理**:15 分钟窗口内 5 次失败即锁定(`LoginSecurityService`),异常登录告警;登录尝试记录于 `login_attempt` 表(`IRepository<LoginAttempt>`,经 `EfRepository` EF 持久化,与 IP 白名单 `ip_whitelist_entry`、防重放 `nonce_record`、幂等 `idempotency_record` 同批接入)——这 4 张安全台账表已包含在各方言 `InitialCreate` 迁移中,详见 Database Migration Guide

### 10.5 审计

- 所有写操作写不可变审计
- 包含 actor 快照(用户变更不影响历史)
- 7 年保留(合规)
- 客户自助导出(DSR)
- WORM 存储(防篡改)

### 10.6 漏洞与合规

- **SCA**:Snyk / OSV / Trivy
- **SAST**:Semgrep / CodeQL
- **DAST**:OWASP ZAP(自动化)
- **Pen Test**:每次大版本由第三方执行
- **Bug Bounty**:公开披露页
- **CVE 跟踪**:内部 + 公开披露
- **合规**:ISO 27001 路径 / SOC2 / GDPR

---

## 11. 技术选型

| 维度 | 选型 | 备选 | 理由 |
| --- | --- | --- | --- |
| 后端语言 | **C# / .NET 8** | - | LMC 原生语言,生态齐全 |
| 后端框架 | **ASP.NET Core 8** | - | 与 LMC 配套 |
| ORM | **EF Core 8** | Dapper | 业务复杂优先 EF,性能关键路径 Dapper |
| 消息总线 | **进程内队列 + BackgroundService**(现状) | RabbitMQ(路线图) / Azure Service Bus | 当前版本无 RabbitMQ 引用 |
| 缓存 | **IMemoryCache**(现状) | Redis 7(可选,已支持分布式限流) / Dragonfly | Redis 非必选 |
| 对象存储 | **S3 兼容(MinIO)** | - | 私有化标准 |
| 关系 DB | **MySQL 8**(appsettings 默认) | PostgreSQL(代码默认提供器,compose 示例;仅 MySQL 走 EF Migrate) / SQL Server | 私有化首选 |
| 全文搜索 | **PostgreSQL FTS** | OpenSearch | MVP 用 PG,FTS 不足时再上 OpenSearch |
| 前端 | **Vue 3 + Vite + TS** | React 18 | 团队熟悉度(建议),可换 |
| UI | **Element Plus** | Ant Design | 国内主流 |
| 文档站 | **Docusaurus** | MkDocs | React 生态 |
| 营销站 | **Astro** | Next.js | 静态优先 |
| 状态页 | **自研 + 开源 status-page** | Atlassian Statuspage | 私有化首选 |
| 监控 | **Prometheus + Grafana** | Datadog | 私有化标准 |
| 日志 | **Loki / ELK** | Splunk | 私有化 |
| 追踪 | **Jaeger / Tempo** | - | OTel 兼容 |
| 错误 | **Sentry(自托管)** | GlitchTip | 隐私友好 |
| 密钥 | **HashiCorp Vault / KMS** | - | 私有化 + 云 |
| 调度 | **进程内 BackgroundService**(现状) | Quartz.NET / Hangfire(路线图) | 当前版本无 Quartz 引用 |
| 验证 | **DataAnnotations / 手写校验**(现状) | FluentValidation(路线图) | 当前版本无 FluentValidation 引用 |
| Map | **手写映射**(现状) | AutoMapper / Mapster | 当前版本无 AutoMapper 引用 |
| 序列化 | **System.Text.Json** | - | 高性能 |
| API 文档 | **OpenAPI 3.1 + Swagger**(仅 Development 挂载) | - | 标准 |
| 单元测试 | **xUnit + FluentAssertions** | NUnit | 主流 |
| 集成测试 | **xUnit + WebApplicationFactory 等**(现状) | Testcontainers(路线图) | 当前版本无 Testcontainers 引用 |
| E2E | **Playwright** | Cypress | 跨浏览器 |
| CI/CD | **GitHub Actions / GitLab CI** | Jenkins | 主流 |
| IaC | **Terraform / Helm** | - | 主流 |
| License 核心 | **LicenseManager.Core**(LMC) | - | 本项目核心 |

---

## 12. 关键设计决策(ADR)

### ADR-001:以 Aegis 为核心,重命名为 LicenseManager.Core
- **状态**:已接受
- **背景**:Aegis 1.4.0 提供 6 种许可证模型,签名验证,LMC 化后作为基础
- **决策**:1:1 重命名,保留所有原 API,新增 `Abstractions` 接口层
- **后果**:上游 2 周合入,合入冲突优先保留 LMC 命名;法务 NOTICE 注明基于 Aegis

### ADR-002:LicenseManager.Core 与平台层通过 Abstractions 解耦
- **状态**:已接受
- **决策**:平台不直接 new 内部类,所有依赖通过 `ILicenseGenerator` / `ILicenseManager` / `IFeatureManager` 注入
- **后果**:核心升级不影响业务;LMC 可独立测试与发布

### ADR-003:PSP 抽象层,平台不直接依赖任一 PSP
- **状态**:已废弃(已随商业化裁剪下线:`IPaymentProvider` 与 PSP 适配器已移除,资金流由外部销售系统承接)
- **决策**:`IPaymentProvider` 抽象,内部订阅模型与 PSP 解耦
- **后果**:可热插拔 PSP,支持迁移;私有化部署客户用自己凭证

### ADR-004:Webhook 失败"挂起重试"而非禁用
- **状态**:已接受
- **来源**:Cryptlex 2025-11 真实变更
- **决策**:失败 N 次后挂起订阅,事件日志继续记录,管理员可手动重放
- **后果**:避免沉默失败,提升可观测性

### ADR-005:订阅模型升级到 SubscriptionInterval + SusbcriptionStartTrigger
- **状态**:已接受
- **来源**:Cryptlex 3.78.0 引入,废止 Validity / ExpirationStrategy
- **决策**:新模型为标准;旧 license 通过迁移工具升级
- **后果**:语义更清晰,支持更复杂的订阅策略

### ADR-006:Entitlement Sets / Tier 替代 Product Version + Feature Flag
- **状态**:已接受
- **来源**:Cryptlex 3.78.0
- **决策**:License 引用 Set + Tier,可在继承上覆盖
- **后果**:支持更灵活的层级与覆盖

### ADR-007:License Manager 与 License User 分离
- **状态**:已接受
- **来源**:LicenseSpring v3.252+
- **决策**:Manager 负责管理,User 负责使用,角色与权限独立
- **后果**:支持 B2B 多人协作管理同一 license

### ADR-008:审计 actor 不可变快照
- **状态**:已接受
- **来源**:Cryptlex 2026-04
- **决策**:审计写入用户快照,用户变更不影响历史
- **后果**:审计可追溯,符合合规

### ADR-009:Webhook 事件统一目录(扩展自原 4 类)
- **状态**:已接受
- **决策**:统一事件命名(目录现 **37 条**,由 `WebhookEventCatalogService` 集中维护;原 46 条中资金流事件已随商业化裁剪移除),事件负载符合 CloudEvents 1.0
- **后果**:客户集成一次,订阅全量

### ADR-010:私有化优先,云托管可选
- **状态**:已接受
- **决策**:主产品形态为私有化,云托管作为可选附加
- **后果**:所有 IdP 凭证不出客户环境,平台不接触敏感凭据(原 PSP 凭证要求已随商业化裁剪移除)

### ADR-011:多品牌/多租户通过 tenant_id + brand_id 隔离
- **状态**:部分废弃(多品牌/白标部分已随商业化裁剪移除;多租户 tenant_id 隔离保留)
- **决策**:单实例多租户 + 品牌白标;大客户独立实例
- **后果**:灵活部署,降低单客户成本

### ADR-012:OIDC SSO 端到端支持(SDK 端)
- **状态**:已接受
- **来源**:Cryptlex `AuthenticateUserWithIdToken`
- **决策**:SDK 接收 IdP token 验证身份,平台支持 JIT 用户开通
- **后果**:Named User 场景下用户体验顺滑

### ADR-013:License 文件本地缓存(离线)
- **状态**:已接受
- **决策**:SDK 加密缓存 license,断网可用,联网自动同步
- **后果**:支持气隙与弱网场景

### ADR-014:浮动 Lease / Cooldown / Grace 完整语义
- **状态**:已接受
- **来源**:10Duke `LeaseTimeBehavior` + Cryptlex `leaseDuration`/`cooldownTime`/`serverSyncGracePeriod`
- **决策**:`leaseTimeCheckOut` / `leaseTimeCache` / `cooldownTime` / `serverSyncGracePeriod` / `-1 表示无限制`
- **后果**:支持更精细的浮动策略

### ADR-015:EULA Use Types 严格区分
- **状态**:已接受
- **决策**:Workstation / Server / Cloud / Enterprise / OEM 用途严格区分,客户在线签署
- **后果**:法务清晰,避免商用合规风险

### ADR-016:Custom Fields 分 Product vs License
- **状态**:已接受
- **决策**:两层字段,产品级 + License 级覆盖,Allowed Values + ViewPermissions
- **后果**:灵活的元数据扩展

### ADR-017:Personal Access Token 与 ApiKey 并存
- **状态**:已接受
- **决策**:用户级 PAT(长期,UI 创建) + ApiKey(应用级,自动生成)
- **后果**:不同场景用不同凭据,便于审计与撤销

### ADR-018:Floating Server 独立分发(M44)
- **状态**:已接受
- **来源**:LicenseSpring Floating Server v2
- **决策**:独立服务 **`LicenseManager.Server`**(`lm-floating-server`:8083)独立分发;当前实现提供 Swagger + 租约 API(`LeasesController`:checkout/heartbeat/release)+ `LeaseService` 内存租约存储 + `LeaseSweeper` 后台清理,认证仅 `X-Api-Key`(见 §8.1);React UI 与 SQLite/PG 双后端为目标形态,当前版本**未实现**(无 UI,席位状态为进程内存)
- **后果**:客户内网部署轻量,多 FS 共享主平台;内存租约存储在进程重启后不保留,外置化(Redis/DB)列路线图

### ADR-019:消费型授权作为 License 类型,而非独立产品
- **状态**:已接受
- **决策**:新增 `Consumption` 许可证类型,通过 `max_consumption` / `max_overages` 等元数据配置
- **后果**:与现有模型融合,降低用户理解成本

### ADR-020:文档、SDK、API 全部版本化
- **状态**:已接受
- **决策**:LTS 分支 18 个月,API 24 个月不破坏,弃用提前 6 个月通知
- **后果**:可预测的演进路径

---

## 13. 演进路径

### 13.1 v1.0 范围
- LMC 重构(§3.3)
- 57 个核心功能模块(M1–M57)
- ~~支付集成(M58–M59)~~(已随商业化裁剪下线,移交外部销售系统)
- 商业化(GRB checklist)
- 私有化 + 单实例 HA

### 13.2 v1.1 计划
- HA 多区域(同区域)
- ~~Webhook 事件扩展到 40+ 类~~(已完成,目录现 46 条)
- refresh token 会话机制
- 外置消息总线(RabbitMQ)与 L2 缓存(Redis)
- AI 异常检测(license 风险评分)
- 国密合规(SM2/SM3/SM4)可选模块
- ~~更多 PSP(Adyen / Braintree / Lemon Squeezy)~~(已随商业化裁剪下线)

### 13.3 v1.2+ 计划
- 多区域容灾
- 区块链存证(可选)
- 智能合约 License(NFT,可证伪)
- AI 客户健康度预测

---

## 14. 风险与缓解

| 风险 | 概率 | 影响 | 缓解 |
| --- | --- | --- | --- |
| Aegis 上游重大变更 | 中 | 中 | 2 周合入,API 抽象层保护 |
| 私有化客户环境差异大 | 高 | 中 | 提供官方镜像 + 离线安装 + 完整文档 |
| ~~PSP 接口频繁变更~~ | ~~高~~ | ~~中~~ | ~~适配器抽象 + 监控告警~~(已随商业化裁剪移除,风险不再适用) |
| 浮动状态外置后一致性问题 | 中 | 高 | Redis Cluster + Lease 续期 + Grace Period |
| 大规模审计写入影响性能 | 中 | 中 | 分区表 + 冷存储 + 异步写入 |
| 私钥泄露 | 低 | 极高 | KMS/HSM + 轮换 + 多签 + 审计告警 |
| Webhook 洪水 | 中 | 中 | 限流 + 退避 + 死信 + 监控 |
| 跨境数据传输合规 | 中 | 高 | 区域化部署 + 法务审核(原数据驻留能力已随商业化裁剪移除) |
| 多租户数据泄露 | 低 | 极高 | RLS + 单元测试 + 渗透测试 |
| AI 模块被攻击 | 中 | 中 | 输入校验 + 模型审核 + 监控 |

---

## 15. 附录

### 15.1 关联文档

- [RDP v1.0.1](./LicenseManager-Platform-RDP-v1.0.1.md) - 产品需求
- [LicenseManager.Core Dev Guide](./LicenseManager.Core-Development-Guide-v1.0.md) - 核心库开发
- [Database Design](./LicenseManager-Platform-Database-Design-v1.0.md) - 数据库设计
- [API Spec (OpenAPI 3.1)](./LicenseManager-Platform-API-Spec-v1.0.md) - API 规范
- [Deployment Guide](./LicenseManager-Platform-Deployment-Guide-v1.0.md) - 部署运维

### 15.2 参考

- [LSXPrime/Aegis](https://github.com/LSXPrime/Aegis) - LMC 上游
- [Microsoft .NET 架构指南](https://learn.microsoft.com/dotnet/architecture/)
- [CloudEvents 1.0](https://cloudevents.io/)
- [OpenAPI 3.1](https://spec.openapis.org/oas/v3.1.0)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [PCI DSS 4.0](https://www.pcisecuritystandards.org/)
- [GDPR](https://gdpr-info.eu/)
- [ISO 27001](https://www.iso.org/standard/27001)
