需求与架构设计
写生产代码的第一步不是敲键盘,而是把需求和边界写清楚。本章定义短链接服务的完整设计。
需求定义
Tip
明确不做的(防止范围蔓延):不实现点击量统计报表(仅保留计数列)、不支持短码过期、不做管理后台。真实项目中"不做什么"与"做什么"同样重要。
API 设计
设计要点:
- 认证走
Authorization: Bearer <token>,与状态码语义一致:401 未认证、403 已认证但越权。 - 跳转用 302 而非 301:301 会被浏览器永久缓存,短码改指向、点击统计都会失效;302 每次回源,代价可接受。
- 错误响应统一为
{"error":"..."},便于客户端统一处理。
数据模型
两个实体,GORM 模型定义:
分层架构
自上而下单向依赖,层间以接口衔接(可替换、可测试):
Tip
为什么按层而非按"文件类型"组织:internal 下的每个包对应一个明确职责,接口定义在消费方(service 定义自己需要的 Store 接口,store 包实现它),这正是接口一章"小接口定义在使用侧"原则的落地。
目录结构
技术选型
短码生成策略
系统短码使用 Base62 编码 + crypto/rand 随机 7 位(62⁷ ≈ 3.5 万亿组合)。关键设计:
- 用密码学随机而非时间戳递增,避免短码可被枚举遍历(gosec 也会拦截弱随机)。
- 冲突处理:生成后插入,唯一索引冲突时重试(3 次上限);3.5 万亿空间下冲突概率可忽略。
- 自定义短码仅允许
[0-9a-zA-Z_-]{3,16},正则校验防注入与畸形输入。
下一章进入核心实现。