技术架构

四层架构 + 一条集成总线 + 一套双形态运行时。所有技术点都回答三个问题:用什么、怎么接、为什么不用别的。

Vue 3 + CesiumSpring Boot + PostGISPython 算法网关MinIO + WORMB/S + C/S 零分支

3.1架构总览

架构的核心不是"层数多",而是边界清楚:业务不碰算法、算法不碰业务库、三维不碰业务逻辑、集成层承担所有外部不确定性。

LAYER 01展示层PRESENTATION
B/S Web 主端Vue 3 · 浏览器
C/S 桌面端Electron · 本地 GPU
三维量测工作台Cesium + Three.js
报告 / 大屏HTML → PDF
移动端 H5整改拍照 / 待办
LAYER 02业务服务层BUSINESS
工程与主数据PROJECT / WBS
任务调度TASK / FLOW
指标核验引擎RULE ENGINE
缺陷闭环DEFECT / SLA
报告与归档REPORT / PACKAGE
LAYER 03集成层INTEGRATION
算法任务网关HTTP + Webhook + MQ
GIM 解析适配器CLI / 容器
PMS / EAM 适配器REST / ESB
对象存储客户端S3 / 预签名
统一鉴权OIDC / LDAP
LAYER 04数据层DATA
PostgreSQL + PostGIS业务 / 空间索引
MinIO / S3成果大文件
Redis缓存 / 分布式锁
RabbitMQ任务 / 事件
WORM 归档IMMUTABLE
CROSS-CUTTING横切能力PLATFORM
审计日志AUDIT
权限模型RBAC + ABAC
可观测OTel / Prom
任务追踪TRACE ID
配置中心NACOS / ENV
备份恢复RPO ≤ 15min
原则一:模块化单体优先

一期团队 ≤ 15 人,不上微服务。按领域分模块、单库单事务,M4 后按压力拆 2–3 个服务即可。

原则二:所有外部依赖都加适配器

算法、GIM、PMS、存储、鉴权全部走接口。外部变更只改适配器,不改业务代码。

原则三:三维与业务解耦

工作台通过 `SceneAPI` 与业务通信:加载图层、拾取、量测、截图。业务不知道 Cesium 的存在。

3.2技术栈全表

选型优先考虑:内网可离线部署、国产化兼容、团队可招、许可证干净。版本号指一期基线。

层技术点选型接入 / 使用方式为什么
前端Web 框架Vue 3.5 + TS 5.6 + Vite 6SPA,按模块懒加载;Pinia 管状态;Vue Router 管路由与权限守卫。国内团队熟悉、生态稳、招人容易
前端组件库Element Plus 2.9按需引入;通过 CSS Token 覆盖为平台设计语言。表格/表单/树场景成熟
三维GIS 底座CesiumJS 1.124仅使用 Viewer / Camera / 坐标 / 3D Tiles 加载;关闭不用的控件与地形服务。地理坐标与瓦片标准成熟,轻量可控
三维点云渲染Potree 2.0 / 3D Tiles pntsPotreeConverter 转 octree;或直接 pnts 瓦片;统一由 `PointCloudLayer` 封装。亿级点云 LOD 成熟
三维3DGS 渲染自研 WebGL2 Splat Renderer加载 .splat / .ply / SOG / SSOG;GPU 排序 + SH 颜色;与 Cesium 相机同步。避免研究许可;可控性能
仿真OpenUSD / SimReadyUSD 24.x + SimReady 1.0GIM → USD 转换;输出 .usda/.usdc/USDZ;碰撞、质量、摩擦、关节、语义标签;GUID ↔ Prim 映射。机器人训练主资产(Isaac Sim / Omniverse)
三维3DGS 交付格式SOG / Streamed SOGPLY 作源文件与归档;Web 发布转 SOG(压缩 15–20×);大场景用 lod-meta.json 空间树流式加载。显存与带宽数量级下降(参考 MipMap3D)
三维瓦片加载3d-tiles-renderer 0.4Three.js 场景内加载 3D Tiles;与 Cesium 共用相机矩阵。弥补 Cesium 对点云/自定义材质不足
三维GIM 线框glTF / 自定义 BufferGeometryGIM 解析后转 glTF + 构件 ID 映射表;按构件拾取。浏览器原生高效
前端图表ECharts 5.5按需引入;报告页复用同一套 option。国内工程图表适配好
桌面桌面壳Electron 33主进程管窗口/文件/更新;渲染进程加载同一 Web Bundle;本地 sidecar 提供 GPU 任务。交付快、Node 生态成熟
后端业务服务Java 21 + Spring Boot 3.3模块化单体:project / task / indicator / defect / archive / system。强类型、事务、国网生态兼容
后端ORM / 迁移MyBatis-Plus + Flyway复杂空间查询写 XML;表结构版本化迁移。SQL 可控、审计友好
算法算法网关Python 3.11 + FastAPI独立服务,暴露任务提交/查询/取消/回调;Celery 执行长任务。贴近算法生态、胶水能力强
算法几何计算NumPy / SciPy / Open3D圆柱拟合、平面拟合、悬链线、最短距离;以纯函数封装,可单测。算法团队可复用、可验证
数据业务库PostgreSQL 16 + PostGIS 3.4主数据、指标、缺陷强关系;空间字段用 geometry/geography。事务 + 空间一体
数据对象存储MinIO (S3)预签名上传/下载;分片、断点续传、版本控制、Object Lock。私有化、S3 兼容、可换云
数据消息队列RabbitMQ 3.13任务下发、状态事件、通知;DLQ + 重试队列。长任务解耦、可靠投递
数据缓存Redis 7会话、字典、分布式锁、任务进度。简单够用
集成鉴权Keycloak 26 (OIDC)对接 LDAP/AD;前端 Authorization Code + PKCE;后端 resource server。标准协议、可接国网 4A
集成接口文档OpenAPI 3.1 + AsyncAPI代码生成 TS 客户端;Mock Server 供前端联调。契约先行落地手段
运维容器与编排Docker + Compose / K8s一期 Compose 单机;多项目并发或 HA 时上 K8s。降低一期运维复杂度
运维可观测OTel + Prometheus + Grafana + LokiJava/Python/前端统一 OTLP 上报;traceId 全链路透传。排障刚需
质量CI/CDGitLab CE + Harbor内网流水线:lint → test → SAST → image scan → 部署。离线、可控
许可证红线:3DGS 原始参考实现(INRIA/MPII)为研究许可,不可商用。Cesium 采用 Apache-2.0,但部分生态插件可能是 GPL/AGPL,引入前必须过许可证扫描(FOSSA / ScanCode)。交付件中附 SBOM。
MipMap3D 参考:其公开产品已输出 PLY / SOG / SOGTiles,并采用分块训练 + LOD 流式渲染。本项目应吸收"SOG 作为 Web 发布格式、PLY 作为归档源文件"的经验;是否采购 Engine 作为备选,见 第 08 章。

3.3前端与三维架构

三维工作台是整个平台技术难度最高的地方。它不是"嵌一个 Cesium",而是"三个渲染通道 + 一套坐标 + 一套拾取 + 一套量测"。

前端分层

应用层 · App Shell

路由、权限、布局、主题、国际化、错误边界、埋点。

业务模块层 · Features

project / task / indicator / defect / archive / report / admin,按路由懒加载。

领域组件层 · Components

指标表格、三级判定标签、缺陷时间线、资产校验卡、量测结果面板。

三维适配层 · SceneAPI

唯一允许 import Cesium / Three.js 的地方。对外只暴露 loadLayer / pick / measure / screenshot。

平台适配层 · Platform

DataPathProvider / ComputeProvider / ShellBridge,隔离 B/S 与 C/S 差异。

基础设施层 · Core

HTTP 客户端、鉴权、错误码、埋点、缓存、工具函数。

SceneAPI:三维与业务的唯一接口

TS Interface
// 业务层只依赖这个接口,不依赖 Cesium
interface SceneAPI {
  load(layer: LayerSpec): Promise<LayerHandle>
  setCamera(view: ViewPreset | CameraPose): void
  setLayerVisible(id: string, v: boolean): void
  setOpacity(id: string, v: number): void
  pick(screen: Vec2): PickResult | null
  measure(tool: MeasureTool, points: Vec3[]): MeasureResult
  snap(screen: Vec2, radius: number): Vec3 | null
  screenshot(opt?: ShotOpt): Promise<Blob>
  on(event: SceneEvent, cb: Function): Unsubscribe
}

这一层做对,未来换 Cesium 版本、换渲染库、甚至换 WebGPU,都不影响业务代码。

三通道渲染与坐标统一

通道 A · 3DGS

SOG / SSOG 优先,.splat / .ply 兼容 → GPU 排序 → 球谐颜色 → 与相机同步。支持分层 LOD、裁剪框、透明度。

WebGL2SOG自研
通道 B · 点云

Potree octree / 3D Tiles pnts;按屏幕空间误差加载;支持按分类、强度、高程着色。

LOD亿级
通道 C · GIM

解析为 glTF + 构件映射;线框模式 + 半透明实体;按设备编码拾取。

glTF构件级

坐标转换链:一次说清

最容易出错
1
采集坐标系
WGS84 / CGCS2000
2
投影
高斯-克吕格 3° 带
3
工程本地坐标
ENU 原点 + 旋转
4
ECEF
Cesium 世界坐标
5
屏幕
投影 / 拾取
铁律:所有成果入库时必须带 CRS(EPSG 码 + 中央经线 + 投影参数)。缺 CRS 直接拒收。平台内部统一用 CGCS2000 / EPSG:4490 存储地理坐标,渲染时转 ECEF,量测在工程本地 ENU 中计算,避免大坐标数值精度损失。

性能预算(1 亿点 / 单工程 20 GB)

指标目标手段降级策略
首屏可交互≤ 8 s瓦片预加载 + 首屏 LOD + Web Worker 解析先加载低精度,再渐进
帧率≥ 30 FPS点预算控制、实例化、GPU 排序关闭 3DGS / 降低点密度
拾取延迟≤ 50 msGPU picking + 空间索引退回屏幕空间近似
内存占用≤ 2.5 GBLRU 卸载、分块加载限制同屏图层数
量测精度≤ 10 mmfloat64 本地坐标 + 拟合算法—

3.4后端架构

一期采用"模块化单体 + 一个独立算法网关",而不是一上来拆 10 个微服务。理由很现实:团队规模、事务一致性、运维成本。

业务服务模块划分

模块职责关键表
project工程、标段、单位工程、参与方prj_project / prj_unit
dataset数据登记、版本、成果、CRSds_asset / ds_version
task算法任务、状态机、回调tsk_task / tsk_event
indicator规则库、量测、判定、证据ind_rule / ind_result
defect缺陷、整改单、复验dfc_defect / dfc_flow
archive资产包、哈希、签署、WORMarc_package / arc_file
report模板、快照、导出rpt_template / rpt_job
system用户、角色、字典、审计sys_user / sys_audit

为什么不是微服务

团队规模不匹配

一期 6–8 名研发。微服务的部署、链路、配置、联调成本会吃掉 30% 产能。

强事务场景多

指标判定 + 缺陷生成 + 证据写入必须在一个事务里。跨服务分布式事务是自找麻烦。

部署环境受限

国网内网、等保、离线升级。一个 compose 栈比 10 个服务好运维得多。

但保留拆分缝

模块间只通过应用服务接口调用,不跨模块查表。未来按 task / indicator 拆出即可。

唯一独立部署:算法网关(Python)。因为它依赖算法生态、需要独立扩缩容、故障隔离要求高。

核心事务:一次指标判定写入什么

// IndicatorService.verify() 单事务
1. select ind_rule for update              // 锁定规则版本,防止并发改规则
2. 计算 design / model / sample / deviation       // 纯函数,可单测
3. 三级判定 verdict + reasonCode                  // pass / watch / fail / pending
4. insert ind_result(含 ruleVersion、algoVersion)
5. insert ind_evidence × N(文件 ID + 哈希 + 截图 + 量测点)
6. if fail → insert dfc_defect + 初始化状态机
7. insert sys_audit(who / when / before / after)
8. 发事件 indicator.verified → 报告/看板异步刷新
注意:判定结果不允许被"覆盖更新"。规则版本或模型版本变化时,生成新的 ind_result 版本,旧版本保留。否则无法解释"为什么上周是合格,这周是超限"。

3.5集成层与接入方式

这一节是交底重点:每个外部系统到底怎么接、用什么协议、失败怎么处理、谁负责。

外部系统接入方式接口约定失败处理负责人
算法平台
重建/配准/分割
HTTP REST Webhook S3 平台 POST 任务单(含输入清单、参数、回调地址);算法侧返回 taskId;进度通过 webhook 或 GET 轮询;成果写回预签名 S3 路径;完成回调携带 manifest。 超时 30s;失败重试 3 次指数退避;回调签名校验;重复回调幂等。 算法接口人
算法平台
大规模异步
RabbitMQ(可选) topic: algo.task.submit / algo.task.progress / algo.task.done;消息体同 HTTP schema;DLQ 保存 7 天。 消费幂等、死信告警、人工重放。 算法接口人
GIM 解析工具 CLI / 容器 挂载工作目录,执行 gim-parser --in /work/in --out /work/out --crs EPSG:4547;stdout 输出 JSON 摘要;退出码 0/2/3 定义成功/数据错/内部错。 超时 10 min;沙箱无网络;输出目录只读校验;失败保留现场。 工具提供方
PMS / EAM REST / ESB OAuth2 client credentials;设备台账查询、资产编码映射、转资回写;字段映射表可配置。 夜间全量 + 变更增量;失败进入补偿队列;不阻塞主流程。 业主信息中心
设计院 DMS / 协同平台 REST / 工单 设计复核单、现场澄清、设计变更、GIM 版本回写;工单双向同步,外部单号对账。 超时重试 + 人工催办;设计变更触发重新配准与指标复算。 设计接口人
统一身份 / 4A OIDC / LDAP Authorization Code + PKCE;token 15 min;refresh 8 h;角色从 LDAP 组映射。 降级到本地账号(仅管理员),强制审计。 业主信息中心
时间戳服务 RFC 3161 归档时对包哈希申请 TSA 时间戳;无外网时使用内网 TSA 或哈希链 + 可信时钟。 失败则挂起归档,不允许"先归档后补"。 安全管理员
电子签章 SM2 / PAdES PDF 签署接口;证书由业主 CA 颁发;签章位置模板化。 签章失败保留待签状态,可重试。 安全管理员

算法交接时序(必须按这个顺序联调)

平台前端业务后端算法网关算法服务对象存储数据库 提交重建任务 校验 + 建任务单 生成预签名 URL POST 任务单幂等键 + 回调 执行重建立GPU 队列 上传成果 + manifest 对象存储写入 回调 done + 哈希 校验 manifest 通过 → 入库 / 拒收 版本化落库
联调顺序建议:先做"文件约定"(对象存储 + manifest)跑通,再做 HTTP 回调,最后才上 MQ。这样算法团队第一周就能交付成果,不被平台接口阻塞。

3.6数据与存储架构

业务数据用关系库,成果数据用对象存储,空间数据用 PostGIS,归档数据用 WORM。四类数据四种策略,不要混。

对象存储目录规范

s3://verif-prod/
├── projects/{projectId}/
│   ├── raw/{datasetVersion}/images|las|control/
│   ├── recon/{taskId}/splat|pointcloud|tiles/
│   ├── gim/{gimVersion}/source|gltf|props/
│   ├── evidence/{indicatorId}/{resultId}/
│   ├── defects/{defectId}/photos/
│   └── reports/{reportId}/
├── archive/{projectId}/{packageVersion}/
│   └── manifest.json + 9 类成果 + signatures/
└── tmp/{taskId}/            // 7 天生命周期
  • 桶策略:业务桶私有,归档桶开启 Object Lock(Compliance 模式)。
  • 上传:前端分片直传预签名 URL,后端只发凭证,不中转大文件。
  • 下载:短时效预签名(≤ 5 min),审计记录。
  • 版本:同名文件不允许覆盖,路径带版本号。

核心数据模型(简版 ER)

prj_project工程主数据 ds_asset数据/成果版本 tsk_task算法任务 ind_result指标结果 prj_unit单位工程/区域 ds_version版本 + CRS + 哈希 ind_rule规则 DSL + 限值 ind_evidence证据链 dfc_defect缺陷台账 dfc_flow状态迁移 arc_package资产包 sys_audit审计日志 1:N N:1
索引建议:PostGIS 空间索引(GIST)用于构件包围盒与区域查询;ind_result(project_id, category, verdict) 组合索引支撑 408 项看板;tsk_task(status, created_at) 支撑任务队列;审计表按月分区。

3.7B/S + C/S 双形态

这不是"做两个版本",而是"一套业务代码 + 三个适配点"。架构必须让差异收敛到可枚举的接口。

B/S 主端

运行时
浏览器(Chrome / Edge 100+)
数据面
平台对象存储
算力
平台集群 / GPU 队列
优势
免安装、易升级、跨地域
限制
涉敏数据不作为默认通道

C/S 桌面端

运行时
Electron 33(Win 10/11)
数据面
本地盘 / 工程内网盘
算力
本地 GPU + sidecar
优势
数据不出内网、可离线
限制
安装包、升级、驱动兼容

铁律:业务代码零分支

禁止 if (isDesktop) 出现在业务组件、页面、store 中。
允许 差异只出现在 platform/ 目录下的三个 Provider 实现。
构建 同一份 Web Bundle,注入不同 PlatformProvider。
差异点抽象接口B/S 实现C/S 实现注意
数据路径DataPathProviderS3 预签名 URL本地文件协议 + 内网盘映射统一返回可读流,不暴露路径
算力调度ComputeProvider提交到集群队列调用本地 sidecar(GPU)任务状态机保持一致
文件系统FileBridge浏览器下载 / File System Access API原生保存对话框 / 批量导出大文件分片与断点
外壳能力ShellBridge无(降级)窗口、托盘、离线缓存、自动更新能力探测,不可用则隐藏入口
打印 / 截图ExportBridgeCanvas → Blob → 下载原生打印 / 高分辨率导出DPI 与色彩一致
现实建议:Electron 包体积约 150–200 MB,内网离线升级需要完整包 + 差分包。若业主对安装包体积或内存敏感,可评估 Tauri 2(约 10 MB),但需要 Rust 能力,且本地 sidecar 管理要另做。一期建议 Electron,二期再评估 Tauri。

3.8部署拓扑

典型国网内网部署:办公区访问、应用区计算、数据区存储、GPU 区渲染、算法区隔离、备份区兜底。

ZONE A · 办公内网 ZONE B · 应用区 ZONE C · 数据区 ZONE D · GPU / 算法 ZONE E · 归档 / 备份 验收工程师 Chrome / Edge C/S 桌面端 Electron + local sidecar 监理 / 业主 只读看板 / 签署 NAC / 终端准入 802.1x · 补丁基线 反向代理 / WAF Nginx · TLS 1.3 · 限流 verif-web 静态资源 · 2 副本 HTTP/2 · gzip · 长缓存 verif-core Spring Boot · 2–4 副本 JVM 2 GB · 无状态 verif-algo-gateway FastAPI · 2 副本 Celery worker × 2 Keycloak OIDC · LDAP 联邦 PostgreSQL 16 主 + 备 · PostGIS PITR · 每日全备 MinIO 集群 4 节点 · EC 4+2 S3 · 版本 · 预签名 Redis 7 哨兵 · 缓存 / 锁 RabbitMQ 镜像队列 · DLQ 监控 / 日志 Prom · Loki · Grafana GPU 节点 A10 / A100 × N 本地重建 / 推理 算法服务 算法团队部署 仅暴露网关端口 单向文件摆渡 涉敏原始数据 WORM 归档 Object Lock 保留 ≥ 30 年 异地备份 RPO ≤ 15 min 图 3-1 部署拓扑:所有跨区访问经反向代理与防火墙;GPU 区与算法区单向摆渡,业务库不落原始涉敏数据。
应用节点
2–4
可水平扩展
GPU 节点
2
A10 24G × 2 起
存储容量
50TB
按 20 工程估算
网络
10GbE
应用 ↔ 存储

3.9安全与等保

等保三级不是"上线前补材料",而是架构里就要有的东西。以下条目建议逐项落到设计与代码评审清单。

领域措施落地位置
身份OIDC + MFA;账号锁定;会话超时 30 minKeycloak / 网关
授权RBAC + ABAC;接口级 + 数据行级Spring Security
传输TLS 1.2+;国密 SM2/SM4 可选Nginx / 服务间 mTLS
存储敏感字段加密;对象存储 SSEPG / MinIO
审计登录、导出、判定、签署全留痕;不可删sys_audit + WORM
备份数据库 PITR;对象存储跨节点;异地副本运维平台
漏洞镜像扫描、依赖扫描、SAST、渗透测试CI + 上线前
供应链SBOM、许可证扫描、制品签名Harbor / Cosign
数据分级
L1 公开 / L2 内部 / L3 敏感(原始影像、点云、坐标)/ L4 核心(涉密)。L3 以上禁止出内网;C/S 本地处理;导出需审批与水印。
存证链
文件 SHA-256 → 包哈希 → TSA 时间戳 → 电子签章。四步缺一不可,且必须可离线验证。哈希算法变更需版本化。
算法团队隔离
独立 Service Account;仅任务前缀读写;禁止列举桶;禁止访问业务库;所有调用带 traceId 与签名。

3.10可观测性与运维

指标 Metrics

接口 P95/P99、任务队列长度、GPU 利用率、渲染帧率、对象存储吞吐、判定耗时。

日志 Logs

结构化 JSON;traceId / projectId / taskId 三键可查;敏感字段脱敏;保留 180 天。

链路 Traces

前端 → 网关 → 业务 → 算法 → 存储全链路;慢调用自动采样。

告警项阈值级别动作
算法任务积压> 10 个 / 30 minP2扩容 worker / 通知算法团队
任务失败率> 5% / 1 hP1暂停自动重试,人工介入
接口 P99> 2 sP2排查慢 SQL / 锁
对象存储错误率> 1%P1检查 MinIO 节点 / 磁盘
归档校验失败> 0P1阻断移交,定位文件
证书到期< 30 天P2自动续期 / 人工更换
备份失败> 0P1立即补备并排查

3.11选型取舍与备选方案

决策点首选备选取舍理由切换成本
桌面壳Electron 33Tauri 2团队 Node 经验足;生态成熟;包体大但内网可接受中(外壳重写,业务不变)
三维底座CesiumJSThree.js 纯自研Cesium 解决地理坐标与 3D Tiles;Three 补渲染高
点云Potree3D Tiles pntsPotree 生态成熟;pnts 与 Cesium 更紧中
业务后端Java / Spring BootPython / FastAPI事务、权限、国网生态;算法侧仍用 Python高
数据库PostgreSQL + PostGIS达梦 / 人大金仓空间能力成熟;信创适配留到二期中
消息RabbitMQKafka任务型场景 Rabbit 更简单;Kafka 适合事件流低
编排Docker ComposeK8s一期单机房、少服务;K8s 运维成本高低
鉴权Keycloak自研 / 4A 直连标准协议、可联邦、可离线中
架构评审建议:重点评审三件事——① 三维 SceneAPI 是否真的隔离了 Cesium;② 算法网关的失败/拒收/重放是否闭环;③ 资产包 Manifest 是否覆盖 9 类格式与签署位。其余都可以迭代。