本项目实现头寸管理功能从现有资管系统(XAMS)中的完全解耦,构建独立的头寸管理系统。系统提供头寸的生成、更新、删除、查询及规则驱动的自动化处理能力,通过标准 REST API 供上游系统调用。
核心目标:高内聚、低耦合、可扩展、可维护,支持平滑迁移。
| 类别 | 技术选型 | 版本/说明 |
|---|---|---|
| 语言 | Java | 17 |
| 框架 | Spring Boot | 2.7.18 |
| 微服务 | Spring Cloud | 2021.0.8 |
| 构建工具 | Maven | 3.8+,多模块结构 |
| 服务注册/配置 | Nacos | 2021.0.5.0(本地可禁用) |
| API网关 | Spring Cloud Gateway | 3.x(生产环境) |
| ORM | MyBatis-Plus | 3.5.5(含分页插件、乐观锁插件) |
| 数据库 | Oracle | 19c(生产)/ XE(开发) |
| 连接池 | Druid | 1.2.20,自带 SQL 监控页面 /druid |
| 缓存 | Redis 6.x(Lettuce)+ Caffeine 3.1.8(本地缓存) | 本地可禁用 Redis |
| 消息队列 | RocketMQ | 4.9.x(spring-boot-starter 2.2.3) |
| 认证授权 | Sa-Token | 1.37.0,无状态 + 拦截器,本地可关闭 |
| 接口文档 | SpringDoc OpenAPI 3 | 1.7.0,/swagger-ui.html |
| 对象映射 | MapStruct | 1.5.5.Final,编译期生成 |
| 监控 | Spring Boot Actuator + Micrometer Prometheus | /actuator/health、/actuator/prometheus |
| 日志 | Logback + SLF4J | 生产配合 ELK 输出 JSON 格式 |
| 参数校验 | JSR-303(spring-boot-starter-validation) | @Valid + @Validated |
本地开发:所有依赖从阿里云 Maven 镜像(https://maven.aliyun.com/repository/public)下载,本地仓库路径 D:\maven-repository(见 ~/.m2/settings.xml),不依赖内网 Nexus。
position-management-system/
├── pom.xml # 父POM,统一依赖版本管理
├── position-common/ # 公共组件:Result/ResultCode、异常体系、CORS、Sa-Token配置
├── position-domain/ # 领域模型:实体、值对象、仓储接口、领域服务接口、领域事件
├── position-infrastructure/ # 基础设施:持久化实现、MyBatis-Plus配置、Druid配置、缓存实现
├── position-application/ # 应用层:应用服务实现(编排领域服务)、命令/查询对象、DTO
├── position-api/ # 接口层:REST Controller、OpenAPI配置、多环境配置
├── position-scheduler/ # 定时任务:基于 Spring Scheduled,执行批处理、数据核对、缓存刷新
└── position-admin/ # (可选)管理后台:提供简单的配置界面,初期可省略
所有 Controller 接口必须返回 Result<T>(位于 position-common):
Result.success(data); // 成功带数据
Result.success(); // 成功无数据
Result.fail(ResultCode.DATA_NOT_FOUND); // 失败指定码
响应 JSON 结构:
{ "code": 200, "message": "操作成功", "data": {}, "success": true }
BusinessException(ResultCode, message),由 GlobalExceptionHandler 统一捕获@Valid、@Validated)自动转为 Result.fail(PARAM_INVALID, ...)配置文件位于 position-api/src/main/resources/:
application.yml — 公共配置(端口、Druid 连接池、MyBatis-Plus、Sa-Token、SpringDoc、Actuator)application-local.yml — 本地开发:禁用 Nacos/Redis/RocketMQ,关闭认证拦截application-dev.yml — 开发环境:连 Nacos/Redis/RocketMQ,开启认证拦截application-prod.yml — 生产环境:连接生产中间件,开启认证与监控启动切换:
# 本地(默认)
mvn -pl position-api spring-boot:run
# 指定环境
java -jar position-api.jar --spring.profiles.active=dev
@TableName、@TableId、@Version、@TableLogic 注解BaseMapper<T>,复杂查询写 XML(position-infrastructure/src/main/resources/mapper/)Page<T>(MyBatis-Plus 分页插件已配置,Oracle 方言)deleted(0 未删除,1 已删除,已在全局配置)sa-token.enable-auth=false,所有接口放行sa-token.enable-auth=true,/api/** 需登录/api/health、/api/auth/login、接口文档、Druid 监控Authorization 请求头传递/api/,如 /api/positions、/api/positions/{id}GET /api/health/swagger-ui.html(本地与 dev 环境)GET /actuator/healthGET /actuator/prometheus/druid/index.html(账号 admin/admin)D:\JDK)localhost:1521,SID ORCL,账号 system/Root123456D:\maven-repository(已在 ~/.m2/settings.xml 配置)$env:JAVA_HOME = "D:\JDK"
$env:Path = "$env:JAVA_HOME\bin;$env:Path"
mvn clean install -DskipTests -B
mvn -pl position-api spring-boot:run
GET http://localhost:8080/api/healthhttp://localhost:8080/swagger-ui.htmlhttp://localhost:8080/druid/index.htmlhttp://localhost:8080/actuator/health@Data;DTO ↔ Entity 转换使用 MapStructcom.example.position.{模块}.{分层}@Slf4j),关键业务操作记录 INFO,异常记录 ERROR@Tag、@Operation 注解生成文档