Files
craftlabs-authorization-sdk/docs/engineering/WORKSPACE_ENGINEERING_LAYOUT.md
T
huangping 76ff98db87 docs(i1): engineering index, parallel tracks, and product context
Add PARALLEL_ITERATION_INDEX, workspace layout, system architecture,
three-track execution packs, BPM/product references, and planned
service manifests. Supports I1 alignment across backend, web, and SDK.

Made-with: Cursor
2026-04-06 21:04:49 +08:00

19 KiB
Raw Blame History

工作区工程划分与仓库边界 — 架构说明

角色:资深架构师对工作区现有资产与 创飞客户商务与交付管理平台 相关文档的对照走查结论。
范围:本 Git 工作区根目录 craftlabs-authorization-sdk物理目录、构建边界、发布物、与外部工程的契约在本提交中迁移 java/native/ 路径(避免破坏既有 CI 与本地脚本)。
关联系统架构全景(图 + 全量组件) · 功能模块 · BPM 与排期 · 平台与比特对接 · 三轨并行执行索引 · 根目录 engineering/ 清单


1. 走查结论(摘要)

维度 现状 架构建议
工作区身份 客户端授权 SDKJava + Native)为核心,配套 Schema、示例配置、产品/平台文档 保持本仓库 「授权 SDK + 契约资产」 为一等公民;商业交付平台Spring Boot 4.0. + Vue不宜与 JNI/native 强耦在同一 Maven 树内混建
构建 java/ Maven 多模块;native/ CMake 动态库 CI 双轨Java 与 Native 可并行;平台后端/前端 独立仓库或独立根级目录 时再挂接新 workflow
文档 docs/ 已覆盖比特规则、Callback、创飞平台 BPM、模块、权限 文档继续集中在 docs/工程边界以本文 + engineering/单一事实来源(SSOT
缺口 根目录无 README;平台 Webhook、管理端未在代码层体现 **engineering/planned/** 占位说明 推荐独立仓库名与技术栈;实现阶段按 manifest 开仓

2. 工作区逻辑分层(C4-L1

flowchart TB
  subgraph WS["本工作区 craftlabs-authorization-sdk"]
    S[SDK Java API]
    N[Native craftlabs_auth_bitanswer]
    SCH[schemas/ craftlabs-auth-config]
    EX[examples/]
    DOC[docs/]
  end

  subgraph EXT["规划中的独立工程(见 engineering/planned"]
    WH[license-webhook-ingress]
    API[delivery-platform-api]
    UI[delivery-platform-ui]
  end

  BA[比特安索云/控制台]
  CLI[现场客户端产品]

  N --> S
  S --> CLI
  SCH --> CLI
  WH -->|POST Callback| BA
  API -->|读写字段| WH
  UI --> API
  DOC -.->|约束| SCH

原则运行时依赖从平台 API → Webhook → 比特 为一条链;客户端仅依赖 Maven 发布的 SDK 工件 + JSON 配置(校验用 Schema),不依赖平台 UI。


3. 物理目录与职责(当前实现)

路径 工程类型 职责 构建命令(摘要)
**java/** Maven pom 聚合 craftlabs-auth-core(配置模型/校验/桥接)、craftlabs-auth-bitanswercraftlabs-auth-selfhostedcraftlabs-auth-tests mvn -f java/pom.xml verify
**native/** CMake libcraftlabs_auth_bitanswer、JNI、自研 HTTP 占位 native/build 或项目 README
**schemas/** JSON Schema craftlabs-auth-config 契约,与 AuthConfigs 对齐 无编译;CI 可 ajv/脚本校验
**examples/** 样例 config/*.jsonjava/python 烟测 随测试引用
**docs/** 文档 产品、比特对接、工程架构 无构建
**engineering/** 工程元数据 manifest、planned 占位、边界说明 无构建

禁止:在未做迁移方案前,将 Spring Boot 应用 塞进 java/ 下与 craftlabs-auth-* 并列 —— 会导致发布周期、依赖(Boot vs 库消费者)冲突。
平台端正确做法:在 独立仓库多模块开发,由 唯一 bootstrap 模块 执行 spring-boot-maven-plugin repackage,对外只发布 一枚 Fat JAR(见 §5.3)。


4. Maven 模块边界(SDK 内部)

craftlabs-auth-parent
├── craftlabs-auth-core      # 无第三方授权运行时;配置、NativeBridge 接口
├── craftlabs-auth-bitanswer # System.loadLibrary + BitAnswerProvider
├── craftlabs-auth-selfhosted
└── craftlabs-auth-tests     # 集成/配置测试
  • 对外发布坐标:以 cn.craftlabs:craftlabs-auth-* 为准;版本与 changelog 在发布流水线维护。
  • 平台后端若需读取同一配置模型:优先 复制 DTO + 共用 Schema,或将来抽取 **craftlabs-auth-config-model 极小 jar**(另案);禁止在平台可执行 JAR 中引入 craftlabs-auth-bitanswer(会拉起 JNI/native 期望,属边界错误)。

5. 客户端 SDK 与平台端:深入评估与防混淆

5.1 二者不可混为一谈

维度 客户端 SDK(本仓库 java/ + native/ 平台端后端delivery-platform-api 等独立工程)
运行位置 客户现场业务进程 / 边缘 AI 设备 创飞机房 / 云(VPC
核心职责 Bit_Login、特征项、本地/云授权运行时 合同、交付、SN 台账、Callback 处置、RBAC、报表
典型依赖 BitAnswer 官方 native + BitAnswerProvider Spring Boot、DB、MQ BitAnswer 客户端 native
交付形态 多枚 薄 JAR + 各 OS 动态库(与 JAR 同版本) 单枚可执行 Fat JAR(或容器内同等物)每个可部署服务一枚
Spring Boot 不使用(库代码,避免与宿主应用 Boot 版本冲突) 使用4.0. 线),仅 启动模块 打 Fat JAR
配置 craftlabs-auth-config JSON + Schema 平台自有 application.yml + PostgreSQL 15 数据源;ORM 为 MyBatis-PlusJSON Schema 仅用于 校验导出的客户端配置(若实现)

硬规则:平台进程 不得 System.loadLibrary("craftlabs_auth_bitanswer");不得在服务端 classpath 引入 **craftlabs-auth-bitanswer** 模块(除非未来出现「纯 Java、无 native」的只读适配且经架构评审——当前 不存在)。

5.2 命名与仓库层面的识别

  • SDK 坐标cn.craftlabs:craftlabs-auth-*(artifact 前缀固定,文档与 BOM 中一眼可辨)。
  • 平台坐标:建议 cn.craftlabs.platform:*cn.craftlabs.delivery:*禁止复用 craftlabs-auth-* 作为应用模块 artifactId)。
  • CI 流水线SDK 与 platform-* 使用 不同 job,产物上传 不同仓库路径Maven .../sdk/ vs .../platform/)。

5.3 单 JAR 部署 vs 分模块开发(平台 / Webhook)

诉求:运维只下发 一个 app.jar(或镜像内 java -jar app.jar);研发仍按 领域拆分模块,边界清晰、编译快、测试可隔离。

推荐 Maven 形态(每个 独立可部署后端 各自一套父 POM,勿与 SDK 父 POM 合并):

delivery-platform/                    # 或 license-webhook 同理
├── pom.xml                             # packaging=pomdependencyManagement
├── platform-domain/                    # 实体、领域服务接口、无 Spring Web
├── platform-application-service/       # 用例、事务边界、调用 domain
├── platform-adapters-web/              # REST Controller、DTO 映射
├── platform-adapters-persistence/      # MyBatis-Plus Mapper / XMLPostgreSQL 15
└── platform-bootstrap/                 # 唯一含 main + spring-boot-maven-plugin
    └── src/main/java/.../Application.java
  • platform-bootstrap 配置 spring-boot-maven-plugin**repackage**(或 executable),依赖其余模块为 普通 jar,打进 Fat JAR / Executable JAR
  • mvn -pl platform-bootstrap -am package → 产出 platform-bootstrap/target/*.jar 一枚,即部署单元。
  • 开发体验IDE 打开 聚合工程,多模块跳转、分模块单测;禁止在多个模块上重复声明 repackage(否则出现多枚「可执行」JAR 或依赖错乱)。

可选变体

  • 分层 jarSpring Boot 2.3+layertools 优化镜像层 —— 仍对应 单次构建的一条启动入口
  • Webhook 与 Core API 分开发布:两个 Maven 工程各产 一枚 Fat JARwebhook-bootstrap.jarplatform-bootstrap.jar),比强行塞进一个进程更符合 扩容与故障隔离;若强制单进程,可用 同一 bootstrap 模块多 profile(一般 不推荐,耦合过高)。

5.4 SDK 侧构建(对照:不是 Fat JAR)

  • craftlabs-auth-core / bitanswer / selfhosted 均为 library jar不打 spring-boot-maven-plugin
  • 客户端应用(客户自有 Spring Boot 或其它)自行打包 Fat JAR,声明依赖 craftlabs-auth-bitanswer + 携带 匹配版本 native
  • 平台 Fat JAR客户应用 Fat JAR两条完全不同的发布线,不得在平台 POM 里 dependency 整条 SDK 父工程。

5.5 评审检查(单 JAR + 分模块)

  • 全仓库是否 只有一个 模块声明 spring-boot-maven-pluginrepackage(针对该可部署应用)?
  • mvn dependency:tree -pl platform-bootstrap 中是否 craftlabs-auth-bitanswer
  • 部署文档是否写清:启动类 FQCN、java -jar 与 JVM 参数、与 SDK 版本无耦合

6. Native 边界

  • 产出物:各平台 .so / .dylib / .dll + 头文件。
  • 与 Java 契约NativeBridgejni_bridge.cpp 必须 同版本发布
  • 平台服务链接本 native 库;仅 现场 AI/业务进程 链接。

7. 规划工程划分(推荐独立 Git 仓库)

下列目录在 **engineering/planned/** 中以 README 描述,默认新开仓库(名称可调整):

规划 ID 建议仓库名 技术栈(与产品文档对齐) 与本工作区关系
license-webhook-ingress craftlabs-license-webhook(示例) Spring Boot 4.0.,仅 Ingress + 验签 + MQ 消费比特 Callback依赖 SDK native
delivery-platform-api craftlabs-delivery-platform Spring Boot 4.0.,领域 API、PostgreSQL 15MyBatis-Plus 依赖 schemas 可通过 git submodule 或发布 schema 包
delivery-platform-ui craftlabs-delivery-platform-ui Vue 3 + Vite 调用 delivery-platform-api

可选 Monorepo:若公司策略要求单仓,可采用 Bazel / Gradle composite / 多根 pom 父子不包含 SDK 的目录隔离,例如:

mega-repo/
  craftlabs-authorization-sdk/   # 本仓库 subtree 或 submodule
  delivery-platform/
  license-webhook/

迁移成本高于 三仓 + 契约版本化默认推荐三仓


8. CI/CD 划分建议

组件 触发路径 产物
SDK Java java/** Maven deploy(私服/Central
SDK Native native/** 各 OS 工件 + 与 Java 同版本 tag
Schema schemas/** 可与 SDK 同步发 minorbreaking 走 major
平台与 Webhook 独立仓库(或本仓 services/ Fat JAR + 部署说明(systemd/脚本/docker run);不强制 容器与 K8s,规模化后再考虑镜像与编排

9. 数据与配置契约

  • 客户端craftlabs-auth-config.schema.json + 环境 bitanswer.url 等(见 examples/config)。
  • 平台:存储 SN、合同、Callback 等 —— 领域模型独立于 SDK;仅 映射表 与比特特征 ID 与 M6 文档一致。
  • Webhook Payload:以比特官方规则文档为准;平台侧 反序列化 DTOlicense-webhook 仓维护。

9.1 平台数据栈(架构锁定)

约定
数据库 PostgreSQL 15(生产、验收、联调基准版本;镜像 postgres:15
ORM MyBatis-PlusSpring Boot 3 使用 mybatis-plus-spring-boot3-starter;升级 Spring Boot 4 时改用官方 mybatis-plus-spring-boot4-starter 并回归)
迁移 Flyway 或 Liquibase(后续迭代引入;与表结构变更门禁对齐)
单测 可不启真实 PGH2 MODE=PostgreSQL 或 Testcontainers postgres:15,以团队门禁为准

实现参考:services/delivery-platform-api 已接入 MyBatis-Plus + JDBC;本地数据库见 services/docker-compose.yml


10. 安全边界

展开:威胁面、分组件控制、信任边界图与评审清单见 SYSTEM_ARCHITECTURE.md §9

10.1 密钥与凭据

  • Webhookx-bitanswer-token / 与比特约定的共享密钥 部署机环境变量权限受限的本地配置文件(如 chmod 600);禁止 写入 Git、镜像层与公开 CI 日志。
  • 平台数据库JDBC URL、用户名、密码 注入运行时;docker-compose 与示例 不得 作为生产凭据模板。
  • 管理端:演示账号(如 dev/admin禁止 用于生产;生产至少 强口令。团队尚小时 不强制 上云 KMS / Vault;规模与合规要求上来后再演进。
  • SDK 发布防篡改:以 SYSTEM_ARCHITECTURE §9.8 为准(官方渠道、SHA-256、建议 GPG、同 tag 发布 JAR+Native)。

10.2 运行时与数据面

  • 传输:对外 仅 HTTPSWebhook、管理 API、浏览器);比特 Callback 终端 不接明文 HTTP(除本机健康检查等受控例外)。
  • SDK:配置 JSON 不落 平台库表作为默认设计;禁止examples/ 与文档示例中放置真实 bitanswer.url 密钥或生产 SN。
  • 服务端 classpath禁止 craftlabs-auth-bitanswerSystem.loadLibrary —— 避免将 客户端攻击面 引入机房。
  • 日志与排障Callback 正文、Authorization、数据库 URL 默认脱敏或不打;生产日志外送需合规评估。

10.3 授权与访问控制

  • 管理 API认证(谁)鉴权(能否操作资源) 分层;与 M11 角色矩阵一致,防范 越权(IDOR
  • Webhook认证先于重逻辑幂等 防重放污染;Body 大小限制 防 DoS。

10.4 供应链与构建

  • Maven/npm 锁定版本;力所能及时做 依赖漏洞扫描SCA)。
  • SDK 对外发布:每个版本附带 SHA-256 清单强烈建议 GPG 签名maven-gpg-plugin 或 GitHub signed releases);详见 SYSTEM_ARCHITECTURE §9.8

11. 演进检查清单(架构评审用)

  • 新代码是否落在正确 仓库/目录SDK vs 平台 vs Webhook)?
  • Schema 变更是否 双向 更新 Java AuthConfigs + 文档?
  • Native 与 Java 是否同 tag 发布
  • 平台是否 误引 craftlabs-auth-bitanswer 到服务端 classpath
  • 平台构建是否 仅 bootstrap 模块 产出 Fat JAR,且无重复 repackage
  • 安全Webhook 生产是否 启用 共享密钥/签名?Actuator 敏感端点是否 已收敛?新接口是否 默认拒否 并完成 鉴权?日志是否 明文 Token/Callback
  • 安全SYSTEM_ARCHITECTURE §9.7 评审项是否逐项可追溯?
  • SDK 发布SYSTEM_ARCHITECTURE §9.8 是否落实 官方渠道 + 校验和(+ 签名)+ JAR/Native 同 tag

12. 修订记录

日期 说明
2026-04-06 初版:工作区走查、目录边界、规划仓库与 CI 划分;落地 engineering/ manifest 与 planned/* 占位。
2026-04-06 增补:§5 客户端 SDK vs 平台端 防混淆表;多模块开发 + 单 Fat JAR 的 Maven 模块划分与 repackage 约束;CI 坐标命名建议。
2026-04-06 关联:PARALLEL_ITERATION_INDEX.mdtracks/0103 三轨并行执行包。
2026-04-06 §9.1 锁定平台 PostgreSQL 15 + MyBatis-Plusservices 工程对齐依赖与本地 docker-compose
2026-04-06 新增汇总文档 SYSTEM_ARCHITECTURE.md(系统架构图 + 全量组件清单)。
2026-04-06 §10 安全边界扩写(密钥、传输、SDK、鉴权、供应链);§11 增补安全评审项;与安全专章 SYSTEM_ARCHITECTURE §9 交叉引用。
2026-04-06 小团队假设:凭据以宿主机环境变量/受限文件为主,不强制 K8s/KMS§10.1/10.4§11 对齐 SDK §9.8 发布完整性。
2026-04-06 §8 CI/CD 表:平台产物以 Fat JAR + 部署说明 为主,不强制 K8s。