【微服务大作业留档】CloudNote分布式在线笔记大纲
·
CloudNote - 分布式在线笔记系统 完整项目大纲
项目摘要:
CloudNote 是一个基于 Spring Cloud 微服务架构的分布式在线笔记系统,包含用户、笔记、分享、日志和网关五个核心服务。系统采用 Nacos 作为注册与配置中心,Gateway 实现统一路由与 JWT 鉴权,通过 Feign+Hystrix 实现服务间调用与熔断降级,利用 RabbitMQ 异步处理操作日志。项目涵盖完整的 CRUD 功能、分页搜索、短链接分享、回收站机制,并提供了详细的数据库设计、接口清单、测试计划及技术难点解决方案,满足课程项目评分要求。
项目定位
一个功能完整、技术栈全面的分布式在线笔记系统,覆盖Spring Cloud微服务核心组件。
一、项目架构全景
1.1 微服务架构图
1.2 服务清单
| 序号 | 服务名 | 端口 | 职责 | 数据库 |
|---|---|---|---|---|
| 1 | gateway |
8080 | 路由转发、JWT校验 | 无 |
| 2 | user-service |
8081 | 用户注册/登录/信息查询 | user_db |
| 3 | note-service |
8082 | 笔记CRUD、搜索、回收站 | note_db |
| 4 | share-service |
8083 | 分享链接生成/访问/权限 | share_db |
| 5 | log-service |
8084 | 消费MQ、记录操作日志 | log_db |
| 6 | common |
- | 公共模块(DTO、工具类) | - |
二、功能模块详解
2.1 功能总览
| 模块 | 功能点 | 优先级 | 涉及技术 |
|---|---|---|---|
| 用户模块 | 注册 | 核心 | BCrypt加密 |
| 登录 | 核心 | JWT生成 | |
| 获取用户信息 | 核心 | Token解析 | |
| 笔记模块 | 创建笔记 | 核心 | - |
| 编辑笔记 | 核心 | - | |
| 删除笔记(软删除) | 核心 | 状态标记 | |
| 笔记列表(分页) | 核心 | MyBatis Plus分页 | |
| 笔记详情 | 核心 | - | |
| 搜索笔记 | 核心 | LIKE模糊查询 | |
| 回收站恢复 | 进阶 | 状态变更 | |
| 分享模块 | 生成分享链接 | 核心 | 短码生成 |
| 访问分享链接 | 核心 | 权限校验 |
2.2 核心接口清单(满足Postman 20+请求)
| 编号 | 接口 | 方法 | 说明 | Feign调用 |
|---|---|---|---|---|
| 1 | /api/user/register |
POST | 用户注册 | 无 |
| 2 | /api/user/login |
POST | 登录返回JWT | 无 |
| 3 | /api/note/create |
POST | 创建笔记 | 无 |
| 4 | /api/note/list |
GET | 笔记列表 | ✅ 调用user-service |
| 5 | /api/note/detail/{id} |
GET | 笔记详情 | ✅ 调用user-service |
| 6 | /api/note/delete/{id} |
DELETE | 软删除 | 无 |
| 7 | /api/note/search |
GET | 搜索笔记 | ✅ 调用user-service |
| 8 | /api/share/create/{noteId} |
POST | 生成分享链接 | ✅ 调用note-service |
| 9 | /api/share/access/{code} |
GET | 访问分享 | ✅ 调用note-service |
| 10 | /api/log/query |
GET | 查询日志 | 无 |
共10个接口,每个2-3次请求即可超过20次
2.3 Hystrix熔断点设计
// 熔断点1:note-service → user-service
@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserClient {
@GetMapping("/user/info/{userId}")
UserDTO getUserInfo(@PathVariable Long userId);
}
// 降级:返回默认用户信息
public class UserFallback implements UserClient {
public UserDTO getUserInfo(Long userId) {
return new UserDTO(userId, "用户已离线", "***@example.com");
}
}
// 熔断点2:share-service → note-service
@FeignClient(name = "note-service", fallback = NoteFallback.class)
public interface NoteClient {
@GetMapping("/note/detail/{noteId}")
NoteDTO getNoteDetail(@PathVariable Long noteId);
}
// 降级:返回提示信息
public class NoteFallback implements NoteClient {
public NoteDTO getNoteDetail(Long noteId) {
NoteDTO dto = new NoteDTO();
dto.setTitle("笔记加载中...");
dto.setContent("笔记服务繁忙,请稍后重试");
return dto;
}
}
三、数据库设计
3.1 ER图
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ user │ │ note │ │ share │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ id(PK) │←─── │ user_id(FK) │ │ id(PK) │
│ username │ │ id(PK) │←─── │ note_id(FK) │
│ password │ │ title │ │ code(唯一) │
│ email │ │ content │ │ permission │
│ create_time │ │ status │ │ visit_count │
└─────────────┘ │ create_time │ │ create_time │
│ update_time │ └─────────────┘
└─────────────┘
│
↓
┌─────────────┐
│ log │
├─────────────┤
│ id(PK) │
│ user_id │
│ action │
│ target_id │
│ detail │
│ create_time │
└─────────────┘
3.2 建表SQL
user_db 数据库:
CREATE TABLE `user` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(255) NOT NULL COMMENT 'BCrypt加密密码',
`email` varchar(100) COMMENT '邮箱',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY `uk_username` (`username`)
);
note_db 数据库:
CREATE TABLE `note` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '所属用户ID',
`title` varchar(200) NOT NULL COMMENT '笔记标题',
`content` text COMMENT '笔记内容',
`status` tinyint DEFAULT 1 COMMENT '1-正常 0-回收站',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`)
);
share_db 数据库:
CREATE TABLE `share` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`note_id` bigint NOT NULL COMMENT '笔记ID',
`user_id` bigint NOT NULL COMMENT '分享人ID',
`code` varchar(20) NOT NULL COMMENT '分享码',
`permission` tinyint DEFAULT 1 COMMENT '1-只读 2-可编辑',
`visit_count` int DEFAULT 0 COMMENT '访问次数',
`status` tinyint DEFAULT 1 COMMENT '1-有效 0-失效',
`expire_time` datetime COMMENT '过期时间',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `uk_code` (`code`),
KEY `idx_note_id` (`note_id`)
);
CREATE TABLE `share_visit` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`share_id` bigint NOT NULL,
`visitor_ip` varchar(50),
`user_agent` varchar(255),
`visit_time` datetime DEFAULT CURRENT_TIMESTAMP
);
log_db 数据库:
CREATE TABLE `operation_log` (
`id` bigint PRIMARY KEY AUTO_INCREMENT,
`user_id` bigint NOT NULL COMMENT '操作用户ID',
`action` varchar(50) NOT NULL COMMENT '操作类型',
`target_id` bigint COMMENT '目标ID',
`detail` varchar(500) COMMENT '操作详情',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
KEY `idx_user_id` (`user_id`),
KEY `idx_create_time` (`create_time`)
);
四、评分项逐一满足表
| 评分项 | 分值 | 本项目实现方式 | 自评 |
|---|---|---|---|
| 功能完整性 | 20 | 5个服务、14个功能点、10+接口 | ✅ 充足 |
| 微服务划分 | 20 | 合理拆分:用户/笔记/分享/日志/网关 | ✅ 合理 |
| 服务治理 | - | Nacos注册中心、心跳感知 | ✅ |
| 配置中心 | - | Nacos动态配置(笔记字数限制等) | ✅ |
| 网关 | - | Gateway路由+JWT全局过滤器 | ✅ |
| 熔断降级 | - | 3处Hystrix降级点 | ✅ |
| 消息队列 | - | RabbitMQ异步日志 | ✅ 加分 |
| Postman测试 | 25 | 10个接口、20+请求、含截图 | ✅ |
| 压测 | - | JMeter 50→150→500并发 | ✅ |
| 熔断测试 | - | 手动停服务验证降级 | ✅ |
| 热更新测试 | - | Nacos配置动态生效 | ✅ |
| 代码质量 | 15 | 阿里规范、注释、分层 | ✅ |
| 文档报告 | 10 | 需求+架构+测试+部署 | ✅ |
| 答辩演示 | 10 | PPT+演示视频+问题准备 | ✅ |
五、技术难点与解决方案
| 难点 | 解决方案 | 复杂度 |
|---|---|---|
| 短分享码生成 | 雪花算法 + Base62编码 | ⭐⭐⭐ |
| 分布式日志记录 | RabbitMQ异步 + 消息确认 | ⭐⭐⭐⭐ |
| 笔记回收站定时清理 | @Scheduled + Redis分布式锁 | ⭐⭐⭐ |
| 多服务数据一致性 | 最终一致性 + 日志补偿 | ⭐⭐⭐ |
| JWT无状态认证 | Token + Redis黑名单 | ⭐⭐⭐ |
| Hystrix熔断配置 | 合理设置阈值参数 | ⭐⭐ |
六、测试计划
6.1 功能测试(Postman)
| 测试批次 | 接口数量 | 请求次数 | 重点验证 |
|---|---|---|---|
| 第1批 | 3个(用户) | 6次 | 注册/登录/Token |
| 第2批 | 4个(笔记) | 8次 | CRUD+分页+搜索 |
| 第3批 | 2个(分享) | 6次 | 生成/访问 |
| 第4批 | 1个(日志) | 4次 | 异步写入验证 |
6.2 压测计划(JMeter)
| 场景 | 并发数 | 持续时间 | 目标指标 |
|---|---|---|---|
| 负载测试 | 50→150 | 5分钟 | P95 < 1s |
| 压力测试 | 300 | 5分钟 | 错误率 < 1% |
| 极限测试 | 500 | 3分钟 | 触发熔断 |
| Hystrix测试 | 100持续 | - | 验证降级生效 |
6.3 异常场景测试
| 场景 | 操作 | 预期结果 |
|---|---|---|
| 服务熔断 | 停止user-service | 笔记列表显示"用户离线" |
| MQ故障 | 停止RabbitMQ | 主业务不受影响,消息持久化 |
| 网关鉴权 | 不带Token访问 | 返回401 |
| 配置热更新 | 修改笔记字数限制 | 不重启生效 |
更多推荐
所有评论(0)