在线学习视频社区平台微服务架构设计文档 文档信息 项目名称 在线学习视频社区平台 文档版本 V1.0 编写日期 2026年3月 文档性质 毕业设计架构设计文档
第一章 系统概述 1.1 项目背景 随着互联网技术的快速发展和在线教育的普及,视频学习平台已成为高校学生和自学者获取知识的重要渠道。传统的视频学习平台存在互动性不足、内容检索困难、学习效率低下等问题。本项目旨在构建一个基于微服务架构的在线学习视频社区平台,整合视频播放、弹幕互动、智能摘要、内容搜索等功能,为用户提供沉浸式的学习体验。
1.2 系统目标 高可用性 :通过微服务架构实现服务的独立部署和故障隔离可扩展性 :支持按需扩展高负载服务,提升系统承载能力可维护性 :服务边界清晰,便于独立开发和维护用户体验 :提供流畅的视频播放、实时弹幕互动体验1.3 目标用户群体 用户类型 描述 主要需求 普通用户 高校学生、自学者 观看视频、发送弹幕、评论互动、内容搜索 内容创作者 教师、知识博主 上传视频、管理内容、查看数据统计 系统管理员 平台运营人员 用户管理、内容审核、系统监控
第二章 系统架构设计 2.1 总体架构 系统采用前后端分离与微服务架构相结合的设计模式,整体架构分为四层:
┌─────────────────────────────────────────────────────────────────┐
│ 前端展示层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 用户前端 │ │ 创作者中心 │ │ 管理后台 │ │
│ │ (Vue3) │ │ (Vue3) │ │ (Vue3) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ API网关层 │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Spring Cloud Gateway │ │
│ │ 路由转发 │ 认证鉴权 │ 限流熔断 │ 日志记录 │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 微服务层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 用户服务 │ │ 视频服务 │ │ 弹幕服务 │ │ 搜索服务 │ │
│ │ :8081 │ │ :8082 │ │ :8083 │ │ :8084 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 评论服务 │ │ 互动服务 │ │ 消息服务 │ │ AI服务 │ │
│ │ :8085 │ │ :8086 │ │ :8087 │ │ :8088 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 基础设施层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Nacos │ │ MySQL │ │ MongoDB │ │ Redis │ │
│ │ 注册中心 │ │ 关系数据库│ │ 文档数据库│ │ 缓存服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Elasticsearch│ │ RabbitMQ │ │ FFmpeg │ │
│ │ 搜索引擎 │ │ 消息队列 │ │ 视频处理 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘ 2.2 微服务拆分策略 根据业务领域和功能边界,系统拆分为以下微服务:
服务名称 服务标识 端口 核心职责 用户服务 user-service 8081 用户注册、登录、权限管理、个人信息 视频服务 video-service 8082 视频上传、转码、播放、稿件管理 弹幕服务 danmaku-service 8083 弹幕发送、显示、管理 搜索服务 search-service 8084 视频搜索、热门搜索、搜索推荐 评论服务 comment-service 8085 评论发布、回复、点赞 互动服务 interaction-service 8086 点赞、投币、收藏、分享 消息服务 message-service 8087 私信、通知、系统消息 AI服务 ai-service 8088 智能摘要、字幕识别
2.3 服务间通信架构 ┌─────────────────┐
│ Nacos Server │
│ 服务注册与发现 │
└────────┬────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 用户服务 │◄──Feign──►│ 视频服务 │◄──Feign──►│ 弹幕服务 │
└─────────┘ └─────────┘ └─────────┘
│ │ │
│ ▼ │
│ ┌─────────────┐ │
└─────────────►│ OpenFeign │◄─────────────────┘
│ 服务间调用 │
└─────────────┘ 第三章 技术选型 3.1 前端技术栈 技术 版本 用途 Vue.js 3.4 前端框架,响应式数据绑定 Element Plus 2.7 UI组件库,快速构建界面 Vue Router 4.2 路由管理,单页面应用 Pinia 2.1 状态管理,数据共享 Axios 1.7 HTTP请求库,API调用 Artplayer 5.1 视频播放器,支持弹幕 HLS.js 1.5 HLS流媒体播放
3.2 后端技术栈 技术 版本 用途 Spring Boot 2.7.18 基础框架,简化配置 Spring Cloud 2021.x 微服务框架 Spring Cloud Alibaba 2021.0.5.0 阿里巴巴微服务组件 Nacos 2.x 服务注册与配置中心 Spring Cloud Gateway 3.x API网关 OpenFeign 3.x 服务间调用 MyBatis 3.4 ORM框架,数据库操作 Spring Security 5.7 安全框架,认证授权 JWT 0.9.1 Token认证
3.3 数据存储 技术 版本 用途 MySQL 8.0 关系型数据库,核心业务数据 MongoDB 5.x 文档数据库,弹幕、字幕存储 Redis 6.x 缓存数据库,会话、热点数据 Elasticsearch 7.x 搜索引擎,全文检索
3.4 中间件 技术 版本 用途 RabbitMQ 3.x 消息队列,异步任务处理 FFmpeg 5.x 视频转码,多清晰度处理 Nginx 1.24 反向代理,静态资源
3.5 开发工具 工具 用途 IntelliJ IDEA Java开发IDE Visual Studio Code 前端开发IDE Git 版本控制 Docker 容器化部署 Postman API测试 Maven 项目构建
第四章 微服务详细设计 4.1 用户服务 (user-service) 4.1.1 服务职责 功能模块 功能描述 用户注册 用户名密码注册、邮箱验证 用户登录 JWT Token认证、单点登录 用户信息 个人资料管理、头像上传 权限管理 角色分配、权限控制 关注系统 关注/取关、粉丝列表
4.1.2 数据库设计 用户表 (users)
字段名 类型 说明 id INT 主键,自增 username VARCHAR(50) 用户名,唯一 password VARCHAR(255) 密码,加密存储 nickname VARCHAR(50) 昵称 avatar VARCHAR(255) 头像URL email VARCHAR(100) 邮箱,唯一 level INT 用户等级 following_count INT 关注数 follower_count INT 粉丝数 created_at DATETIME 创建时间
角色表 (roles)
字段名 类型 说明 id INT 主键 name VARCHAR(50) 角色名称 description VARCHAR(255) 角色描述
关注表 (follows)
字段名 类型 说明 id INT 主键 follower_id INT 关注者ID followed_id INT 被关注者ID created_at DATETIME 关注时间
4.1.3 API接口设计 接口路径 方法 描述 /api/user/register POST 用户注册 /api/user/login POST 用户登录 /api/user/ GET 获取用户信息 /api/user/ PUT 更新用户信息 /api/user/avatar POST 上传头像 /api/user/follow/ POST 关注用户 /api/user/unfollow/ DELETE 取消关注
4.1.4 服务依赖 用户服务
├── 依赖服务
│ ├── 视频服务(获取用户视频列表)
│ └── 互动服务(获取用户互动数据)
├── 数据库
│ ├── MySQL(用户、角色、关注表)
│ └── Redis(用户会话、缓存)
└── 中间件
└── Nacos(服务注册) 4.2 视频服务 (video-service) 4.2.1 服务职责 功能模块 功能描述 视频上传 支持多种格式、断点续传 视频转码 FFmpeg多清晰度转码 视频播放 HLS流媒体播放 稿件管理 稿件创建、编辑、删除 视频推荐 首页推荐、分类推荐
4.2.2 数据库设计 稿件表 (manuscripts)
字段名 类型 说明 id INT 主键 title VARCHAR(100) 标题 description TEXT 描述 user_id INT 作者ID category_id INT 分类ID cover_url VARCHAR(255) 封面URL status INT 状态:0-待审核,1-已发布 view_count INT 播放量 like_count INT 点赞数 upload_time DATETIME 上传时间
视频表 (videos)
字段名 类型 说明 id INT 主键 manuscript_id INT 稿件ID title VARCHAR(100) 视频标题 source_url VARCHAR(255) 原视频URL play_url_1080p VARCHAR(255) 1080P播放URL play_url_720p VARCHAR(255) 720P播放URL play_url_480p VARCHAR(255) 480P播放URL duration_seconds INT 时长(秒) process_status INT 处理状态
分类表 (categories)
字段名 类型 说明 id INT 主键 name VARCHAR(50) 分类名称
4.2.3 视频处理流程 用户上传视频
│
▼
┌─────────────┐
│ 存储原视频 │
└──────┬──────┘
│
▼
┌─────────────┐ ┌─────────────┐
│ 发送消息到 │────►│ RabbitMQ │
│ 消息队列 │ │ 转码队列 │
└─────────────┘ └──────┬──────┘
│
▼
┌─────────────┐
│ FFmpeg转码 │
│ 1080P/720P │
│ 480P │
└──────┬──────┘
│
▼
┌─────────────┐
│ 更新视频状态 │
│ 生成HLS切片 │
└─────────────┘ 4.2.4 API接口设计 接口路径 方法 描述 /api/video/upload POST 上传视频 /api/video/ GET 获取视频详情 /api/video/{id}/play GET 获取播放地址 /api/video/list GET 获取视频列表 /api/video/recommend GET 获取推荐视频 /api/manuscript POST 创建稿件 /api/manuscript/ PUT 更新稿件
4.3 弹幕服务 (danmaku-service) 4.3.1 服务职责 功能模块 功能描述 弹幕发送 实时发送弹幕 弹幕显示 按时间轴加载弹幕 弹幕管理 屏蔽、过滤敏感词
4.3.2 数据库设计 弹幕集合 (MongoDB: danmakus)
字段名 类型 说明 _id ObjectId 主键 videoId Integer 视频ID userId Integer 用户ID content String 弹幕内容 time Double 出现时间(秒) color String 弹幕颜色 mode Integer 弹幕类型:1-滚动,2-顶部 createdAt Date 创建时间
4.3.3 弹幕数据流 用户发送弹幕
│
▼
┌─────────────┐
│ 敏感词过滤 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 存储到MongoDB│
└──────┬──────┘
│
▼
┌─────────────┐
│ 广播给在线用户│
│ (WebSocket) │
└─────────────┘ 4.3.4 API接口设计 接口路径 方法 描述 /api/danmaku/send POST 发送弹幕 /api/danmaku/ GET 获取视频弹幕 /api/danmaku/{videoId}/segment GET 获取时间段弹幕
4.4 搜索服务 (search-service) 4.4.1 服务职责 功能模块 功能描述 全文检索 视频标题、描述搜索 热门搜索 热门关键词排行 搜索建议 搜索词自动补全 搜索历史 用户搜索记录
4.4.2 Elasticsearch索引设计 视频索引 (manuscripts)
字段名 类型 说明 id Integer 稿件ID title text 标题(分词) description text 描述(分词) categoryName keyword 分类名称 tags keyword 标签列表 viewCount Integer 播放量 uploadTime Date 上传时间
4.4.3 搜索流程 用户输入搜索词
│
▼
┌─────────────┐
│ 分词处理 │
└──────┬──────┘
│
▼
┌─────────────┐
│ ES全文检索 │
│ 相关性排序 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 返回搜索结果 │
│ 更新搜索历史 │
└─────────────┘ 4.4.4 API接口设计 接口路径 方法 描述 /api/search GET 搜索视频 /api/search/hot GET 获取热门搜索 /api/search/suggest GET 搜索建议 /api/search/history GET 搜索历史
4.5.1 服务职责 功能模块 功能描述 评论发布 发表视频评论 评论回复 回复他人评论 评论点赞 点赞评论 评论管理 删除、审核评论
4.5.2 数据库设计 评论表 (comments)
字段名 类型 说明 id INT 主键 manuscript_id INT 稿件ID user_id INT 用户ID content TEXT 评论内容 like_count INT 点赞数 reply_count INT 回复数 created_at DATETIME 创建时间
回复表 (replies)
字段名 类型 说明 id INT 主键 comment_id INT 评论ID user_id INT 回复用户ID reply_to_user_id INT 被回复用户ID content TEXT 回复内容 like_count INT 点赞数
4.5.3 API接口设计 接口路径 方法 描述 /api/comment POST 发表评论 /api/comment/ GET 获取评论列表 /api/comment/{id}/reply POST 回复评论 /api/comment/{id}/like POST 点赞评论
4.6 互动服务 (interaction-service) 4.6.1 服务职责 功能模块 功能描述 点赞 视频点赞、取消点赞 投币 视频投币 收藏 收藏到收藏夹 分享 分享视频
4.6.2 数据库设计 点赞表 (likes)
字段名 类型 说明 id INT 主键 user_id INT 用户ID manuscript_id INT 稿件ID created_at DATETIME 点赞时间
投币表 (coins)
字段名 类型 说明 id INT 主键 user_id INT 用户ID manuscript_id INT 稿件ID coin_count INT 投币数量
收藏夹表 (favorite_folders)
字段名 类型 说明 id INT 主键 user_id INT 用户ID name VARCHAR(50) 收藏夹名称 video_count INT 视频数量
4.6.3 API接口设计 接口路径 方法 描述 /api/interaction/like/ POST 点赞 /api/interaction/coin/ POST 投币 /api/interaction/collect/ POST 收藏 /api/interaction/share/ POST 分享
4.7 消息服务 (message-service) 4.7.1 服务职责 功能模块 功能描述 私信 用户间私信 系统通知 系统消息推送 互动通知 点赞、评论、关注通知 消息设置 通知偏好设置
4.7.2 数据库设计 会话表 (conversations)
字段名 类型 说明 id INT 主键 user_id INT 当前用户ID target_user_id INT 对方用户ID last_message_content VARCHAR(500) 最后消息 unread_count INT 未读数
消息表 (messages)
字段名 类型 说明 id INT 主键 sender_id INT 发送者ID receiver_id INT 接收者ID content TEXT 消息内容 is_read TINYINT 是否已读
通知表 (notifications)
字段名 类型 说明 id INT 主键 user_id INT 用户ID type INT 通知类型 title VARCHAR(255) 标题 content TEXT 内容 is_read INT 是否已读
4.7.3 API接口设计 接口路径 方法 描述 /api/message/conversations GET 获取会话列表 /api/message/ GET 获取消息记录 /api/message/send POST 发送私信 /api/notification/list GET 获取通知列表 /api/notification/read/ PUT 标记已读
4.8 AI服务 (ai-service) 4.8.1 服务职责 功能模块 功能描述 语音识别 Whisper语音转文字 字幕生成 自动生成视频字幕 智能摘要 大语言模型生成摘要 字幕管理 字幕编辑、导入导出
4.8.2 数据库设计 字幕集合 (MongoDB: subtitles)
字段名 类型 说明 _id ObjectId 主键 videoId Integer 视频ID language String 语言 segments Array 字幕片段 summary String AI摘要
字幕片段结构
字段名 类型 说明 start Double 开始时间 end Double 结束时间 text String 字幕文本
4.8.3 AI处理流程 视频审核通过
│
▼
┌─────────────┐
│ 提取音频 │
└──────┬──────┘
│
▼
┌─────────────┐ ┌─────────────┐
│ 发送消息到 │────►│ RabbitMQ │
│ 消息队列 │ │ AI处理队列 │
└─────────────┘ └──────┬──────┘
│
▼
┌─────────────┐
│ Whisper识别 │
│ 生成字幕 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 大语言模型 │
│ 生成摘要 │
└─────────────┘ 4.8.4 API接口设计 接口路径 方法 描述 /api/ai/subtitle/ GET 获取字幕 /api/ai/summary/ GET 获取智能摘要 /api/ai/subtitle/generate POST 生成字幕 /api/ai/subtitle/import POST 导入字幕
第五章 API网关设计 5.1 网关架构 客户端请求
│
▼
┌─────────────────────────────────────────────────────┐
│ Spring Cloud Gateway │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │
│ │路由转发 │ │认证鉴权 │ │限流熔断 │ │日志记录│ │
│ └─────────┘ └─────────┘ └─────────┘ └────────┘ │
└─────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│用户服务 │ │视频服务 │ │其他服务 │
└─────────┘ └─────────┘ └─────────┘ 5.2 路由配置 yaml spring :
cloud :
gateway :
routes :
- id : user-service
uri : lb://user-service
predicates :
- Path=/api/user/**
filters :
- StripPrefix=1
- id : video-service
uri : lb://video-service
predicates :
- Path=/api/video/**,/api/manuscript/**
filters :
- StripPrefix=1
- id : danmaku-service
uri : lb://danmaku-service
predicates :
- Path=/api/danmaku/**
filters :
- StripPrefix=1
- id : search-service
uri : lb://search-service
predicates :
- Path=/api/search/**
filters :
- StripPrefix=1
- id : comment-service
uri : lb://comment-service
predicates :
- Path=/api/comment/**
filters :
- StripPrefix=1
- id : interaction-service
uri : lb://interaction-service
predicates :
- Path=/api/interaction/**
filters :
- StripPrefix=1
- id : message-service
uri : lb://message-service
predicates :
- Path=/api/message/**,/api/notification/**
filters :
- StripPrefix=1
- id : ai-service
uri : lb://ai-service
predicates :
- Path=/api/ai/**
filters :
- StripPrefix=1 5.3 认证过滤器 java @ Component
public class AuthGlobalFilter implements GlobalFilter , Ordered {
@ Override
public Mono < Void > filter ( ServerWebExchange exchange , GatewayFilterChain chain ) {
String path = exchange . getRequest (). getPath (). value ();
if ( isWhitePath ( path )) {
return chain . filter ( exchange );
}
String token = exchange . getRequest (). getHeaders (). getFirst ( " Authorization " );
if ( token == null || ! JwtUtils . validateToken ( token )) {
exchange . getResponse (). setStatusCode ( HttpStatus . UNAUTHORIZED );
return exchange . getResponse (). setComplete ();
}
Integer userId = JwtUtils . getUserIdFromToken ( token );
ServerHttpRequest request = exchange . getRequest (). mutate ()
. header ( " X-User-Id " , String . valueOf ( userId ))
. build ();
return chain . filter ( exchange . mutate (). request ( request ). build ());
}
@ Override
public int getOrder () {
return - 100 ;
}
} 第六章 服务注册与发现 6.1 Nacos架构 ┌─────────────────────────────────────────────────────┐
│ Nacos Server │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 服务注册表 │ │ 配置中心 │ │
│ │ │ │ │ │
│ │ user-service │ │ application.yml │ │
│ │ video-service │ │ mysql.yml │ │
│ │ danmaku-service │ │ redis.yml │ │
│ │ ... │ │ ... │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────┘
▲ ▲ ▲
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│用户服务 │ │视频服务 │ │其他服务 │
│注册/心跳 │ │注册/心跳 │ │注册/心跳 │
└─────────┘ └─────────┘ └─────────┘ 6.2 服务注册配置 yaml spring :
application :
name : user-service
cloud :
nacos :
discovery :
server-addr : localhost:8848
namespace : dev
group : mybilibili
config :
server-addr : localhost:8848
file-extension : yaml
namespace : dev
group : mybilibili 6.3 配置中心结构 Nacos配置中心
├── mybilibili
│ ├── dev
│ │ ├── application.yaml # 公共配置
│ │ ├── mysql.yaml # MySQL配置
│ │ ├── redis.yaml # Redis配置
│ │ ├── mongodb.yaml # MongoDB配置
│ │ ├── elasticsearch.yaml # ES配置
│ │ ├── user-service.yaml # 用户服务配置
│ │ ├── video-service.yaml # 视频服务配置
│ │ ├── danmaku-service.yaml # 弹幕服务配置
│ │ └── ...
│ └── prod
│ └── ... 第七章 服务间通信 7.1 OpenFeign接口定义 用户服务Feign客户端
java @ FeignClient ( name = " user-service " , path = " /user " )
public interface UserFeignClient {
@ GetMapping ( " /{id} " )
Result < UserVO > getUserById (@ PathVariable ( " id " ) Integer id );
@ GetMapping ( " /batch " )
Result < List < UserVO >> getUsersByIds (@ RequestParam ( " ids " ) List < Integer > ids );
@ GetMapping ( " /{id}/stats " )
Result < UserStatsVO > getUserStats (@ PathVariable ( " id " ) Integer id );
} 视频服务Feign客户端
java @ FeignClient ( name = " video-service " , path = " /video " )
public interface VideoFeignClient {
@ GetMapping ( " /{id} " )
Result < VideoVO > getVideoById (@ PathVariable ( " id " ) Integer id );
@ GetMapping ( " /manuscript/{manuscriptId} " )
Result < List < VideoVO >> getVideosByManuscriptId (@ PathVariable ( " manuscriptId " ) Integer manuscriptId );
@ PostMapping ( " /{id}/view " )
Result < Void > incrementViewCount (@ PathVariable ( " id " ) Integer id );
} 7.2 服务调用示例 java @ Service
public class CommentServiceImpl implements CommentService {
@ Autowired
private CommentMapper commentMapper ;
@ Autowired
private UserFeignClient userFeignClient ;
@ Autowired
private VideoFeignClient videoFeignClient ;
@ Override
public CommentVO getCommentDetail ( Integer commentId ) {
Comment comment = commentMapper . findById ( commentId );
UserVO user = userFeignClient . getUserById ( comment . getUserId ()). getData ();
CommentVO vo = new CommentVO ();
BeanUtils . copyProperties ( comment , vo );
vo . setUserNickname ( user . getNickname ());
vo . setUserAvatar ( user . getAvatar ());
return vo ;
}
} 第八章 消息队列设计 8.1 RabbitMQ架构 ┌─────────────────────────────────────────────────────┐
│ RabbitMQ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ video.transcode │ │ ai.process │ │
│ │ 视频转码队列 │ │ AI处理队列 │ │
│ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │
│ ┌────────▼────────┐ ┌────────▼────────┐ │
│ │ video.transcode │ │ ai.process │ │
│ │ 转码交换机 │ │ 处理交换机 │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────┘
▲ ▲
│ │
┌────┴────┐ ┌────┴────┐
│视频服务 │ │AI服务 │
│生产者 │ │生产者 │
└─────────┘ └─────────┘ 8.2 队列配置 java @ Configuration
public class RabbitMQConfig {
public static final String VIDEO_TRANSCODE_QUEUE = " video.transcode " ;
public static final String VIDEO_TRANSCODE_EXCHANGE = " video.transcode.exchange " ;
public static final String VIDEO_TRANSCODE_ROUTING_KEY = " video.transcode " ;
public static final String AI_PROCESS_QUEUE = " ai.process " ;
public static final String AI_PROCESS_EXCHANGE = " ai.process.exchange " ;
public static final String AI_PROCESS_ROUTING_KEY = " ai.process " ;
@ Bean
public Queue videoTranscodeQueue () {
return QueueBuilder . durable ( VIDEO_TRANSCODE_QUEUE )
. withArgument ( " x-message-ttl " , 60000 )
. build ();
}
@ Bean
public DirectExchange videoTranscodeExchange () {
return new DirectExchange ( VIDEO_TRANSCODE_EXCHANGE );
}
@ Bean
public Binding videoTranscodeBinding () {
return BindingBuilder . bind ( videoTranscodeQueue ())
. to ( videoTranscodeExchange ())
. with ( VIDEO_TRANSCODE_ROUTING_KEY );
}
} 8.3 消息生产者 java @ Service
public class VideoTranscodeProducer {
@ Autowired
private RabbitTemplate rabbitTemplate ;
public void sendTranscodeTask ( Integer videoId , String sourcePath ) {
VideoTranscodeMessage message = new VideoTranscodeMessage ();
message . setVideoId ( videoId );
message . setSourcePath ( sourcePath );
message . setCreateTime ( new Date ());
rabbitTemplate . convertAndSend (
VIDEO_TRANSCODE_EXCHANGE ,
VIDEO_TRANSCODE_ROUTING_KEY ,
message
);
}
} 8.4 消息消费者 java @ Component
public class VideoTranscodeConsumer {
@ Autowired
private FFmpegService ffmpegService ;
@ Autowired
private VideoService videoService ;
@ RabbitListener ( queues = VIDEO_TRANSCODE_QUEUE )
public void handleTranscode ( VideoTranscodeMessage message ) {
try {
TranscodeResult result = ffmpegService . transcode (
message . getSourcePath (),
Arrays . asList ( " 1080p " , " 720p " , " 480p " )
);
videoService . updateVideoUrls (
message . getVideoId (),
result . getPlayUrls ()
);
videoService . updateProcessStatus (
message . getVideoId (),
ProcessStatus . COMPLETED
);
} catch ( Exception e ) {
videoService . updateProcessStatus (
message . getVideoId (),
ProcessStatus . FAILED
);
}
}
} 第九章 数据库设计 9.1 数据库架构 ┌─────────────────────────────────────────────────────┐
│ 数据层架构 │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ MySQL (关系型数据) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │用户库 │ │视频库 │ │互动库 │ │ │
│ │ │users │ │manuscripts│ │likes │ │ │
│ │ │roles │ │videos │ │coins │ │ │
│ │ │follows │ │comments │ │collections│ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ MongoDB (文档数据) │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │弹幕集合 │ │字幕集合 │ │ │
│ │ │danmakus │ │subtitles│ │ │
│ │ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Elasticsearch (搜索数据) │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │稿件索引 │ │用户索引 │ │ │
│ │ │manuscripts│ │users │ │ │
│ │ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Redis (缓存数据) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │会话缓存 │ │热点缓存 │ │计数缓存 │ │ │
│ │ │session:*│ │hot:* │ │count:* │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘ 9.2 MySQL表清单 表名 归属服务 说明 users 用户服务 用户信息 roles 用户服务 角色信息 permissions 用户服务 权限信息 user_roles 用户服务 用户角色关联 role_permissions 用户服务 角色权限关联 follows 用户服务 关注关系 manuscripts 视频服务 稿件信息 videos 视频服务 视频信息 categories 视频服务 分类信息 tags 视频服务 标签信息 video_tags 视频服务 视频标签关联 comments 评论服务 评论信息 replies 评论服务 回复信息 likes 互动服务 点赞记录 coins 互动服务 投币记录 favorite_folders 互动服务 收藏夹 favorite_videos 互动服务 收藏视频 shares 互动服务 分享记录 watch_history 视频服务 观看历史 conversations 消息服务 会话信息 messages 消息服务 消息记录 notifications 消息服务 通知信息 notification_settings 消息服务 通知设置 message_settings 消息服务 消息设置 prohibited_words 管理服务 敏感词 banner_images 管理服务 轮播图
9.3 MongoDB集合 集合名 归属服务 说明 danmakus 弹幕服务 弹幕数据 subtitles AI服务 字幕数据
9.4 Redis缓存设计 Key模式 类型 说明 过期时间 session: String 用户会话 7天 user: Hash 用户信息缓存 1小时 video: Hash 视频信息缓存 30分钟 hot:search ZSet 热门搜索 1天 hot:video ZSet 热门视频 1小时 count:video:{id}:view String 视频播放量 永久 count:video:{id}:like String 视频点赞量 永久
第十章 部署架构 10.1 部署拓扑 ┌─────────────┐
│ Nginx │
│ 负载均衡 │
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Gateway │ │ Gateway │ │ Gateway │
│ Node 1 │ │ Node 2 │ │ Node 3 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└─────────────────┼─────────────────┘
│
┌───────────┬───────────┬───┴───┬───────────┬───────────┐
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│用户服务│ │视频服务│ │弹幕服务│ │搜索服务│ │评论服务│ │消息服务│
│ x2 │ │ x3 │ │ x2 │ │ x2 │ │ x2 │ │ x2 │
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ 10.2 服务器配置 服务 CPU 内存 实例数 说明 Nacos 2核 4G 3 集群部署 Gateway 2核 4G 2 网关服务 用户服务 2核 4G 2 用户相关 视频服务 4核 8G 3 视频处理 弹幕服务 2核 4G 2 弹幕处理 搜索服务 4核 8G 2 ES搜索 评论服务 2核 4G 2 评论处理 互动服务 2核 4G 2 互动处理 消息服务 2核 4G 2 消息处理 AI服务 4核 8G 2 AI处理 MySQL 4核 16G 2 主从部署 MongoDB 4核 8G 3 副本集 Redis 2核 8G 3 集群部署 Elasticsearch 4核 16G 3 集群部署 RabbitMQ 2核 4G 3 集群部署
10.3 Docker部署配置 yaml version : ' 3.8 '
services :
nacos :
image : nacos/nacos-server:v2.2.0
environment :
- MODE=standalone
ports :
- " 8848:8848 "
mysql :
image : mysql:8.0
environment :
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=mybilibili
ports :
- " 3306:3306 "
redis :
image : redis:6
ports :
- " 6379:6379 "
mongodb :
image : mongo:5
ports :
- " 27017:27017 "
elasticsearch :
image : elasticsearch:7.17.0
environment :
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ports :
- " 9200:9200 "
rabbitmq :
image : rabbitmq:3-management
ports :
- " 5672:5672 "
- " 15672:15672 " 第十一章 安全设计 11.1 认证授权架构 ┌─────────────────────────────────────────────────────┐
│ 认证流程 │
│ │
│ 客户端 ──► Gateway ──► 认证过滤器 ──► 用户服务 │
│ │ │ │
│ │ ▼ │
│ │ 验证Token │
│ │ │ │
│ │ ▼ │
│ │ 解析用户信息 │
│ │ │ │
│ │ ▼ │
│ │ 传递用户ID │
│ │ │ │
│ └──────────────┘ │
│ │ │
│ ▼ │
│ 目标微服务 │
└─────────────────────────────────────────────────────┘ 11.2 JWT Token结构 json {
" header " : {
" alg " : " HS256 " ,
" typ " : " JWT "
},
" payload " : {
" userId " : 1001 ,
" username " : " user001 " ,
" roles " : [ " user " , " creator " ],
" exp " : 1710000000 ,
" iat " : 1709999999
},
" signature " : " ... "
} 11.3 权限控制 角色 权限 普通用户 观看视频、发送弹幕、评论、点赞 内容创作者 上传视频、管理稿件、查看数据 管理员 用户管理、内容审核、系统配置
第十二章 性能优化 12.1 缓存策略 场景 缓存策略 过期时间 用户信息 Cache-Aside 1小时 视频详情 Cache-Aside 30分钟 热门视频 Write-Through 1小时 播放量计数 Write-Behind 永久
12.2 数据库优化 优化项 说明 索引优化 高频查询字段建立索引 分库分表 大表按时间分片 读写分离 主从复制,读从库 连接池 HikariCP连接池
12.3 服务优化 优化项 说明 异步处理 RabbitMQ异步任务 服务熔断 Sentinel熔断降级 负载均衡 Ribbon负载均衡 限流 令牌桶限流
第十三章 监控运维 13.1 监控架构 ┌─────────────────────────────────────────────────────┐
│ 监控体系 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Prometheus │ │ Grafana │ │ Skywalking │ │
│ │ 指标采集 │ │ 可视化 │ │ 链路追踪 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ ELK Stack │ │ Alert │ │
│ │ 日志分析 │ │ 告警通知 │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────┘ 13.2 健康检查 yaml management :
endpoints :
web :
exposure :
include : health,info,metrics
endpoint :
health :
show-details : always 第十四章 总结与展望 14.1 系统特点 微服务架构 :服务独立部署,高可用、可扩展多数据存储 :MySQL + MongoDB + Redis + ES,各取所长异步处理 :RabbitMQ消息队列,提升响应速度智能功能 :AI摘要、语音识别,提升用户体验实时互动 :弹幕系统,增强学习互动性14.2 未来改进方向 改进方向 说明 分布式事务 引入Seata,保证数据一致性 服务网格 引入Istio,提升服务治理能力 容器编排 Kubernetes部署,弹性伸缩 智能推荐 机器学习算法,个性化推荐 边缘计算 CDN加速,提升访问速度
附录 附录A:技术术语表 术语 说明 微服务 一种架构风格,将应用拆分为独立服务 Nacos 阿里巴巴开源的服务注册与配置中心 Gateway API网关,统一入口、路由转发 OpenFeign 声明式HTTP客户端,服务间调用 RabbitMQ 消息队列,异步通信 Elasticsearch 分布式搜索引擎 MongoDB 文档型数据库 JWT JSON Web Token,无状态认证
附录B:参考文献 《Spring Cloud微服务实战》 《微服务架构设计模式》 《Elasticsearch权威指南》 《MongoDB实战》 Spring Cloud官方文档 文档结束