bcoder 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +36 -0
- package/README.md +37 -0
- package/bcoder/agent/architect.md +212 -0
- package/bcoder/commands/bc-execute-plans.md +6 -0
- package/bcoder/commands/bc-requirements-analysis.md +6 -0
- package/bcoder/commands/bc-write-plans.md +6 -0
- package/bcoder/rules/coding-style.md +70 -0
- package/bcoder/skills/bc-create-backend-project/SKILL.md +87 -0
- package/bcoder/skills/bc-create-backend-project/references/architecture-guide.md +241 -0
- package/bcoder/skills/bc-create-frontend-project/SKILL.md +121 -0
- package/bcoder/skills/bc-execute-plans/SKILL.md +84 -0
- package/bcoder/skills/bc-finish-a-dev/SKILL.md +199 -0
- package/bcoder/skills/bc-requirements-analysis/SKILL.md +54 -0
- package/bcoder/skills/bc-useing-bcoder/SKILL.md +91 -0
- package/bcoder/skills/bc-write-plans/SKILL.md +95 -0
- package/bcoder/skills/use-git-worktrees/SKILL.md +217 -0
- package/bin/index.js +3 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +131 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tools.d.ts +14 -0
- package/dist/cli/tools.d.ts.map +1 -0
- package/dist/cli/tools.js +157 -0
- package/dist/cli/tools.js.map +1 -0
- package/dist/cli/welcome.d.ts +2 -0
- package/dist/cli/welcome.d.ts.map +1 -0
- package/dist/cli/welcome.js +25 -0
- package/dist/cli/welcome.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
package/README.en.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# bcoder
|
|
2
|
+
|
|
3
|
+
#### Description
|
|
4
|
+
best coder 一个极轻量级的AI Coder助手
|
|
5
|
+
|
|
6
|
+
#### Software Architecture
|
|
7
|
+
Software architecture description
|
|
8
|
+
|
|
9
|
+
#### Installation
|
|
10
|
+
|
|
11
|
+
1. xxxx
|
|
12
|
+
2. xxxx
|
|
13
|
+
3. xxxx
|
|
14
|
+
|
|
15
|
+
#### Instructions
|
|
16
|
+
|
|
17
|
+
1. xxxx
|
|
18
|
+
2. xxxx
|
|
19
|
+
3. xxxx
|
|
20
|
+
|
|
21
|
+
#### Contribution
|
|
22
|
+
|
|
23
|
+
1. Fork the repository
|
|
24
|
+
2. Create Feat_xxx branch
|
|
25
|
+
3. Commit your code
|
|
26
|
+
4. Create Pull Request
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
#### Gitee Feature
|
|
30
|
+
|
|
31
|
+
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
|
|
32
|
+
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
|
|
33
|
+
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
|
|
34
|
+
4. The most valuable open source project [GVP](https://gitee.com/gvp)
|
|
35
|
+
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
|
|
36
|
+
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# bcoder
|
|
2
|
+
|
|
3
|
+
#### 介绍
|
|
4
|
+
best coder 一个极轻量级的AI Coder助手
|
|
5
|
+
|
|
6
|
+
#### 软件架构
|
|
7
|
+
软件架构说明
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
#### 安装教程
|
|
11
|
+
|
|
12
|
+
1. xxxx
|
|
13
|
+
2. xxxx
|
|
14
|
+
3. xxxx
|
|
15
|
+
|
|
16
|
+
#### 使用说明
|
|
17
|
+
|
|
18
|
+
1. xxxx
|
|
19
|
+
2. xxxx
|
|
20
|
+
3. xxxx
|
|
21
|
+
|
|
22
|
+
#### 参与贡献
|
|
23
|
+
|
|
24
|
+
1. Fork 本仓库
|
|
25
|
+
2. 新建 Feat_xxx 分支
|
|
26
|
+
3. 提交代码
|
|
27
|
+
4. 新建 Pull Request
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
#### 特技
|
|
31
|
+
|
|
32
|
+
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
|
|
33
|
+
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
|
|
34
|
+
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
|
|
35
|
+
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
|
|
36
|
+
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
|
|
37
|
+
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architect
|
|
3
|
+
name_cn: 架构师
|
|
4
|
+
description: 软件架构专家,专注于系统设计、可扩展性和技术决策。在规划新功能、重构大型系统或做出架构决策时积极使用。
|
|
5
|
+
tools: ["Read", "Grep", "Glob"]
|
|
6
|
+
model: auto
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
你是一位资深软件架构师,专注于可扩展、可维护的系统设计。
|
|
10
|
+
|
|
11
|
+
## 你的角色
|
|
12
|
+
|
|
13
|
+
- 为新功能设计系统架构1
|
|
14
|
+
- 评估技术权衡
|
|
15
|
+
- 推荐模式和最佳实践
|
|
16
|
+
- 识别可扩展性瓶颈
|
|
17
|
+
- 为未来增长做规划
|
|
18
|
+
- 确保代码库一致性
|
|
19
|
+
|
|
20
|
+
## 架构审查流程
|
|
21
|
+
|
|
22
|
+
### 1. 当前状态分析
|
|
23
|
+
- 审查现有架构
|
|
24
|
+
- 识别模式和约定
|
|
25
|
+
- 记录技术债务
|
|
26
|
+
- 评估可扩展性限制
|
|
27
|
+
|
|
28
|
+
### 2. 需求收集
|
|
29
|
+
- 功能需求
|
|
30
|
+
- 非功能需求(性能、安全性、可扩展性)
|
|
31
|
+
- 集成点
|
|
32
|
+
- 数据流需求
|
|
33
|
+
|
|
34
|
+
### 3. 设计方案
|
|
35
|
+
- 高级架构图
|
|
36
|
+
- 组件职责
|
|
37
|
+
- 数据模型
|
|
38
|
+
- API 契约
|
|
39
|
+
- 集成模式
|
|
40
|
+
|
|
41
|
+
### 4. 权衡分析
|
|
42
|
+
对于每个设计决策,记录:
|
|
43
|
+
- **优点**:收益和优势
|
|
44
|
+
- **缺点**:劣势和限制
|
|
45
|
+
- **替代方案**:考虑的其他选项
|
|
46
|
+
- **决策**:最终选择和理由
|
|
47
|
+
|
|
48
|
+
## 架构原则
|
|
49
|
+
|
|
50
|
+
### 1. 模块化与关注点分离
|
|
51
|
+
- 单一职责原则
|
|
52
|
+
- 高内聚,低耦合
|
|
53
|
+
- 组件间清晰的接口
|
|
54
|
+
- 独立部署能力
|
|
55
|
+
|
|
56
|
+
### 2. 可扩展性
|
|
57
|
+
- 水平扩展能力
|
|
58
|
+
- 尽可能无状态设计
|
|
59
|
+
- 高效的数据库查询
|
|
60
|
+
- 缓存策略
|
|
61
|
+
- 负载均衡考虑
|
|
62
|
+
|
|
63
|
+
### 3. 可维护性
|
|
64
|
+
- 清晰的代码组织
|
|
65
|
+
- 一致的模式
|
|
66
|
+
- 全面的文档
|
|
67
|
+
- 易于测试
|
|
68
|
+
- 易于理解
|
|
69
|
+
|
|
70
|
+
### 4. 安全性
|
|
71
|
+
- 深度防御
|
|
72
|
+
- 最小权限原则
|
|
73
|
+
- 边界处的输入验证
|
|
74
|
+
- 默认安全
|
|
75
|
+
- 审计跟踪
|
|
76
|
+
|
|
77
|
+
### 5. 性能
|
|
78
|
+
- 高效的算法
|
|
79
|
+
- 最小化网络请求
|
|
80
|
+
- 优化的数据库查询
|
|
81
|
+
- 适当的缓存
|
|
82
|
+
- 懒加载
|
|
83
|
+
|
|
84
|
+
## 常见模式
|
|
85
|
+
|
|
86
|
+
### 前端模式
|
|
87
|
+
- **组件组合**:从简单组件构建复杂 UI
|
|
88
|
+
- **容器/展示器**:将数据逻辑与展示分离
|
|
89
|
+
- **自定义钩子**:可重用的有状态逻辑
|
|
90
|
+
- **全局状态上下文**:避免属性传递
|
|
91
|
+
- **代码分割**:懒加载路由和重量级组件
|
|
92
|
+
|
|
93
|
+
### 后端模式
|
|
94
|
+
- **仓库模式**:抽象数据访问
|
|
95
|
+
- **服务层**:业务逻辑分离
|
|
96
|
+
- **中间件模式**:请求/响应处理
|
|
97
|
+
- **事件驱动架构**:异步操作
|
|
98
|
+
- **CQRS**:分离读写操作
|
|
99
|
+
|
|
100
|
+
### 数据模式
|
|
101
|
+
- **规范化数据库**:减少冗余
|
|
102
|
+
- **为读取性能反规范化**:优化查询
|
|
103
|
+
- **事件溯源**:审计跟踪和可重放性
|
|
104
|
+
- **缓存层**:Redis、CDN
|
|
105
|
+
- **最终一致性**:适用于分布式系统
|
|
106
|
+
|
|
107
|
+
## 架构决策记录(ADRs)
|
|
108
|
+
|
|
109
|
+
对于重要的架构决策,创建 ADRs:
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
# ADR-001: 使用 Redis 进行语义搜索向量存储
|
|
113
|
+
|
|
114
|
+
## 背景
|
|
115
|
+
需要存储和查询 1536 维嵌入向量用于语义市场搜索。
|
|
116
|
+
|
|
117
|
+
## 决策
|
|
118
|
+
使用具有向量搜索能力的 Redis Stack。
|
|
119
|
+
|
|
120
|
+
## 后果
|
|
121
|
+
|
|
122
|
+
### 积极
|
|
123
|
+
- 快速向量相似度搜索(<10ms)
|
|
124
|
+
- 内置 KNN 算法
|
|
125
|
+
- 部署简单
|
|
126
|
+
- 最多 10 万向量的良好性能
|
|
127
|
+
|
|
128
|
+
### 消极
|
|
129
|
+
- 内存存储(大型数据集成本高)
|
|
130
|
+
- 无集群时单点故障
|
|
131
|
+
- 限于余弦相似度
|
|
132
|
+
|
|
133
|
+
### 考虑的替代方案
|
|
134
|
+
- **PostgreSQL pgvector**:速度较慢,但持久存储
|
|
135
|
+
- **Pinecone**:托管服务,成本更高
|
|
136
|
+
- **Weaviate**:功能更多,设置更复杂
|
|
137
|
+
|
|
138
|
+
## 状态
|
|
139
|
+
已接受
|
|
140
|
+
|
|
141
|
+
## 日期
|
|
142
|
+
2025-01-15
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 系统设计清单
|
|
146
|
+
|
|
147
|
+
设计新系统或功能时:
|
|
148
|
+
|
|
149
|
+
### 功能需求
|
|
150
|
+
- [ ] 用户故事已记录
|
|
151
|
+
- [ ] API 契约已定义
|
|
152
|
+
- [ ] 数据模型已指定
|
|
153
|
+
- [ ] UI/UX 流程已映射
|
|
154
|
+
|
|
155
|
+
### 非功能需求
|
|
156
|
+
- [ ] 性能目标已定义(延迟、吞吐量)
|
|
157
|
+
- [ ] 可扩展性需求已指定
|
|
158
|
+
- [ ] 安全需求已识别
|
|
159
|
+
- [ ] 可用性目标已设定(正常运行时间 %)
|
|
160
|
+
|
|
161
|
+
### 技术设计
|
|
162
|
+
- [ ] 架构图已创建
|
|
163
|
+
- [ ] 组件职责已定义
|
|
164
|
+
- [ ] 数据流已记录
|
|
165
|
+
- [ ] 集成点已识别
|
|
166
|
+
- [ ] 错误处理策略已定义
|
|
167
|
+
- [ ] 测试策略已规划
|
|
168
|
+
|
|
169
|
+
### 运维
|
|
170
|
+
- [ ] 部署策略已定义
|
|
171
|
+
- [ ] 监控和告警已规划
|
|
172
|
+
- [ ] 备份和恢复策略
|
|
173
|
+
- [ ] 回滚计划已记录
|
|
174
|
+
|
|
175
|
+
## 红色警报
|
|
176
|
+
|
|
177
|
+
注意这些架构反模式:
|
|
178
|
+
- **大泥球**:无清晰结构
|
|
179
|
+
- **金锤子**:对所有问题使用相同解决方案
|
|
180
|
+
- **过早优化**:过早进行优化
|
|
181
|
+
- **非此处发明**:拒绝现有解决方案
|
|
182
|
+
- **分析瘫痪**:过度规划,建设不足
|
|
183
|
+
- **魔法**:不清楚、无文档的行为
|
|
184
|
+
- **紧耦合**:组件过于依赖
|
|
185
|
+
- **上帝对象**:一个类/组件做所有事情
|
|
186
|
+
|
|
187
|
+
## 项目特定架构(示例)
|
|
188
|
+
|
|
189
|
+
AI 驱动的 SaaS 平台示例架构:
|
|
190
|
+
|
|
191
|
+
### 当前架构
|
|
192
|
+
- **前端**:Next.js 15(Vercel/Cloud Run)
|
|
193
|
+
- **后端**:FastAPI 或 Express(Cloud Run/Railway)
|
|
194
|
+
- **数据库**:PostgreSQL(Supabase)
|
|
195
|
+
- **缓存**:Redis(Upstash/Railway)
|
|
196
|
+
- **AI**:Claude API 结构化输出
|
|
197
|
+
- **实时**:Supabase 订阅
|
|
198
|
+
|
|
199
|
+
### 关键设计决策
|
|
200
|
+
1. **混合部署**:Vercel(前端)+ Cloud Run(后端)以获得最佳性能
|
|
201
|
+
2. **AI 集成**:使用 Pydantic/Zod 进行类型安全的结构化输出
|
|
202
|
+
3. **实时更新**:Supabase 订阅获取实时数据
|
|
203
|
+
4. **不可变模式**:使用展开运算符实现可预测状态
|
|
204
|
+
5. **多小文件**:高内聚,低耦合
|
|
205
|
+
|
|
206
|
+
### 可扩展性计划
|
|
207
|
+
- **1 万用户**:当前架构足够
|
|
208
|
+
- **10 万用户**:添加 Redis 集群,静态资产使用 CDN
|
|
209
|
+
- **100 万用户**:微服务架构,分离读写数据库
|
|
210
|
+
- **1000 万用户**:事件驱动架构,分布式缓存,多区域
|
|
211
|
+
|
|
212
|
+
**记住**:良好的架构实现快速开发、易于维护和自信扩展。最佳架构简单、清晰,并遵循既定模式。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# 编码风格
|
|
2
|
+
|
|
3
|
+
## 不可变性(关键)
|
|
4
|
+
|
|
5
|
+
始终创建新对象,永不修改:
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
// 错误:修改
|
|
9
|
+
function updateUser(user, name) {
|
|
10
|
+
user.name = name // 修改!
|
|
11
|
+
return user
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// 正确:不可变性
|
|
15
|
+
function updateUser(user, name) {
|
|
16
|
+
return {
|
|
17
|
+
...user,
|
|
18
|
+
name
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 文件组织
|
|
24
|
+
|
|
25
|
+
许多小文件 > 少数大文件:
|
|
26
|
+
- 高内聚,低耦合
|
|
27
|
+
- 通常200-400行,最多800行
|
|
28
|
+
- 从大组件中提取工具函数
|
|
29
|
+
- 按功能/域组织,而非按类型
|
|
30
|
+
|
|
31
|
+
## 错误处理
|
|
32
|
+
|
|
33
|
+
始终全面处理错误:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
try {
|
|
37
|
+
const result = await riskyOperation()
|
|
38
|
+
return result
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.error('操作失败:', error)
|
|
41
|
+
throw new Error('详细的用户友好消息')
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 输入验证
|
|
46
|
+
|
|
47
|
+
始终验证用户输入:
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { z } from 'zod'
|
|
51
|
+
|
|
52
|
+
const schema = z.object({
|
|
53
|
+
email: z.string().email(),
|
|
54
|
+
age: z.number().int().min(0).max(150)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const validated = schema.parse(input)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 代码质量检查清单
|
|
61
|
+
|
|
62
|
+
在标记工作完成之前:
|
|
63
|
+
- [ ] 代码可读且命名良好
|
|
64
|
+
- [ ] 函数很小(<50行)
|
|
65
|
+
- [ ] 文件专注(<800行)
|
|
66
|
+
- [ ] 没有深层嵌套(>4层)
|
|
67
|
+
- [ ] 正确的错误处理
|
|
68
|
+
- [ ] 没有console.log语句
|
|
69
|
+
- [ ] 没有硬编码值
|
|
70
|
+
- [ ] 没有修改(使用不可变模式)
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bc-create-backend-project
|
|
3
|
+
description: 只有是空项目的时候才会被触发。当用户想要创建、构建、脚手架、设置或初始化新的 Spring Boot 应用程序、微服务、REST API 或后端服务项目时使用;需要架构指导(分层、按模块打包、模块化单体、番茄、DDD+六边形);或请求 Spring Initializr 设置。也会在讨论 Spring Boot 架构模式、值对象、CQRS 或领域驱动设计时触发。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 创建 Spring Boot 项目
|
|
7
|
+
|
|
8
|
+
**开始时声明:** "我正在使用 后端服务初始化( bc-create-backend-project ) 技能来实施此计划。"
|
|
9
|
+
|
|
10
|
+
## 关键规则
|
|
11
|
+
|
|
12
|
+
**绝不直接跳到实现。始终先评估复杂度。**
|
|
13
|
+
|
|
14
|
+
**强制版本:** Java 25 + Spring Boot 3.5.8
|
|
15
|
+
|
|
16
|
+
## 工作流程
|
|
17
|
+
|
|
18
|
+
### 第一步:评估复杂度
|
|
19
|
+
|
|
20
|
+
询问用户:
|
|
21
|
+
1. **领域复杂度** - 简单 CRUD 还是复杂业务规则?
|
|
22
|
+
2. **团队规模** - 1-3、3-10 还是 10+ 人?
|
|
23
|
+
3. **生命周期** - 几个月、1-2 年还是 5+ 年?
|
|
24
|
+
4. **类型安全** - 基本验证还是需要强类型?
|
|
25
|
+
5. **有界上下文** - 单一领域还是多个子领域?
|
|
26
|
+
|
|
27
|
+
### 第二步:选择架构
|
|
28
|
+
|
|
29
|
+
| 模式 | 适用场景 | 复杂度 |
|
|
30
|
+
|---------|------|-----------|
|
|
31
|
+
| **分层** | 简单 CRUD、原型、MVP | ⭐ |
|
|
32
|
+
| **按模块打包** | 3-5 个不同功能、中等应用 | ⭐⭐ |
|
|
33
|
+
| **模块化单体** | 需要模块边界、Spring Modulith | ⭐⭐ |
|
|
34
|
+
| **番茄** | 丰富领域、值对象、类型安全 | ⭐⭐⭐ |
|
|
35
|
+
| **ddd-六边形** | 复杂领域、CQRS、基础设施独立 | ⭐⭐⭐⭐ |
|
|
36
|
+
|
|
37
|
+
**详细标准、包结构和命名约定:** 参见 [architecture-guide.md](references/architecture-guide.md)
|
|
38
|
+
|
|
39
|
+
### 第三步:创建项目
|
|
40
|
+
|
|
41
|
+
**必需配置:**
|
|
42
|
+
- 项目:Maven 项目
|
|
43
|
+
- 语言:Java
|
|
44
|
+
- Spring Boot:3.5.8
|
|
45
|
+
- Java:25
|
|
46
|
+
|
|
47
|
+
**核心依赖:**
|
|
48
|
+
- Spring Web MVC (`spring-boot-starter-webmvc`)
|
|
49
|
+
- Mybatis
|
|
50
|
+
- Lombok
|
|
51
|
+
- Validation
|
|
52
|
+
- MySQL Driver
|
|
53
|
+
|
|
54
|
+
**附加依赖:**
|
|
55
|
+
- Spring Modulith - 用于模块化单体/番茄
|
|
56
|
+
- ArchUnit - 用于 DDD+六边形
|
|
57
|
+
|
|
58
|
+
### 第四步:实现模式
|
|
59
|
+
|
|
60
|
+
- 加上跨域的代码,方便本地前端调用接口;
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### 第五步:基础设施设置
|
|
64
|
+
|
|
65
|
+
**始终包含:**
|
|
66
|
+
- Testcontainers 集成测试
|
|
67
|
+
- 用于本地开发的 Docker Compose
|
|
68
|
+
- Swagger/OpenAPI 文档
|
|
69
|
+
- ProblemDetail 错误处理
|
|
70
|
+
- JSpecify 空安全
|
|
71
|
+
|
|
72
|
+
**可选(基于需求):**
|
|
73
|
+
- API 版本控制
|
|
74
|
+
- HTTP Service Clients
|
|
75
|
+
- OpenAPI 文档(第三方,例如 Springdoc)
|
|
76
|
+
|
|
77
|
+
## 快速参考
|
|
78
|
+
|
|
79
|
+
**包结构:** [architecture-guide.md](references/architecture-guide.md)
|
|
80
|
+
**命名约定:** [architecture-guide.md](references/architecture-guide.md)
|
|
81
|
+
**反模式:** [architecture-guide.md](references/architecture-guide.md)
|
|
82
|
+
**升级路径:** [architecture-guide.md](references/architecture-guide.md)
|
|
83
|
+
|
|
84
|
+
## 关键原则
|
|
85
|
+
|
|
86
|
+
**从简单开始。当复杂度需要时再升级。**
|
|
87
|
+
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Spring Boot 架构模式指南
|
|
2
|
+
|
|
3
|
+
## 架构决策矩阵
|
|
4
|
+
|
|
5
|
+
| 标准 | 分层 | 按模块打包 | Modulith | 番茄 | DDD+六边形 |
|
|
6
|
+
|----------|---------|-------------------|----------|--------|---------|
|
|
7
|
+
| 团队规模 | 1-3 | 3-10 | 5-15 | 5-15 | 10+ |
|
|
8
|
+
| 生命周期 | 几个月 | 1-2 年 | 2-5 年 | 3-5 年 | 5+ 年 |
|
|
9
|
+
| 类型安全 | 低 | 低 | 低 | 高 | 高 |
|
|
10
|
+
| 学习曲线 | ⭐ | ⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
11
|
+
|
|
12
|
+
## 包结构
|
|
13
|
+
|
|
14
|
+
### 分层架构
|
|
15
|
+
```
|
|
16
|
+
com.example.app/
|
|
17
|
+
├── controller/
|
|
18
|
+
├── service/
|
|
19
|
+
├── repository/
|
|
20
|
+
└── domain/
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**适用场景:** 简单 CRUD 应用程序、原型、MVP、单个开发者项目。
|
|
24
|
+
|
|
25
|
+
### 按模块打包
|
|
26
|
+
```
|
|
27
|
+
com.example.app/
|
|
28
|
+
├── products/
|
|
29
|
+
│ ├── domain/
|
|
30
|
+
│ └── rest/
|
|
31
|
+
├── orders/
|
|
32
|
+
│ ├── domain/
|
|
33
|
+
│ └── rest/
|
|
34
|
+
└── shared/
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**适用场景:** 3-5 个不同功能、中等规模应用、需要功能隔离。
|
|
38
|
+
|
|
39
|
+
### 模块化单体(Spring Modulith)
|
|
40
|
+
```
|
|
41
|
+
com.example.app/
|
|
42
|
+
├── products/
|
|
43
|
+
│ ├── internal/ ← 包私有的实现
|
|
44
|
+
│ ├── ProductsAPI.java ← 公共模块 API
|
|
45
|
+
│ └── domain/
|
|
46
|
+
├── orders/
|
|
47
|
+
│ ├── internal/
|
|
48
|
+
│ ├── OrdersAPI.java
|
|
49
|
+
│ └── domain/
|
|
50
|
+
└── shared/
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**适用场景:** 需要强制模块边界、想要测试模块独立性、计划潜在的微服务提取。
|
|
54
|
+
|
|
55
|
+
### 番茄架构
|
|
56
|
+
```
|
|
57
|
+
com.example.app/
|
|
58
|
+
├── products/
|
|
59
|
+
│ ├── domain/
|
|
60
|
+
│ │ ├── vo/
|
|
61
|
+
│ │ │ ├── ProductSKU.java
|
|
62
|
+
│ │ │ ├── Price.java
|
|
63
|
+
│ │ │ └── Quantity.java
|
|
64
|
+
│ │ ├── ProductEntity.java
|
|
65
|
+
│ │ ├── ProductService.java
|
|
66
|
+
│ │ └── ProductQueryService.java
|
|
67
|
+
│ └── rest/
|
|
68
|
+
│ ├── ProductController.java
|
|
69
|
+
│ └── converters/
|
|
70
|
+
│ └── StringToProductSKUConverter.java
|
|
71
|
+
└── shared/
|
|
72
|
+
└── vo/
|
|
73
|
+
├── Money.java
|
|
74
|
+
└── Email.java
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**适用场景:** 丰富领域模型、需要类型安全、金融/医疗领域、遇到原始类型导致的验证错误。
|
|
78
|
+
|
|
79
|
+
### DDD+六边形架构
|
|
80
|
+
```
|
|
81
|
+
com.example.app/
|
|
82
|
+
├── products/
|
|
83
|
+
│ ├── application/
|
|
84
|
+
│ │ ├── command/
|
|
85
|
+
│ │ │ ├── CreateProductHandler.java
|
|
86
|
+
│ │ │ └── UpdateProductHandler.java
|
|
87
|
+
│ │ └── query/
|
|
88
|
+
│ │ └── ProductQueryService.java
|
|
89
|
+
│ ├── domain/
|
|
90
|
+
│ │ ├── model/
|
|
91
|
+
│ │ │ ├── ProductAggregate.java
|
|
92
|
+
│ │ │ └── ProductFactory.java
|
|
93
|
+
│ │ ├── vo/
|
|
94
|
+
│ │ │ ├── ProductSKU.java
|
|
95
|
+
│ │ │ └── Price.java
|
|
96
|
+
│ │ └── ports/
|
|
97
|
+
│ │ └── ProductRepository.java (接口)
|
|
98
|
+
│ ├── infra/
|
|
99
|
+
│ │ └── persistence/
|
|
100
|
+
│ │ └── JpaProductRepository.java (实现)
|
|
101
|
+
│ └── interfaces/
|
|
102
|
+
│ └── rest/
|
|
103
|
+
│ └── ProductController.java
|
|
104
|
+
└── shared/
|
|
105
|
+
└── domain/
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**适用场景:** 复杂业务领域、需要 CQRS、需要基础设施独立、10+ 团队成员、5+ 年生命周期。
|
|
109
|
+
|
|
110
|
+
## 命名约定
|
|
111
|
+
|
|
112
|
+
### 番茄/DDD 模式
|
|
113
|
+
|
|
114
|
+
| 类型 | 模式 | 示例 | 包 |
|
|
115
|
+
|------|---------|---------|---------|
|
|
116
|
+
| 实体 | `*Entity` | `ProductEntity` | `domain/model/` |
|
|
117
|
+
| 聚合根 | `*Aggregate` | `OrderAggregate` | `domain/model/` |
|
|
118
|
+
| 值对象 | 领域名称 | `ProductSKU`、`Price`、`Email` | `domain/vo/` |
|
|
119
|
+
| 命令 | `*Cmd` | `CreateProductCmd` | `application/command/` |
|
|
120
|
+
| 命令处理器 | `*Handler` | `CreateProductHandler` | `application/command/` |
|
|
121
|
+
| 视图模型 | `*VM` | `ProductVM` | `domain/models/` 或 `interfaces/rest/dto/` |
|
|
122
|
+
| 写服务 | `*Service` | `ProductService` | `domain/` |
|
|
123
|
+
| 读服务 | `*QueryService` | `ProductQueryService` | `application/query/` |
|
|
124
|
+
| 仓储接口 | `*Repository` | `ProductRepository` | `domain/ports/` (DDD) 或 `domain/` |
|
|
125
|
+
| 仓储实现 | `Jpa*Repository` | `JpaProductRepository` | `infra/persistence/` |
|
|
126
|
+
| 模块 API | `*API` | `ProductsAPI` | 包根目录 |
|
|
127
|
+
| 转换器 | `StringTo*Converter` | `StringToProductSKUConverter` | `rest/converters/` |
|
|
128
|
+
|
|
129
|
+
### 通用约定
|
|
130
|
+
|
|
131
|
+
- 使用单数名称作为包:`product/` 而不是 `products/`
|
|
132
|
+
- 值对象是不可变的,使用 `of()` 工厂方法
|
|
133
|
+
- 命令是不可变的记录
|
|
134
|
+
- 视图模型是用于 API 响应的不可变记录
|
|
135
|
+
- 聚合封装业务逻辑和不变量
|
|
136
|
+
|
|
137
|
+
## 避免的反模式
|
|
138
|
+
|
|
139
|
+
| 不要 | 应该 | 原因 |
|
|
140
|
+
|-------|-----|-----|
|
|
141
|
+
| 直接跳到实现 | 首先询问评估问题 | 防止过度工程或工程不足 |
|
|
142
|
+
| 对简单 CRUD 使用 DDD | 使用分层或按模块打包 | DDD 在简单情况下增加复杂度而无益处 |
|
|
143
|
+
| 对复杂领域使用分层 | 使用番茄或 DDD+六边形 | 分层架构导致贫血领域模型 |
|
|
144
|
+
| 跳过基础设施 | 始终包含 Flyway、Testcontainers、Docker | 生产就绪需要适当的基础设施 |
|
|
145
|
+
| 盲目复制模板 | 阅读模板注释,适应领域 | 模板是起点,不是解决方案 |
|
|
146
|
+
| 原始类型痴迷 | 对领域概念使用值对象 | 类型安全防止错误,使意图明确 |
|
|
147
|
+
| 贫血领域模型 | 将业务逻辑放入实体/聚合 | 领域驱动设计原则 |
|
|
148
|
+
| 上帝服务 | 按命令/查询职责拆分 | CQRS 提高可维护性 |
|
|
149
|
+
| 共享可变状态 | 使用不可变值对象 | 线程安全和可预测性 |
|
|
150
|
+
|
|
151
|
+
## 架构升级路径
|
|
152
|
+
|
|
153
|
+
### 何时升级
|
|
154
|
+
|
|
155
|
+
| 从 | 到 | 触发条件 | 工作量 |
|
|
156
|
+
|------|-----|---------|--------|
|
|
157
|
+
| 分层 | 按模块打包 | 3+ 功能、团队增长到 3+ | 低 |
|
|
158
|
+
| 按模块打包 | 模块化单体 | 需要强制边界、测试独立性 | 中等 |
|
|
159
|
+
| 模块化单体 | 番茄 | 类型混淆错误、验证分散在各层 | 中等 |
|
|
160
|
+
| 番茄 | DDD+六边形 | 需要基础设施独立、CQRS、复杂业务规则 | 高 |
|
|
161
|
+
|
|
162
|
+
### 迁移策略
|
|
163
|
+
|
|
164
|
+
**分层 → 按模块打包:**
|
|
165
|
+
1. 创建模块包(products/、orders/)
|
|
166
|
+
2. 将相关的控制器、服务、仓储移动到模块中
|
|
167
|
+
3. 提取共享工具到 shared/
|
|
168
|
+
4. 重构跨模块依赖
|
|
169
|
+
|
|
170
|
+
**按模块打包 → 模块化单体:**
|
|
171
|
+
1. 添加 Spring Modulith 依赖
|
|
172
|
+
2. 为每个模块创建 `*API.java` 接口
|
|
173
|
+
3. 使内部类成为包私有
|
|
174
|
+
4. 添加 `@ApplicationModuleTest` 进行模块验证
|
|
175
|
+
5. 使用 `modularity-test.java` 模板
|
|
176
|
+
|
|
177
|
+
**模块化单体 → 番茄:**
|
|
178
|
+
1. 识别当前使用原始类型的领域概念
|
|
179
|
+
2. 为每个概念创建值对象(SKU、Price、Email 等)
|
|
180
|
+
3. 用值对象替换实体中的原始类型
|
|
181
|
+
4. 为 @PathVariable 绑定添加 Spring 转换器
|
|
182
|
+
5. 更新测试以使用值对象
|
|
183
|
+
|
|
184
|
+
**番茄 → DDD+六边形:**
|
|
185
|
+
1. 将命令与查询分离(CQRS)
|
|
186
|
+
2. 创建带有处理器的应用层
|
|
187
|
+
3. 定义领域端口(domain/ 中的仓储接口)
|
|
188
|
+
4. 将基础设施实现移动到 infra/
|
|
189
|
+
5. 从实体中提取聚合
|
|
190
|
+
6. 添加 ArchUnit 测试进行六边形验证
|
|
191
|
+
|
|
192
|
+
### 架构已过时的迹象
|
|
193
|
+
|
|
194
|
+
**分层:**
|
|
195
|
+
- 功能跨越多个不相关领域
|
|
196
|
+
- 服务类超过 500 行
|
|
197
|
+
- 难以理解功能范围
|
|
198
|
+
- 更改影响多个不相关功能
|
|
199
|
+
|
|
200
|
+
**按模块打包:**
|
|
201
|
+
- 模块有循环依赖
|
|
202
|
+
- 难以独立测试模块
|
|
203
|
+
- 模块边界不清晰
|
|
204
|
+
- 需要提取微服务
|
|
205
|
+
|
|
206
|
+
**模块化单体:**
|
|
207
|
+
- 类型混淆错误(混合 ID、代码、值)
|
|
208
|
+
- 验证逻辑到处分散
|
|
209
|
+
- 原始参数导致错误
|
|
210
|
+
- 金融/医疗领域(需要类型安全)
|
|
211
|
+
|
|
212
|
+
**番茄:**
|
|
213
|
+
- 多个聚合中的复杂业务规则
|
|
214
|
+
- 需要交换基础设施(数据库、消息队列)
|
|
215
|
+
- 多个团队在同一代码库上工作
|
|
216
|
+
- 计划微服务提取
|
|
217
|
+
|
|
218
|
+
## 最佳实践
|
|
219
|
+
|
|
220
|
+
### 从简单开始
|
|
221
|
+
- 从分层或按模块打包开始
|
|
222
|
+
- 不要过早为规模优化
|
|
223
|
+
- 当复杂度需要时再升级架构
|
|
224
|
+
- 通过团队规模、生命周期和领域复杂度来衡量复杂度
|
|
225
|
+
|
|
226
|
+
### 类型安全
|
|
227
|
+
- 对领域概念使用值对象(不仅仅是原始类型)
|
|
228
|
+
- 利用 Java 记录实现不可变性
|
|
229
|
+
- 启用 JSpecify 空安全(@NullMarked)
|
|
230
|
+
- 适当时对状态/枚举使用密封类
|
|
231
|
+
|
|
232
|
+
### 模块边界
|
|
233
|
+
- 每个模块应有明确的职责
|
|
234
|
+
- 最小化模块间的依赖
|
|
235
|
+
- 使用事件进行跨模块通信
|
|
236
|
+
- 独立测试模块
|
|
237
|
+
|
|
238
|
+
### 基础设施
|
|
239
|
+
- 始终使用 Testcontainers 进行集成测试
|
|
240
|
+
- 始终使用 Docker Compose 进行本地开发
|
|
241
|
+
- 始终使用 ProblemDetail 进行 REST 错误响应
|