- 新增 Spring Boot 2.7.18 + JDK 1.8 工程骨架 - 引入 H2、JGit、Commons Net 等核心依赖并补充 Maven 配置 - 增加 application.properties 及 dev-agent/prod-agent 双 profile 配置 - 新增同步任务、检查点、ACK 的 H2 表结构与基础持久化服务 - 实现 FTP 上传、下载、列目录、移动、删除及原子上传能力 - 实现 Git clone/pull/checkout/export/commit/push 能力 - 实现同步包打包、解包、manifest 生成与内容哈希校验 - 实现生产 push/pull 接口调用基础能力 - 打通开发侧与生产侧协调流程及 ACK 回执处理 - 补充总体设计与详细设计文档 - 修正 .gitignore,忽略 target、.m2、work、data 等构建与运行目录
12 KiB
12 KiB
FTP 同步工具详细设计
1. 文档说明
本文档是对总体方案的继续细化,重点补充以下内容:
application.properties配置方案- H2 表结构与初始化方式
- Spring Boot 2.7.18 工程骨架
- 核心类职责划分
- 启动方式与后续待实现事项
2. 配置文件策略
本项目采用 properties 配置文件,不使用 yml。
推荐目录如下:
src/main/resources/
|- application.properties
|- application-dev-agent.properties
|- application-prod-agent.properties
|- schema.sql
配置分工如下:
application.properties- 放公共配置
- 包括数据源、H2、通用路径、FTP 默认项、Git 默认项、生产接口默认项
application-dev-agent.properties- 放开发环境代理专属配置
- 包括开发侧定时任务表达式、开发侧 FTP 账号、Git 仓库分支
application-prod-agent.properties- 放生产环境代理专属配置
- 包括生产侧定时任务表达式、生产侧 FTP 账号、生产接口地址与认证
3. 当前配置项设计
3.1 公共配置
已落地文件:
核心配置分组如下:
spring.*
spring.application.namespring.datasource.*spring.jpa.*spring.sql.init.*spring.h2.console.*
用途:
- 启动 Spring Boot
- 使用 H2 文件数据库
- 通过
schema.sql初始化表结构
sync.*
sync.node-idsync.rolesync.work-dirsync.package-temp-dirsync.dev-to-prod-staging-dirsync.prod-to-dev-staging-dirsync.max-retry-countsync.ack-scan-batch-size
用途:
- 标识当前节点身份
- 控制工作目录和临时目录
- 控制同步重试与 ack 扫描参数
ftp.*
ftp.hostftp.portftp.usernameftp.passwordftp.passive-modeftp.base-dirftp.connect-timeout-msftp.data-timeout-msftp.buffer-size
用途:
- 定义 FTP 连接参数
- 定义远端根目录和超时策略
git.repo.*
git.repo.local-pathgit.repo.remote-urigit.repo.usernamegit.repo.passwordgit.repo.scan-branchgit.repo.snapshot-branchgit.repo.commit-author-namegit.repo.commit-author-emailgit.repo.commit-message-prefixgit.repo.pull-rebase
用途:
- 定义开发侧 Git 拉取与提交行为
- 指定开发主分支和生产镜像分支
prod.api.*
prod.api.base-urlprod.api.push-pathprod.api.pull-pathprod.api.tokenprod.api.connect-timeout-msprod.api.read-timeout-ms
用途:
- 定义生产侧
push/pull接口的连接方式
4. Profile 设计
4.1 开发代理 Profile
已落地文件:
主要内容:
spring.config.activate.on-profile=dev-agent- 开发侧端口
- 开发侧三类任务 cron
- 开发侧 FTP 账号示例
- Git 分支覆盖项
当前定时任务:
sync.jobs.dev-git-scan.cronsync.jobs.dev-consume-prod-package.cronsync.jobs.dev-ack-scan.cron
4.2 生产代理 Profile
已落地文件:
主要内容:
spring.config.activate.on-profile=prod-agent- 生产侧端口
- 生产侧三类任务 cron
- 生产侧 FTP 账号示例
- 生产接口地址和 token 示例
当前定时任务:
sync.jobs.prod-consume-dev-package.cronsync.jobs.prod-pull-config.cronsync.jobs.prod-ack-scan.cron
5. H2 设计
已落地文件:
5.1 初始化方式
通过以下配置自动初始化:
spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql
spring.jpa.hibernate.ddl-auto=none
说明:
- 表结构由手工 SQL 控制
- 不依赖 Hibernate 自动建表
- 更适合后续环境迁移和版本管理
5.2 已定义表
sync_checkpoint
用途:
- 保存每个同步方向最后一次成功版本
关键字段:
directionlast_success_versionlast_success_hashupdated_at
sync_task
用途:
- 保存每次同步任务实例
关键字段:
trace_iddirectionsource_versioncontent_hashpackage_namestatusretry_counterror_msg
关键约束:
trace_id唯一direction + source_version + content_hash唯一
这组唯一键就是当前骨架里默认采用的幂等键。
sync_ack
用途:
- 保存跨端 ack 回执
关键字段:
trace_idack_sideack_statusack_timeremark
6. 工程骨架
当前已经在仓库中生成了一套最小 Spring Boot 骨架。
6.1 构建文件
已引入的核心依赖:
spring-boot-starterspring-boot-starter-webspring-boot-starter-data-jpaspring-boot-starter-actuatorspring-retrycommons-netorg.eclipse.jgith2
6.2 启动类
作用:
- 启用 Spring Boot
- 启用定时任务
- 启用重试机制
- 注册配置属性类
6.3 配置属性类
作用:
- 将
properties配置映射为强类型对象 - 避免业务代码直接散落读取字符串 key
6.4 基础配置
当前提供:
RestTemplateBean- 读取生产接口超时参数
7. 领域模型与仓储
7.1 枚举
用途:
- 统一同步方向、角色和状态定义
7.2 实体
用途:
- 对应 H2 三张核心业务表
- 内置了基础时间戳维护逻辑
7.3 Repository
用途:
- 提供基础持久化能力
- 已包含按幂等键和
traceId查询的方法
8. 当前服务层设计
8.1 已实现基础服务
当前能力:
- 创建或加载幂等任务
- 更新任务状态
- 增加重试次数
- 更新检查点
- 记录 ack 回执
8.2 当前已实现的业务服务
本轮代码已经补上以下真实能力:
- FTP 上传、下载、列目录、删除、移动、原子重命名上传
- Git clone / pull / checkout / commit / push
- zip 打包与解包
- manifest 生成与内容哈希校验
- 生产
push/pull接口调用骨架
当前对应实现文件包括:
- FtpClientService.java
- GitClientService.java
- PackageService.java
- ProdConfigApiService.java
- SyncMetadataService.java
9. 当前调度层设计
9.1 开发侧调度
当前状态:
- 已按
dev-agentprofile 进行隔离 - 已绑定 cron 表达式
- 已串联 Git 拉取、包构建、FTP 上传、FTP 消费、Git 提交和 ACK 上传
9.2 生产侧调度
当前状态:
- 已按
prod-agentprofile 进行隔离 - 已绑定 cron 表达式
- 已串联 FTP 消费、生产
push接口调用、生产pull接口调用、包构建和 ACK 上传
9.3 当前接口假设
由于你还没有给出生产 push/pull 接口的正式协议,本轮实现采用以下默认假设:
- 生产
push接口使用multipart/form-data - 上传字段包含
file、traceId、direction、sourceVersion、contentHash - 生产
pull接口使用HTTP GET pull返回原始字节内容,当前默认保存为prod-config.json- 如果响应头里存在
X-Config-Version或ETag,优先用它作为来源版本号
后续如果你提供正式接口文档,再把这部分对齐为最终协议即可。
10. 当前目录结构
FtpTool
|- docs
|- pom.xml
|- src
|- main
|- java/com/ftptool/sync
| |- config
| |- entity
| |- job
| |- model
| |- orchestrator
| |- repository
| |- service
|- resources
|- application.properties
|- application-dev-agent.properties
|- application-prod-agent.properties
|- schema.sql
11. 启动方式
11.1 启动开发代理
mvn spring-boot:run -Dspring-boot.run.profiles=dev-agent
11.2 启动生产代理
mvn spring-boot:run -Dspring-boot.run.profiles=prod-agent
也可以打包后通过 JVM 参数指定:
java -jar ftp-sync-tool.jar --spring.profiles.active=dev-agent
java -jar ftp-sync-tool.jar --spring.profiles.active=prod-agent
12. 下一步建议实现顺序
建议按以下顺序继续落代码:
- 先实现
FtpClientService - 再实现
GitClientService - 再实现
PackageService - 再实现
ProdConfigApiService - 最后把
Coordinator中的 TODO 串起来
13. 当前边界
当前骨架是“可扩展的项目起点”,不是完整业务实现,现阶段还缺:
- 真正的 FTP 交互
- 真正的 Git 操作
- 真正的生产接口调用
- 包文件读写与校验
- ack 文件协议
- 失败重试细节和告警
但好处是结构已经固定住了:
- 配置口径统一为
properties - profile 隔离清晰
- H2 状态表已定义
- 调度入口已分开
- 任务、检查点、ack 的存储模型已落地