CloudNote - 分布式在线笔记系统 完整项目大纲

项目摘要
CloudNote 是一个基于 Spring Cloud 微服务架构的分布式在线笔记系统,包含用户、笔记、分享、日志和网关五个核心服务。系统采用 Nacos 作为注册与配置中心,Gateway 实现统一路由与 JWT 鉴权,通过 Feign+Hystrix 实现服务间调用与熔断降级,利用 RabbitMQ 异步处理操作日志。项目涵盖完整的 CRUD 功能、分页搜索、短链接分享、回收站机制,并提供了详细的数据库设计、接口清单、测试计划及技术难点解决方案,满足课程项目评分要求。

项目定位

一个功能完整、技术栈全面的分布式在线笔记系统,覆盖Spring Cloud微服务核心组件。


一、项目架构全景

1.1 微服务架构图

基础设施层

数据层

异步层

业务服务层

网关层

客户端

Feign+Hystrix

Feign+Hystrix

Feign+Hystrix

发送日志消息

发送日志消息

注册

注册

注册

注册

注册

浏览器 / Postman / JMeter

Gateway :8080
路由+JWT鉴权

user-service :8081
用户管理

note-service :8082
笔记管理

share-service :8083
分享协作

RabbitMQ
消息队列

log-service :8084
日志消费

Redis
缓存

MySQL
主数据库

Nacos
注册中心+配置中心

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
配置热更新 修改笔记字数限制 不重启生效

更多推荐