12 KiB
国内外区域拆分后的项目结构审核稿
更新时间:2026-07-29
审核状态:待审核
适用仓库:D:\baiyue
1. 拆分结论
项目继续使用一个 Git 仓库和一套业务源码,通过“国内部署聚合入口、海外部署聚合入口、区域独立配置”形成两个部署单元。当前拆分没有复制或移动业务源码,也没有把国内、海外拆成两个 Git 仓库。
一期全部服务可以先部署在国内服务器,但源码、数据库命名、配置和事件契约从现在起按国内与海外边界约束。后期迁移时只迁移尾程及海外作业单元,新尾程聚合切到海外主写,国内旧尾程单排空;严禁同一聚合在两个区域同时写入。
2. 拆分后的目录树
D:\baiyue
├─ pom.xml 根 Maven 聚合,一个 Git 仓库
├─ common-core 统一返回、异常码等公共模型
├─ common-web 统一异常处理和 Web 公共能力
├─ common-security JWT、租户和权限上下文
├─ common-openapi Swagger/OpenAPI 公共配置
├─ common-audit 审计事件采集客户端
├─ common-event-contract 国内外共享的版本化事件信封和类型
├─ event-bridge-service 跨区事件接收幂等和投递记录基础骨架
├─ gateway 区域网关源码,按区域独立部署
├─ auth 统一登录与令牌服务
├─ iam 租户、成员、角色、菜单和按钮权限
├─ order 订单主档、状态历史和订单 Outbox
├─ firstleg 国内头程履约
├─ lastleg 尾程履约,后期迁移到海外主写
├─ warehouse 仓储源码,国内仓和海外仓分别部署
├─ file 文件服务源码,按区域分别部署
├─ print 打印服务源码,按区域分别部署
├─ audit-service 审计落库服务,按区域分别部署
├─ integration-service 第三方适配,按区域启用不同提供方
├─ deployments
│ ├─ cn
│ │ ├─ pom.xml 国内部署聚合入口
│ │ ├─ env.example 国内环境变量清单
│ │ ├─ build.ps1 国内单元构建脚本
│ │ └─ README.md 国内部署说明
│ └─ overseas
│ ├─ pom.xml 海外部署聚合入口
│ ├─ env.example 海外环境变量清单
│ ├─ build.ps1 海外单元构建脚本
│ └─ README.md 海外部署说明
├─ config\nacos Nacos 配置模板
└─ docs 架构、数据和实施审核文档
event-bridge-service 已生成基础骨架,默认端口 9300,独立数据库 baiyue_event_bridge。它已实现事件信封校验、规范化摘要、内部服务令牌校验、目标区域校验和 Inbox 幂等接收。事件桥自身 8 项测试、公共事件契约 6 项测试通过;基础骨架不等于真实跨区链路已可用。
3. 模块职责与部署归属
| 模块 | 核心职责 | 一期物理位置 | 目标主写位置 |
|---|---|---|---|
gateway |
统一入口、路由、鉴权前置校验、Swagger 聚合 | 国内 | 国内和海外各一套 |
auth |
注册、登录、刷新、退出、令牌会话 | 国内 | 国内 |
iam |
租户、成员、角色、菜单、按钮、数据范围和资质审核 | 国内 | 国内 |
order |
商户订单主档、平台审核、状态机、订单 Outbox | 国内 | 国内 |
firstleg |
国内头程任务与履约交接 | 国内 | 国内 |
lastleg |
到港前、清关、提柜、海外仓、派送、签收 | 国内运行一期版本 | 海外 |
warehouse |
仓库资料与仓内作业边界 | 国内 | 国内仓、海外仓各自区域主写 |
file |
文件元数据、授权下载、区域对象存储适配 | 国内 | 国内和海外各一套 |
print |
模板、打印任务和状态历史 | 国内 | 按区域各一套 |
audit-service |
不可篡改操作审计的落库边界 | 国内 | 按区域本地记录 |
integration-service |
OCR、港务、海关、Amazon 和承运商适配 | 国内 | 国内和海外各一套 |
common-event-contract |
事件信封、类型、区域码、校验规则 | 仅参与编译 | 两区共享同一版本 |
event-bridge-service |
跨区事件接收幂等、待发送记录和投递尝试 | 国内回环验证 | 国内和海外各部署一套 |
4. 国内与海外启动清单
4.1 一期国内服务器
一期核心闭环建议启动:gateway、auth-service、iam-service、order-service、warehouse-service、firstleg-service、audit-service、integration-service。涉及资质附件时启动 file-service;涉及标签和作业单时启动 print-service;开发尾程交接闭环后再启动 lastleg-service。
当前 deployments/cn/pom.xml 已聚合公共库、common-event-contract、event-bridge-service,以及 gateway/auth/iam/order/firstleg/warehouse/file/print/audit-service/integration-service。默认构建为 18 个 Reactor 模块,不包含 lastleg,用于表达长期区域职责;启用 phase1-domestic-lastleg Profile 后为 19 个 Reactor 模块并包含 lastleg,用于一期尾程临时部署在国内的兼容场景。
一期包含尾程的国内构建命令:
cd D:\baiyue\deployments\cn
.\build.ps1 -IncludePhase1Lastleg
# 等效 Maven 命令
mvn -f pom.xml -Pphase1-domestic-lastleg -DskipTests package
默认构建不带 -IncludePhase1Lastleg。长期迁移完成后停止使用该 Profile,国内单元恢复默认 18 模块,旧国内尾程单按迁移方案排空。
4.2 后期海外服务器
deployments/overseas/pom.xml 当前聚合公共库、common-event-contract、event-bridge-service,以及 gateway/lastleg/warehouse/file/print/audit-service/integration-service。海外不部署 auth、iam、order、firstleg 的写实例。
海外正式上线前必须具备:独立 Nacos、独立 MySQL、独立 Redis、独立对象存储、独立域名和证书、跨区可靠事件、海外本地鉴权、监控告警和回滚能力。当前目录聚合只代表结构已拆分,不代表这些生产资源已经创建。
5. 共享源码规则
- 国内与海外共用同一 Git 仓库、同一模块源码和同一版本号,不复制
warehouse/file/print/integration/audit源码。 - 区域差异必须通过环境变量、Spring Profile、Nacos Namespace 和适配器开关表达,禁止在业务代码中散落主机地址判断。
- 公共模块只提供无区域主写状态的能力,不保存业务数据,不单独启动。
- 事件契约必须向后兼容;新增字段优先可选,破坏性变更必须升级事件版本。
- 国内和海外可使用相同服务注册名,但只能注册到各自 Nacos,不能互相发现。
- 跨区调用只使用版本化事件或受控文件复制,不通过 OpenFeign 直接跨公网调用业务服务。
6. 构建与校验命令
根工程完整校验:
cd D:\baiyue
mvn clean test
国内部署单元:
cd D:\baiyue\deployments\cn
.\build.ps1
mvn -f pom.xml -DskipTests validate
上面是默认 18 模块构建;一期需要连同国内尾程一起构建时执行 .\build.ps1 -IncludePhase1Lastleg,对应 19 模块。
海外部署单元:
cd D:\baiyue\deployments\overseas
.\build.ps1
mvn -f pom.xml -DskipTests validate
事件契约:
cd D:\baiyue
mvn -pl common-event-contract -am test
构建成功只证明依赖、编译和自动化测试通过,不代表数据库初始化、Nacos 配置、网络连通、跨区事件或生产部署已验收。
7. 数据与基础设施边界
7.1 MySQL
- 国内主库:
baiyue_auth、baiyue_iam、baiyue_order、baiyue_firstleg,以及带区域归属的国内仓储、文件、打印、集成和审计数据库。 - 一期尾程位于国内时使用独立的
baiyue_lastleg_cn,不与订单、头程或仓储跨库联表。 - 海外目标库:尾程、海外仓储、海外文件、海外打印、海外集成和海外审计各自独立数据库。
- 禁止跨区外键、跨区事务、共享数据库账号和双写;订单号等公共标识由应用生成,避免区域自增冲突。
现有各模块默认配置仍主要使用 baiyue_warehouse、baiyue_file、baiyue_print、baiyue_lastleg 等未带区域后缀的本地库名。区域化库名属于目标配置,必须在部署环境变量或 Nacos 中显式覆盖,不能把目标名称写成当前已经生效。
7.2 Nacos
国内使用独立集群和 prod-cn Namespace,海外使用独立集群和 prod-overseas Namespace,现阶段 Group 保持 BAIYUE。两区的 8848 不暴露公网,海外服务不连接国内 Nacos。
7.3 Redis
国内登录和网关当前会检查国内 Redis 中的令牌会话。海外正式运行前必须改为短期非对称签名令牌、本地 JWKS 缓存和海外本地撤销信息,不能把跨公网读取国内 Redis 当作生产方案。两区 Redis 的密码、库和键空间独立。
7.4 对象存储
当前文件资质上传仍使用本地磁盘目录,适合本地开发,不适合双区域。目标方案是国内文件进入国内对象存储,海外文件进入海外对象存储;跨区只复制履约所需文件,事件仅携带文件标识、版本和摘要,不携带文件正文。
8. 当前真实落地状态
| 能力 | 状态 | 说明 |
|---|---|---|
| 单 Git 仓库、多模块 Maven 工程 | 已实现 | 根工程统一管理源码和依赖 |
| 国内、海外部署聚合目录 | 已生成,待部署验证 | 已有 POM、环境变量示例、构建脚本和说明 |
| 事件信封和类型公共契约 | 已实现基础契约 | 有源码和单元测试,尚未接入完整业务链路 |
| 事件桥服务 | 已实现基础骨架 | 内部令牌、目标区域、信封与摘要校验及 Inbox 幂等已实现,8 项测试通过;mTLS、来源白名单、RocketMQ、真实跨区发送、Outbox 扫描和业务消费者未实现 |
| 登录、租户、菜单和按钮权限模型 | 已实现一期基础能力 | 管理员与权限初始化已有验收记录;写接口权限仍需系统覆盖 |
| 订单主档和状态机 | 已实现一期主要接口 | 已有订单 Outbox 表和本地事务写入;可靠发布未闭环 |
| 头程服务 | 部分实现 | 已有任务、分配历史和消费记录,完整到仓、排柜、订舱、装柜、报关未完成 |
| 尾程服务 | 骨架 | 当前主要为健康接口,尾程业务闭环和 Inbox 尚未完成 |
| 仓储服务 | 部分实现 | 仓库资料维护和查询已具备,仓内入库、测量、拆货、打托等作业未闭环 |
| 文件服务 | 部分实现 | 资质上传下载和表结构已存在;当前仍依赖本地磁盘,对象存储未落地 |
| 打印服务 | 基础骨架 | 有表结构和健康接口,模板渲染、任务执行和打印机适配未完成 |
| 审计服务 | 基础能力已实现 | 有内部采集接口和审计表;跨区审计汇总未完成 |
| 集成服务 | 基础骨架 | 可查询提供方状态;真实 OCR、Amazon、海关、港务、承运商调用待实现 |
| 跨区 Outbox/Inbox 可靠链路 | 部分骨架,未完成 | Inbox 持久化基础已存在;mTLS、真实跨区发送、RocketMQ 发布消费、重试死信和人工补投仍待实现 |
| 海外独立基础设施与灰度 | 未完成 | 尚未进入海外生产部署和切流阶段 |
9. 审核决策点
- 是否确认长期归属为“订单和头程国内唯一主写,尾程海外唯一主写”。
- 是否确认一期尾程允许先在国内运行,但数据库和聚合从第一天保留
execution_region。 - 是否确认仓储、文件、打印、审计、集成采用同源码双区域部署,而不是复制出海外模块。
- 是否确认跨区只走可靠事件和受控文件复制,不开放 MySQL、Redis、Nacos 公网互通。
- 是否确认先在国内回环验证事件可靠性,再建设海外影子环境和灰度切流。