e89f5f1f7f
- HLD-系统概要设计.md: 转换业务范围、总体架构、技术架构、部署架构、模块划分、模块交互、API接口分组等图 - LLD-会员模块详细设计.md: 转换模块边界、实体关系图 - LLD-预约模块详细设计.md: 转换模块边界、实体关系图 - LLD-签到模块详细设计.md: 转换模块边界、实体关系图 Mermaid格式优势: - 更好的可维护性和可读性 - 支持在Markdown编辑器中实时预览 - 更容易进行版本对比和修改 - 支持多种图表类型(mindmap, graph, erDiagram, sequenceDiagram)~
51 KiB
51 KiB
健身房管理系统概要设计文档(HLD)
文档编号: GYM-HLD-001
版本: v1.0
日期: 2026-02-28
作者: 张翔
状态: 初稿
文档修订历史
| 版本 | 日期 | 作者 | 修订内容 |
|---|---|---|---|
| v1.0 | 2026-02-28 | 张翔 | 初稿 |
一、引言
1.1 编写目的
本文档为健身房管理系统的概要设计文档(High-Level Design),旨在:
- 从总体上描述系统的技术架构、模块划分、接口设计
- 为详细设计提供指导和约束
- 作为开发人员、测试人员、运维人员的技术参考
1.2 项目背景
健身房管理系统是一款面向综合型健身俱乐部、精品工作室、连锁品牌的全场景管理平台,核心解决:
- 会员端:一站式查看个人所有信息,便捷预约签到
- 管理后台:全维度数据整理与分析,支撑运营决策
- 多业态支持:灵活适配不同规模和类型的健身场所
1.3 术语定义
| 术语 | 定义 |
|---|---|
| 租户(Tenant) | 系统的多租户架构中的独立业务实体,如一个连锁品牌 |
| 门店(Store) | 租户下的具体经营场所 |
| 会员(Member) | 在门店注册的用户 |
| 权益(Benefit) | 会员卡包含的时长、次数、储值、等级等权益 |
| 可预约资源(Bookable Resource) | 团课、私教、场地、线上课程等可被预约的对象 |
| 时段(Slot) | 资源的可预约时间窗口 |
1.4 参考文档
- 《健身房管理系统产品设计文档》 GYM-PRD-001
- Spring Boot 3 官方文档
- R2DBC 规范文档
- PostgreSQL 官方文档
二、系统概述
2.1 系统目标
| 目标 | 描述 | 度量标准 |
|---|---|---|
| 高可用 | 系统稳定运行,故障快速恢复 | SLA ≥ 99.9% |
| 高并发 | 支撑热门课程抢课场景 | QPS ≥ 1000 |
| 可扩展 | 支持功能模块渐进式扩展 | 模块化设计 |
| 易维护 | 代码规范,文档完善 | 代码覆盖率 ≥ 80% |
2.2 用户角色
| 角色 | 描述 | 主要功能 |
|---|---|---|
| 会员 | 健身房注册用户 | 预约课程、签到、查看个人信息 |
| 教练 | 健身房教练 | 排课、私教预约确认、学员签到 |
| 前台 | 门店前台人员 | 会员接待、签到辅助、会员管理 |
| 店长 | 门店管理者 | 单店全功能管理、数据查看 |
| 运营管理员 | 平台运营人员 | 营销活动配置、数据分析 |
| 财务专员 | 财务人员 | 账单管理、财务报表 |
| 超级管理员 | 平台最高权限 | 全平台管理、系统配置 |
2.3 业务范围
mindmap
root((业务范围))
会员管理
会员注册
会员卡管理
权益管理
等级管理
预约管理
团课预约
私教预约
场地预约
线上课程
签到管理
扫码签到
刷脸签到
NFC签到
教练代签
课程管理
课程类型
课程排期
场地管理
价格配置
教练管理
教练信息
排班管理
课时统计
评价管理
财务管理
营收统计
账单管理
退款管理
对账管理
计划中心
训练计划
课程排期
会员目标
教练排班
数据分析
会员分析
课程分析
财务分析
运营分析
系统管理
租户管理
门店管理
权限管理
系统配置
三、系统架构设计
3.1 总体架构
采用分层架构 + 微服务思想的模块化设计:
graph TB
subgraph ClientLayer[客户端层]
A1[会员小程序<br/>uniapp+Vue3]
A2[教练端App<br/>uniapp+Vue3]
A3[管理后台PC<br/>Vue3+Vite]
A4[硬件设备<br/>人脸/NFC]
end
subgraph Gateway[API Gateway<br/>统一网关]
B1[路由转发]
B2[认证鉴权]
B3[限流熔断]
B4[日志追踪]
end
subgraph BusinessLayer[业务层]
C1[会员服务<br/>Member Service]
C2[预约服务<br/>Booking Service]
C3[数据服务<br/>Data Service]
end
subgraph CommonLayer[公共服务层]
D1[认证服务]
D2[消息服务]
D3[文件服务]
D4[缓存服务]
end
subgraph InfraLayer[基础设施层]
E1[PostgreSQL]
E2[R2DBC]
E3[Caffeine]
E4[Redis可选]
end
subgraph ExternalLayer[外部服务]
F1[微信开放平台]
F2[短信服务]
F3[支付服务]
F4[OSS存储]
end
A1 --> Gateway
A2 --> Gateway
A3 --> Gateway
A4 --> Gateway
Gateway --> C1
Gateway --> C2
Gateway --> C3
C1 --> CommonLayer
C2 --> CommonLayer
C3 --> CommonLayer
CommonLayer --> InfraLayer
CommonLayer --> ExternalLayer
3.2 技术架构
graph TB
subgraph Presentation[表现层 Presentation]
A1[会员端 uniapp<br/>Vue3 + TS<br/>Pinia<br/>uni-ui]
A2[教练端 uniapp<br/>Vue3 + TS<br/>Pinia<br/>uni-ui]
A3[管理后台 Vue3<br/>Vue3 + TS<br/>Pinia<br/>Element Plus]
end
subgraph Gateway[网关层 Gateway]
B[Spring Cloud Gateway<br/>路由转发<br/>认证鉴权<br/>限流熔断<br/>日志追踪<br/>灰度发布]
end
subgraph Business[业务层 Business]
C[Spring Boot 3 + WebFlux + JDK 21]
C1[Controller<br/>API]
C2[Service<br/>业务逻辑]
C3[Repository<br/>数据访问]
C4[Model<br/>领域模型]
end
subgraph Data[数据层 Data]
D1[PostgreSQL<br/>R2DBC<br/>Flyway]
D2[Caffeine<br/>本地缓存<br/>热点数据]
D3[Redis可选<br/>分布式缓存<br/>分布式锁]
end
A1 --> B
A2 --> B
A3 --> B
B --> C
C --> C1
C1 --> C2
C2 --> C3
C3 --> C4
C4 --> D1
C4 --> D2
C4 --> D3
3.3 部署架构
graph TB
LB[负载均衡器<br/>Nginx/ALB]
subgraph GatewayInstances[API Gateway集群]
GW1[API Gateway<br/>实例1]
GW2[API Gateway<br/>实例2]
GW3[API Gateway<br/>实例N]
end
subgraph AppInstances[应用服务集群]
APP1[应用服务<br/>实例1]
APP2[应用服务<br/>实例2]
APP3[应用服务<br/>实例N]
end
subgraph DBLayer[数据库层]
PG1[PostgreSQL<br/>主库]
PG2[PostgreSQL<br/>从库1]
PG3[PostgreSQL<br/>从库N]
end
subgraph CacheLayer[缓存层]
REDIS1[Redis<br/>主节点]
REDIS2[Redis<br/>从节点1]
REDIS3[Redis<br/>从节点N]
end
LB --> GW1
LB --> GW2
LB --> GW3
GW1 --> APP1
GW2 --> APP2
GW3 --> APP3
APP1 --> PG1
APP2 --> PG1
APP3 --> PG1
PG1 -.->|主从复制| PG2
PG1 -.->|主从复制| PG3
APP1 --> REDIS1
APP2 --> REDIS1
APP3 --> REDIS1
REDIS1 -.->|主从复制| REDIS2
REDIS1 -.->|主从复制| REDIS3
│ └───────────────────┼───────────────────┘ │ │ │ │ │ ┌──────────────────┼──────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ │ │ Application │ │ Application │ │ Application │ │ │ │ Server (Pod1) │ │ Server (Pod2) │ │ Server (PodN) │ │ │ └───────┬────────┘ └───────┬────────┘ └
───────┬────────┘ │
│ │ │ │ │
│ └───────────────────┼───────────────────┘ │
│ │ │
│ ┌───────────────────────────┼───────────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PostgreSQL │ │ Redis │ │ OSS │ │
│ │ (主从复制) │ │ (哨兵模式) │ │ (对象存储) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
四、模块设计
4.1 模块划分
---
## 四、模块设计
### 4.1 模块划分
```mermaid
graph TB
subgraph Parent[gym-manage-server 父工程]
subgraph Common[gym-common 公共模块]
C1[gym-common-core<br/>核心工具类、常量、枚举]
C2[gym-common-redis<br/>Redis配置可选]
C3[gym-common-security<br/>安全认证公共组件]
C4[gym-common-log<br/>日志公共组件]
end
subgraph API[gym-api API网关模块]
A1[controller<br/>HTTP接口]
A2[dto<br/>数据传输对象]
A3[vo<br/>视图对象]
A4[config<br/>API配置]
end
subgraph Service[gym-service 业务服务模块]
S1[gym-service-member<br/>会员服务]
S2[gym-service-booking<br/>预约服务]
S3[gym-service-checkin<br/>签到服务]
S4[gym-service-course<br/>课程服务]
S5[gym-service-coach<br/>教练服务]
S6[gym-service-finance<br/>财务服务]
S7[gym-service-data<br/>数据服务]
end
subgraph Domain[gym-domain 领域模型模块]
D1[model<br/>领域模型]
D2[event<br/>领域事件]
D3[service<br/>领域服务]
end
subgraph Infra[gym-infrastructure 基础设施模块]
I1[repository<br/>数据仓储]
I2[cache<br/>缓存配置]
I3[external<br/>外部服务集成]
I4[config<br/>基础配置]
end
subgraph Starter[gym-starter 启动模块]
ST[gym-admin<br/>管理后台启动器]
end
end
4.2 模块职责
| 模块 | 职责 | 依赖 |
|---|---|---|
| gym-common-core | 提供通用工具类、常量定义、异常处理 | 无 |
| gym-common-security | 提供JWT认证、权限校验 | gym-common-core |
| gym-common-log | 提供统一日志处理 | gym-common-core |
| gym-domain | 定义领域模型、领域事件、领域服务 | gym-common-core |
| gym-infrastructure | 提供数据访问、缓存、外部服务集成 | gym-domain |
| gym-service-member | 会员、会员卡、权益管理 | gym-domain, gym-infrastructure |
| gym-service-booking | 课程预约、库存管理 | gym-domain, gym-infrastructure |
| gym-service-checkin | 签到处理、权益扣减 | gym-domain, gym-infrastructure |
| gym-api | HTTP接口定义、参数校验 | gym-service-* |
| gym-starter | 应用启动、配置加载 | gym-api |
4.3 模块交互
sequenceDiagram
participant Client as 客户端
participant API as API Layer
participant Service as Service Layer
participant Domain as Domain Layer
participant Repo as Repo Layer
participant Infra as Infrastructure
Client->>API: HTTP Request
API->>Service: 调用业务逻辑
Service->>Domain: 处理领域逻辑
Domain->>Repo: 访问数据
Repo->>Infra: 访问基础设施
Infra-->>Repo: 返回结果
Repo-->>Domain: 返回数据
Domain-->>Service: 返回领域对象
Service-->>API: 返回业务结果
API-->>Client: HTTP Response
五、接口设计
5.1 接口规范
5.1.1 RESTful API 规范
基础URL: https://api.gym-manage.com/v1
资源命名规范:
- 使用名词复数形式: /members, /bookings, /courses
- 使用小写字母和连字符: /member-cards, /booking-slots
- 避免动词: /members (正确) vs /getMembers (错误)
HTTP方法语义:
- GET: 查询资源
- POST: 创建资源
- PUT: 全量更新资源
- PATCH: 部分更新资源
- DELETE: 删除资源
5.1.2 请求响应格式
// 统一响应格式
{
"code": 0, // 业务状态码,0表示成功
"message": "success", // 响应消息
"data": {}, // 响应数据
"timestamp": 1709123456789 // 时间戳
}
// 分页响应格式
{
"code": 0,
"message": "success",
"data": {
"list": [], // 数据列表
"total": 100, // 总记录数
"page": 1, // 当前页码
"pageSize": 20 // 每页大小
},
"timestamp": 1709123456789
}
// 错误响应格式
{
"code": 40001, // 错误码
"message": "参数校验失败", // 错误消息
"data": {
"errors": [ // 详细错误信息
{"field": "phone", "message": "手机号格式不正确"}
]
},
"timestamp": 1709123456789
}
5.1.3 状态码定义
| 状态码 | 含义 | 说明 |
|---|---|---|
| 0 | 成功 | 请求处理成功 |
| 40001 | 参数错误 | 请求参数校验失败 |
| 40002 | 资源不存在 | 请求的资源不存在 |
| 40003 | 资源已存在 | 创建的资源已存在 |
| 40101 | 未登录 | 用户未登录或Token过期 |
| 40102 | 无权限 | 用户无访问权限 |
| 40301 | 业务异常 | 业务逻辑校验失败 |
| 50001 | 系统异常 | 系统内部错误 |
5.2 接口分组
5.2 接口分组
graph LR
subgraph Auth[认证接口 /v1/auth]
A1[POST /login<br/>登录]
A2[POST /logout<br/>登出]
A3[POST /refresh<br/>刷新Token]
A4[POST /wechat-login<br/>微信登录]
end
subgraph Members[会员接口 /v1/members]
M1[GET /<br/>会员列表]
M2[GET /{id}<br/>会员详情]
M3[POST /<br/>创建会员]
M4[PUT /{id}<br/>更新会员]
M5[GET /{id}/cards<br/>会员卡列表]
M6[GET /{id}/benefits<br/>权益列表]
M7[GET /{id}/bookings<br/>预约记录]
end
subgraph Courses[课程接口 /v1/courses]
C1[GET /<br/>课程列表]
C2[GET /{id}<br/>课程详情]
C3[POST /<br/>创建课程]
C4[PUT /{id}<br/>更新课程]
C5[GET /{id}/slots<br/>可预约时段]
end
subgraph Bookings[预约接口 /v1/bookings]
B1[GET /<br/>预约列表]
B2[GET /{id}<br/>预约详情]
B3[POST /<br/>创建预约]
B4[POST /{id}/cancel<br/>取消预约]
B5[GET /my<br/>我的预约]
end
subgraph Checkins[签到接口 /v1/checkins]
CH1[GET /<br/>签到列表]
CH2[POST /scan<br/>扫码签到]
CH3[POST /manual<br/>手动签到]
CH4[GET /my<br/>我的签到]
end
subgraph Coaches[教练接口 /v1/coaches]
CO1[GET /<br/>教练列表]
CO2[GET /{id}<br/>教练详情]
CO3[GET /{id}/schedule<br/>教练排班]
CO4[GET /{id}/slots<br/>可预约时段]
end
subgraph Dashboard[数据看板 /v1/dashboard]
D1[GET /overview<br/>今日概览]
D2[GET /trends<br/>趋势数据]
D3[GET /rankings<br/>排行数据]
end
5.3 接口版本管理
版本策略:
1. URL路径版本: /v1/members, /v2/members
2. 向后兼容原则: 新版本接口保留旧版本功能
3. 废弃通知: 旧版本接口返回 Warning 头,提前3个月通知
版本生命周期:
- 开发中: 内部测试,不对外发布
- 当前版本: 正式发布,完全支持
- 已废弃: 仍可使用,但建议迁移
- 已下线: 不再可用
六、安全设计
6.1 认证机制
┌─────────────────────────────────────────────────────────────────────────┐
│ 认证机制 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ JWT Token 认证流程 │ │
│ │ │ │
│ │ 1. 用户登录 │ │
│ │ POST /v1/auth/login │ │
│ │ { phone, code } │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 2. 服务端验证 │ │
│ │ - 验证手机号和验证码 │ │
│ │ - 查询用户信息 │ │
│ │ - 生成 JWT Token │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 3. 返回 Token │ │
│ │ { accessToken, refreshToken, expiresIn } │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 4. 后续请求携带 Token │ │
│ │ Authorization: Bearer {accessToken} │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 5. 服务端验证 Token │ │
│ │ - 解析 Token │ │
│ │ - 验证签名和有效期 │ │
│ │ - 提取用户信息 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Token 结构: │
│ { │
│ "sub": "member:12345", // 用户标识 │
│ "tenant": "tenant:001", // 租户标识 │
│ "store": "store:001", // 门店标识 │
│ "roles": ["MEMBER"], // 角色列表 │
│ "exp": 1709123456, // 过期时间 │
│ "iat": 1709120000 // 签发时间 │
│ } │
│ │
└─────────────────────────────────────────────────────────────────────────┘
6.2 权限控制
┌─────────────────────────────────────────────────────────────────────────┐
│ RBAC 权限模型 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ M:N ┌─────────┐ M:N ┌─────────┐ │
│ │ 用户 │─────────────▶│ 角色 │─────────────▶│ 权限 │ │
│ │ User │ │ Role │ │Permission│ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ 角色定义: │
│ ┌────────────────┬────────────────────────────────────────────────┐ │
│ │ 角色 │ 权限范围 │ │
│ ├────────────────┼────────────────────────────────────────────────┤ │
│ │ ROLE_MEMBER │ 会员端功能:预约、签到、个人信息 │ │
│ │ ROLE_COACH │ 教练端功能:排课、签到、学员管理 │ │
│ │ ROLE_RECEPTION │ 前台功能:接待、签到、会员查询 │ │
│ │ ROLE_STORE_MGR │ 店长功能:单店全功能管理 │ │
│ │ ROLE_OPERATOR │ 运营功能:营销活动、数据分析 │ │
│ │ ROLE_FINANCE │ 财务功能:账单、报表 │ │
│ │ ROLE_ADMIN │ 超管功能:全平台管理 │ │
│ └────────────────┴────────────────────────────────────────────────┘ │
│ │
│ 权限标识: │
│ 格式: {模块}:{资源}:{操作} │
│ 示例: │
│ - member:user:read # 查看会员信息 │
│ - member:user:write # 编辑会员信息 │
│ - booking:course:create # 创建课程预约 │
│ - booking:course:cancel # 取消课程预约 │
│ - checkin:scan:execute # 执行扫码签到 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
6.3 数据安全
┌─────────────────────────────────────────────────────────────────────────┐
│ 数据安全措施 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 敏感数据加密 │
│ ├── 手机号: 存储时AES加密,展示时脱敏(138****1234) │
│ ├── 身份证: 存储时AES加密,不对外展示 │
│ ├── 密码: 使用BCrypt加密存储 │
│ └── 支付信息: 不存储,仅保留支付渠道token │
│ │
│ 2. 传输安全 │
│ ├── 全站HTTPS │
│ ├── 敏感接口签名验证 │
│ └── 防重放攻击(timestamp + nonce) │
│ │
│ 3. SQL注入防护 │
│ ├── 使用R2DBC参数化查询 │
│ ├── 禁止拼接SQL │
│ └── 输入参数校验 │
│ │
│ 4. XSS防护 │
│ ├── 输入过滤 │
│ ├── 输出编码 │
│ └── Content-Security-Policy头 │
│ │
│ 5. CSRF防护 │
│ ├── CSRF Token验证 │
│ └── SameSite Cookie │
│ │
│ 6. 多租户数据隔离 │
│ ├── tenant_id 强制过滤 │
│ ├── 数据库行级安全策略(RLS) │
│ └── API层租户上下文自动注入 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
6.4 接口安全
┌─────────────────────────────────────────────────────────────────────────┐
│ 接口安全措施 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 限流策略 │
│ ├── 全局限流: 10000 QPS │
│ ├── 单IP限流: 100 QPS │
│ ├── 单用户限流: 50 QPS │
│ └── 敏感接口限流: 登录10次/分钟,短信1次/分钟 │
│ │
│ 2. 熔断降级 │
│ ├── 错误率阈值: 50% │
│ ├── 熔断时间窗口: 30秒 │
│ └── 降级策略: 返回默认值或友好提示 │
│ │
│ 3. 黑白名单 │
│ ├── IP白名单: 管理后台接口 │
│ ├── IP黑名单: 恶意攻击IP │
│ └── 用户黑名单: 违规用户 │
│ │
│ 4. 日志审计 │
│ ├── 操作日志: 记录所有写操作 │
│ ├── 访问日志: 记录所有API请求 │
│ └── 异常日志: 记录系统异常 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
七、性能设计
7.1 性能目标
| 指标 | 目标值 | 说明 |
|---|---|---|
| 响应时间 | P99 < 200ms | 99%的请求响应时间小于200ms |
| 吞吐量 | QPS ≥ 1000 | 系统每秒处理请求数 |
| 并发用户 | ≥ 5000 | 同时在线用户数 |
| 可用性 | SLA ≥ 99.9% | 年度可用性 |
7.2 性能优化策略
┌─────────────────────────────────────────────────────────────────────────┐
│ 性能优化策略 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 数据库优化 │
│ ├── 索引优化: 合理创建索引,避免全表扫描 │
│ ├── 连接池: R2DBC连接池,max-size=20 │
│ ├── 读写分离: 主库写入,从库读取(后期扩展) │
│ └── 分库分表: 按租户分库(后期扩展) │
│ │
│ 2. 缓存优化 │
│ ├── L1缓存: Caffeine本地缓存,热点数据 │
│ ├── L2缓存: Redis分布式缓存(可选扩展) │
│ ├── 缓存策略: 写穿透 + 延迟双删 │
│ └── 缓存预热: 系统启动时预加载热点数据 │
│ │
│ 3. 代码优化 │
│ ├── 响应式编程: WebFlux非阻塞IO │
│ ├── 异步处理: 非核心流程异步化 │
│ ├── 批量操作: 减少数据库往返 │
│ └── 虚拟线程: JDK 21虚拟线程优化阻塞操作 │
│ │
│ 4. 网络优化 │
│ ├── CDN加速: 静态资源CDN分发 │
│ ├── GZIP压缩: 响应数据压缩 │
│ ├── HTTP/2: 多路复用 │
│ └── Keep-Alive: 连接复用 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
7.3 高并发场景处理
┌─────────────────────────────────────────────────────────────────────────┐
│ 高并发预约场景处理 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 场景: 热门课程开抢,大量用户同时预约 │
│ │
│ 解决方案: │
│ │
│ 1. 库存预热 │
│ └── 开抢前将课程库存加载到Caffeine缓存 │
│ │
│ 2. 原子操作 │
│ └── 使用PostgreSQL原子更新: │
│ UPDATE booking_slot │
│ SET booked_count = booked_count + 1 │
│ WHERE id = ? AND booked_count < capacity │
│ │
│ 3. 乐观锁 │
│ └── 版本号控制,冲突时重试 │
│ │
│ 4. 排队机制 │
│ └── 请求进入队列,异步处理结果 │
│ │
│ 5. 限流保护 │
│ └── 令牌桶限流,防止系统过载 │
│ │
│ 6. 候补机制 │
│ └── 满员后自动进入候补队列,有人取消时自动补位 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
八、可扩展性设计
8.1 水平扩展
┌─────────────────────────────────────────────────────────────────────────┐
│ 水平扩展方案 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 无状态设计 │
│ ├── Session外置到Redis │
│ ├── 本地不存储用户状态 │
│ └── 任意实例可处理任意请求 │
│ │
│ 2. 负载均衡 │
│ ├── 轮询: 默认策略 │
│ ├── 加权轮询: 根据服务器性能分配权重 │
│ └── 最少连接: 请求分配给连接数最少的服务器 │
│ │
│ 3. 服务拆分(后期) │
│ ├── 会员服务独立部署 │
│ ├── 预约服务独立部署 │
│ └── 数据服务独立部署 │
│ │
│ 4. 数据库扩展(后期) │
│ ├── 读写分离 │
│ ├── 分库分表 │
│ └── 多活架构 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
8.2 功能扩展
┌─────────────────────────────────────────────────────────────────────────┐
│ 功能扩展点 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 支付扩展 │
│ ├── 预留支付接口抽象 │
│ ├── 支持微信支付、支付宝、银联等 │
│ └── 可扩展其他支付渠道 │
│ │
│ 2. 硬件扩展 │
│ ├── 签到网关抽象设计 │
│ ├── 支持多种签到设备 │
│ └── 可扩展智能硬件 │
│ │
│ 3. 消息扩展 │
│ ├── 消息模板可配置 │
│ ├── 支持多渠道推送 │
│ └── 可扩展新的消息渠道 │
│ │
│ 4. 报表扩展 │
│ ├── 报表模板可配置 │
│ ├── 支持自定义报表 │
│ └── 可扩展BI工具对接 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
九、监控与运维
9.1 监控体系
┌─────────────────────────────────────────────────────────────────────────┐
│ 监控体系 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 基础监控 │
│ ├── CPU使用率 │
│ ├── 内存使用率 │
│ ├── 磁盘使用率 │
│ ├── 网络IO │
│ └── 进程状态 │
│ │
│ 2. 应用监控 │
│ ├── JVM监控(GC、堆内存、线程) │
│ ├── 请求QPS/响应时间 │
│ ├── 错误率/异常数 │
│ └── 数据库连接池状态 │
│ │
│ 3. 业务监控 │
│ ├── 登录数/在线用户数 │
│ ├── 预约成功率 │
│ ├── 签到成功率 │
│ └── 支付成功率 │
│ │
│ 4. 告警策略 │
│ ├── CPU > 80% 告警 │
│ ├── 内存 > 85% 告警 │
│ ├── 错误率 > 1% 告警 │
│ └── 响应时间 P99 > 500ms 告警 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
9.2 日志规范
┌─────────────────────────────────────────────────────────────────────────┐
│ 日志规范 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 日志级别 │
│ ├── ERROR: 错误日志,需要立即处理 │
│ ├── WARN: 警告日志,需要关注 │
│ ├── INFO: 重要业务日志 │
│ └── DEBUG: 调试日志(生产环境关闭) │
│ │
│ 2. 日志格式 │
│ { │
│ "timestamp": "2024-02-28T10:00:00.000+08:00", │
│ "level": "INFO", │
│ "traceId": "abc123", │
│ "spanId": "def456", │
│ "tenantId": "tenant:001", │
│ "userId": "member:12345", │
│ "class": "MemberService", │
│ "method": "createMember", │
│ "message": "创建会员成功", │
│ "args": {"phone": "138****1234"}, │
│ "result": {"memberId": 12345}, │
│ "duration": 50 │
│ } │
│ │
│ 3. 日志存储 │
│ ├── 本地文件: 保留7天 │
│ ├── ELK: 集中存储和分析 │
│ └── 归档: 超过30天归档到OSS │
│ │
└─────────────────────────────────────────────────────────────────────────┘
十、附录
10.1 技术选型清单
| 分类 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 后端框架 | Spring Boot | 3.x | 主框架 |
| 响应式 | Spring WebFlux | 3.x | 响应式Web框架 |
| JDK | OpenJDK | 21+ | 虚拟线程支持 |
| 数据库 | PostgreSQL | 15+ | 主数据库 |
| 数据访问 | R2DBC | 1.x | 响应式数据库访问 |
| 数据库迁移 | Flyway | 9.x | 数据库版本管理 |
| 缓存 | Caffeine | 3.x | 本地缓存 |
| 缓存(可选) | Redis | 7.x | 分布式缓存 |
| 前端框架 | Vue | 3.x | 前端框架 |
| 跨端框架 | uniapp | 3.x | 跨端开发框架 |
| 状态管理 | Pinia | 2.x | 状态管理 |
| UI组件 | Element Plus | 2.x | 管理后台UI |
| 构建工具 | Vite | 5.x | 前端构建工具 |
| 容器 | Docker | 24.x | 容器化部署 |
10.2 术语表
| 术语 | 英文 | 定义 |
|---|---|---|
| 高可用 | High Availability | 系统持续提供服务的能力 |
| 响应式编程 | Reactive Programming | 基于数据流和变化传播的编程范式 |
| 多租户 | Multi-tenancy | 单个实例服务多个租户的架构 |
| 软删除 | Soft Delete | 通过标记删除时间而非物理删除数据 |
| 乐观锁 | Optimistic Lock | 假设冲突较少,通过版本号控制并发 |
| 悲观锁 | Pessimistic Lock | 假设冲突较多,通过锁机制控制并发 |
文档结束