Files
wenzi/docs/tech-choices.md

36 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 技术选型与决策
本文档记录了项目在开发过程中所做的主要技术选型和架构决策,以便团队成员理解其背后的原因。
## 1. 核心框架与语言
- **Java 17**: 选用 Java 17 是因为它是一个长期支持LTS版本提供了现代化的语言特性如 Records, Sealed Classes 等),并拥有稳定的生态系统。
- **Spring Boot 3**: 作为业界主流的Java开发框架Spring Boot 极大地简化了配置和部署通过其强大的自动配置和依赖管理能力使我们能快速构建健壮的、生产级的Web服务。
- **Maven**: 作为项目管理和构建工具Maven 提供了标准的项目结构、强大的依赖管理和一致的构建流程。
## 2. API与Web层
- **RESTful API**: 我们选择构建RESTful风格的API这是当前Web服务的标准实践具有无状态、易于理解和前后端分离的优点。
- **DTO (Data Transfer Object)**: 在Controller层我们引入了DTO模式例如 `CreateActivityRequest`)。
- **决策依据**: 将API的请求/响应结构与内部的领域模型Domain Model解耦。这样做的好处是
1. **API稳定性**: 内部领域模型的变化不会直接影响外部API的结构。
2. **安全性**: 可以避免意外暴露领域模型中的敏感字段。
3. **专用性**: 可以为特定的API端点定制数据结构使其更清晰、更高效。
- **Bean Validation**: 通过引入 `spring-boot-starter-validation` 并在DTO上使用 `@Valid` 和相关约束注解(如 `@NotBlank`我们在Controller层实现了声明式的输入验证。这是一种标准的、非侵入性的验证方式能保持业务逻辑的纯净。
## 3. 数据库与持久化
- **Flyway**: 用于数据库迁移管理。它通过版本化的SQL脚本来管理数据库结构演进确保了在任何环境下开发、测试、生产数据库结构的一致性和可追溯性。
- **H2 Database (用于测试)**: H2是一个轻量级的内存数据库非常适合在单元测试和集成测试中使用。它启动速度快无需外部依赖可以确保测试环境的纯净和可重复性。
- **PostgreSQL (用于生产)**: 在 `pom.xml` 中预先定义了依赖。PostgreSQL 是一个功能强大、稳定可靠的开源关系型数据库,适用于生产环境。
## 4. 安全
- **API密钥存储**: 采用哈希加盐Salted Hashing的方式存储API密钥。
- **决策依据**: 直接在数据库中存储明文API密钥是极不安全的。通过为每个密钥生成一个唯一的盐Salt并将其与密钥组合后进行哈希SHA-256我们只存储盐和哈希值。即使数据库被泄露攻击者也无法直接反推出原始密钥大大提高了安全性。
## 5. 异常处理
- **自定义异常**: 我们创建了业务特定的异常类,如 `ActivityNotFoundException``ApiKeyNotFoundException`
- **决策依据**: 这使得代码的意图更清晰,并且可以利用 `@ResponseStatus` 注解将特定的业务异常直接映射到HTTP状态码`404 Not Found`),简化了全局异常处理逻辑。