Operations 是平台的运维应用编排层。它聚合模块注册表、租户 Store、后台作业目录、配置声明和一组 Framework 运维 Port,同时提供 Schema、备份、恢复与归档命令。它已经不再是早期知识库所描述的“只读控制台”。
1. 模块在架构中的位置
模块本地只有 Contracts 与 Application 两个项目。数据库迁移、备份和归档实现位于 Framework Infrastructure;审批后端来自 API Host 与 OpsExtension;后台执行器也由共享 Framework 和 Host 组合。
2. 当前能力面
| 能力 | 当前实现 | 关键限制 |
|---|---|---|
| 治理报告 | 模块数、依赖、缺失依赖、环、Mermaid | 是运行时注册表快照,不是历史治理仓库 |
| 租户列表 | ITenantStore.ListAsync 分页 | 只有列表,没有搜索总数或生命周期操作 |
| 适配器报告 | 探测约 35 个 Port 与 Runtime License | 大多按实现类名前缀分类,不是主动健康探测 |
| 外部连接器就绪度 | 8 个 Legal/Tools 连接器的配置与适配器注册态 | 只读配置与装配,不发起真实连通探针;改动需重启 |
| 配置诊断 | 扫描 [ConfigKey] + Host 补充声明 | 只检查缺失与长度,不测试连通性或语义 |
| 缓存治理 | 11 区域目录、健康/指纹、失效、fill-missing / full-rebuild | 仅 Host 身份;本地内存 Provider 不支持标签失效;lazy-only 区域拒绝 rebuild |
| 作业 | 目录报告、持久化调度、启停、立即执行 | 查询仍投影代码 Catalog,不读取持久化修改值 |
| Schema | 漂移、脚本预览、Safe/FullForce 执行 | 没有计划绑定、锁;逐句失败仍整体成功 |
| 备份 | Full/Differential/Log、验证、恢复、列表 | 仅 SqlSugar SQL Server;恢复不会先 VERIFYONLY |
| 归档 | 两个固定策略、租户执行、批次查询 | 仅 SQL Server;ColdStorage 明确未接入;手动归档审计 fail-closed |
3. 代码地图
| 位置 | 责任 |
|---|---|
BitzOrcas.Platform.Operations.Contracts | 治理、适配器、配置、作业、备份公开 DTO |
BitzOrcas.Platform.Operations.Application | 查询、命令、权限、审批和审计编排 |
BitzOrcas.Application | 作业、Schema、备份、归档与审批 Port |
BitzOrcas.Infrastructure.SqlSugar | SQL Server Schema、备份、恢复、活跃归档实现 |
BitzOrcas.Api | 手写 HTTP 端点、审批适配器、配置声明聚合 |
Operations 没有自己的 Infrastructure 项目,不等于没有基础设施行为;它把这些行为委托给共享基础设施适配器。
4. HTTP 表面要分两类阅读
手写 OperationsEndpointGroup 映射作业管理、归档与缓存治理,共 9 条路由,并统一加认证、userPolicy 限流和精确权限。
Application 另有 16 个 [GenerateEndpoint] 声明,覆盖治理、租户、适配器、配置、外部连接器就绪度与 Schema/备份端点。当前生成器的 EnumerateAllTypes 不递归嵌套类型,因此不能把“有特性”直接等同于“已对外可达”。
# 对照手写映射和自动声明,审查真正的运行时端点来源。rg -n "Map(Get|Post|Put)|GenerateEndpoint" \ src/Hosts/BitzOrcas.Api/Endpoints/OperationsEndpointGroup.cs \ src/Platform/Operations -g '*.cs'
# 当前生成器只遍历 namespace members,没有 GetTypeMembers 递归。rg -n "EnumerateAllTypes|GetTypeMembers" \ src/Framework/BitzOrcas.Endpoint.SourceGenerator/GenerateEndpointSourceGenerator.cs5. 授权模型
OperationsPermissions 当前声明 19 个权限,其中包括缓存治理的两个权限(operations.cache.view / operations.cache.manage)。Website 分析死信的两个权限虽由 Operations 拥有,但路由位于 Website Host 端点组。
手写端点使用 RequirePermission;请求本身还实现 IAuthorizedRequest,通过资源与动作进入统一授权管道。新增路由时必须证明这两套表达不会漂移,而不是只看其中一层。
6. 审批模型
API Host 注册的 ProductionSensitiveOperationApprovalPort 在 Production 与 Staging 令 IsApprovalRequired=true。它把 OpsExtension Incident 的 Resolved 或 Closed 当作批准。
非强制环境的 ValidateAsync 直接成功。即使命令无条件调用 ValidateAsync,也不等于“所有环境强制审批”。没有 OpsExtension Store 时,强制环境只要工单号非空也会降级放行。
7. 当前保证与不可假设
| 可以依赖 | 不可假设 |
|---|---|
| 19 个权限目录项 | 16 个自动声明全部运行时可达 |
| 手写作业管理、归档与缓存治理路由 | Schema/备份已有完整 HTTP 合同证据 |
| 当前漂移重新生成脚本 | 预览和执行绑定同一 PlanHash |
| SQL Server 恢复前创建快照 | 恢复前自动执行 VERIFYONLY |
| 作业执行有共享审计信封 | 调度修改已同步到所有调度实例 |
| 归档按租户事务迁移、手动审计 fail-closed | ColdStorage 已经可用 |
8. 典型阅读路径
- 想建设运维首页:先读治理、适配器、配置与租户;
- 想执行数据库结构变更:读Schema 漂移与迁移安全;
- 想管理 Quartz/回退调度:读后台作业运行控制;
- 想做灾备或数据生命周期:读备份、恢复与归档;
- 想评估上线:读安全、测试、运维与商业 GA;
- 想做缓存失效或排查连接器装配:见本页缓存与连接器治理一节;
- Incident、CAP 失败、Webhook 死信和配置刷新属于 Ops Extension。
9. 缓存治理与外部连接器就绪度
这两组能力都围绕”只读投影 + 受控失效”展开,但来源与保证不同,不能混用。
9.1 缓存治理
缓存治理给平台运维一个狭窄、Host 专属入口:查询区域健康与指纹、按区域失效、对可预热区域执行补洞或全量重建。内部 Tag / Redis key 永不进入 HTTP 合同。横切规则与完整矩阵见缓存指南 · 区域目录。
能力端口 ICacheGovernancePort(Framework)声明 Provider:ProviderMode(LocalMemory / Distributed)、SupportsTagInvalidation、SupportsCrossInstanceInvalidation。FusionCacheStore 支持标签与跨实例失效;MemoryCacheStore 的 SupportsTagInvalidation 为 false。
运行时真相源 ICacheAreaCatalog(DefaultCacheAreaCatalog),Operations 侧 CacheGovernanceCatalog 同步公开区域键。当前 11 个区域:
| 公开区域键 | 内部标签(不对外) | 可预热 / 重建 |
|---|---|---|
settings | settings | 是 |
master-data | dictionary | 是 |
translations | i18n | 是 |
delivery | delivery-config | 是 |
identity-organization | identity-organization-directory | 是(需 TenantIds) |
identity-users | identity-user-directory | 是(需 TenantIds) |
identity-security | identity-lockout-policy | 是(需 TenantIds) |
workflow | workflow | 否(仅失效) |
navigation | menus | 否(仅失效) |
authorization | authorization:permission | 否(仅失效) |
chat-presence | chat-presence | 否(仅失效) |
三个 Host-only 操作(CallerType: Host、TenantId == "0"):
| 方法 | 路径 | 权限 | 确认令牌 | 说明 |
|---|---|---|---|---|
| GET | /api/operations/cache | operations.cache.view | — | 能力 + 区域健康 / 指纹 / 最近预热 |
| POST | /api/operations/cache/invalidate | operations.cache.manage | INVALIDATE | 按区域 Tag 失效;sensitivePolicy |
| POST | /api/operations/cache/rebuild | operations.cache.manage | WARM 或 REBUILD | mode=fill-missing|warm 或 full-rebuild|rebuild;可带 TenantIds |
rebuild 请求体关键字段:Area、Mode、TenantIds?、ApprovalTicket、Reason、Confirm、IdempotencyKey。lazy-only 区域返回 Operations.Cache.WarmupUnsupported。
守卫链(失效与重建共用):Host 身份 → 区域目录 → Provider 能力(LocalMemory 失效/重建会 ProviderUnsupported)→ 审批工单 → 原因与确认令牌 → 幂等键 → 两阶段活动审计(审计写失败 fail-closed)。
启动侧可选 Cache:Warmup(默认 EnabledOnStartup=false),见生产配置与缓存指南。
9.2 外部连接器就绪度
GET /api/operations/connectors 返回 8 个外部连接器的配置与装配态,资源为 operations/adapters、动作 View。报告字段:Group、Connector、Provider、Status(Configured/NotConfigured/Unavailable)、AdapterRegistered、AdapterImplementation、ConfigurationSection、ChangesRequireRestart(固定为 true)、DependentCapabilities。
| Group | Connector | 配置段 |
|---|---|---|
| Legal | ElectronicSignature | LegalConnectors:Signature |
| Legal | EnterpriseInfo | LegalConnectors:EnterpriseInfo |
| Legal | LegalDatabase | LegalConnectors:LegalDatabase |
| Legal | Express | LegalConnectors:Express |
| Legal | SfLegalDocument | LegalConnectors:Express:SfLegal |
| Tools | IManage | Connectors:iManage |
| Tools | Ocr | Connectors:Ocr |
| Tools | Crawler | Connectors:Crawler |
这份报告与 §6 讲的”适配器报告”不是一回事。适配器报告按实现类名前缀把约 35 个内部 Port 分成 Production/Default/Unknown 等类别,回答”容器能解析出什么”。连接器就绪度则按业务连接器维度,回答”这个外部系统的配置段是否存在、适配器是否注册”,且 Provider SDK 缺失时会以 fail-closed 的 Unavailable 代理呈现。两者应当分开呈现。
报告只读配置与装配态,不发起真实连通探针,ChangesRequireRestart 固定为 true 意味着改动连接器配置后必须重启进程才生效。
10. 最小调用示例
// ① 请求声明资源 operations/governance + View,统一授权管道据此决策。var query = new GetGovernanceReport.Query();
// ② Handler 从 AppModuleRegistry 生成当前进程的治理快照。Result<ModuleGovernanceReport> result = await mediator.Send(query, cancellationToken);
// ③ MermaidGraph 是展示数据;发布门禁仍应运行架构测试。if (result.IsSuccess && result.Value!.HasCircularDependencies) release.Block("模块依赖存在环");11. 源码核查
# 模块本地项目与全部用例。find src/Platform/Operations -maxdepth 3 -type f -name '*.cs' \ -not -path '*/bin/*' -not -path '*/obj/*' | sort
# 权限、资源动作与 HTTP 表面。rg -n "PermissionDefinition|ResourceDescriptor|GenerateEndpoint|RequirePermission" \ src/Platform/Operations src/Hosts/BitzOrcas.Api/Endpoints/OperationsEndpointGroup.cs \ -g '*.cs' --glob '!**/bin/**' --glob '!**/obj/**'
# 缓存治理区域目录、重建与 Host 身份规则。rg -n "CacheGovernanceCatalog|RebuildCacheArea|ConfirmToken|CacheGovernanceRules|ICacheAreaCatalog" \ src/Platform/Operations src/Framework -g '*.cs'
# 外部连接器就绪度报告。rg -n "GetExternalConnectorReadiness|ExternalConnectorReadinessEntry" \ src/Platform/Operations -g '*.cs'
# 不应出现旧文档虚构的计划和锁实现。rg -n "PlanId|PlanHash|DistributedLock|MigrationPlanStore" \ src/Platform/Operations -g '*.cs'