Skip to content

在线学习视频社区平台微服务架构设计文档

🕒 Published at:

在线学习视频社区平台微服务架构设计文档 ​

文档信息 ​

项目名称在线学习视频社区平台
文档版本V1.0
编写日期2026年3月
文档性质毕业设计架构设计文档

第一章 系统概述 ​

1.1 项目背景 ​

随着互联网技术的快速发展和在线教育的普及,视频学习平台已成为高校学生和自学者获取知识的重要渠道。传统的视频学习平台存在互动性不足、内容检索困难、学习效率低下等问题。本项目旨在构建一个基于微服务架构的在线学习视频社区平台,整合视频播放、弹幕互动、智能摘要、内容搜索等功能,为用户提供沉浸式的学习体验。

1.2 系统目标 ​

  1. 高可用性:通过微服务架构实现服务的独立部署和故障隔离
  2. 可扩展性:支持按需扩展高负载服务,提升系统承载能力
  3. 可维护性:服务边界清晰,便于独立开发和维护
  4. 用户体验:提供流畅的视频播放、实时弹幕互动体验

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-service8081用户注册、登录、权限管理、个人信息
视频服务video-service8082视频上传、转码、播放、稿件管理
弹幕服务danmaku-service8083弹幕发送、显示、管理
搜索服务search-service8084视频搜索、热门搜索、搜索推荐
评论服务comment-service8085评论发布、回复、点赞
互动服务interaction-service8086点赞、投币、收藏、分享
消息服务message-service8087私信、通知、系统消息
AI服务ai-service8088智能摘要、字幕识别

2.3 服务间通信架构 ​

                    ┌─────────────────┐
                    │   Nacos Server  │
                    │  服务注册与发现  │
                    └────────┬────────┘
                             │
     ┌───────────────────────┼───────────────────────┐
     │                       │                       │
     ▼                       ▼                       ▼
┌─────────┐            ┌─────────┐            ┌─────────┐
│ 用户服务 │◄──Feign──►│ 视频服务 │◄──Feign──►│ 弹幕服务 │
└─────────┘            └─────────┘            └─────────┘
     │                       │                       │
     │                       ▼                       │
     │              ┌─────────────┐                  │
     └─────────────►│  OpenFeign  │◄─────────────────┘
                    │  服务间调用  │
                    └─────────────┘

第三章 技术选型 ​

3.1 前端技术栈 ​

技术版本用途
Vue.js3.4前端框架,响应式数据绑定
Element Plus2.7UI组件库,快速构建界面
Vue Router4.2路由管理,单页面应用
Pinia2.1状态管理,数据共享
Axios1.7HTTP请求库,API调用
Artplayer5.1视频播放器,支持弹幕
HLS.js1.5HLS流媒体播放

3.2 后端技术栈 ​

技术版本用途
Spring Boot2.7.18基础框架,简化配置
Spring Cloud2021.x微服务框架
Spring Cloud Alibaba2021.0.5.0阿里巴巴微服务组件
Nacos2.x服务注册与配置中心
Spring Cloud Gateway3.xAPI网关
OpenFeign3.x服务间调用
MyBatis3.4ORM框架,数据库操作
Spring Security5.7安全框架,认证授权
JWT0.9.1Token认证

3.3 数据存储 ​

技术版本用途
MySQL8.0关系型数据库,核心业务数据
MongoDB5.x文档数据库,弹幕、字幕存储
Redis6.x缓存数据库,会话、热点数据
Elasticsearch7.x搜索引擎,全文检索

3.4 中间件 ​

技术版本用途
RabbitMQ3.x消息队列,异步任务处理
FFmpeg5.x视频转码,多清晰度处理
Nginx1.24反向代理,静态资源

3.5 开发工具 ​

工具用途
IntelliJ IDEAJava开发IDE
Visual Studio Code前端开发IDE
Git版本控制
Docker容器化部署
PostmanAPI测试
Maven项目构建

第四章 微服务详细设计 ​

4.1 用户服务 (user-service) ​

4.1.1 服务职责 ​

功能模块功能描述
用户注册用户名密码注册、邮箱验证
用户登录JWT Token认证、单点登录
用户信息个人资料管理、头像上传
权限管理角色分配、权限控制
关注系统关注/取关、粉丝列表

4.1.2 数据库设计 ​

用户表 (users)

字段名类型说明
idINT主键,自增
usernameVARCHAR(50)用户名,唯一
passwordVARCHAR(255)密码,加密存储
nicknameVARCHAR(50)昵称
avatarVARCHAR(255)头像URL
emailVARCHAR(100)邮箱,唯一
levelINT用户等级
following_countINT关注数
follower_countINT粉丝数
created_atDATETIME创建时间

角色表 (roles)

字段名类型说明
idINT主键
nameVARCHAR(50)角色名称
descriptionVARCHAR(255)角色描述

关注表 (follows)

字段名类型说明
idINT主键
follower_idINT关注者ID
followed_idINT被关注者ID
created_atDATETIME关注时间

4.1.3 API接口设计 ​

接口路径方法描述
/api/user/registerPOST用户注册
/api/user/loginPOST用户登录
/api/user/GET获取用户信息
/api/user/PUT更新用户信息
/api/user/avatarPOST上传头像
/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)

字段名类型说明
idINT主键
titleVARCHAR(100)标题
descriptionTEXT描述
user_idINT作者ID
category_idINT分类ID
cover_urlVARCHAR(255)封面URL
statusINT状态:0-待审核,1-已发布
view_countINT播放量
like_countINT点赞数
upload_timeDATETIME上传时间

视频表 (videos)

字段名类型说明
idINT主键
manuscript_idINT稿件ID
titleVARCHAR(100)视频标题
source_urlVARCHAR(255)原视频URL
play_url_1080pVARCHAR(255)1080P播放URL
play_url_720pVARCHAR(255)720P播放URL
play_url_480pVARCHAR(255)480P播放URL
duration_secondsINT时长(秒)
process_statusINT处理状态

分类表 (categories)

字段名类型说明
idINT主键
nameVARCHAR(50)分类名称

4.2.3 视频处理流程 ​

用户上传视频
      │
      ▼
┌─────────────┐
│ 存储原视频   │
└──────┬──────┘
       │
       ▼
┌─────────────┐     ┌─────────────┐
│ 发送消息到   │────►│ RabbitMQ    │
│ 消息队列     │     │ 转码队列    │
└─────────────┘     └──────┬──────┘
                           │
                           ▼
                    ┌─────────────┐
                    │ FFmpeg转码  │
                    │ 1080P/720P  │
                    │ 480P        │
                    └──────┬──────┘
                           │
                           ▼
                    ┌─────────────┐
                    │ 更新视频状态 │
                    │ 生成HLS切片  │
                    └─────────────┘

4.2.4 API接口设计 ​

接口路径方法描述
/api/video/uploadPOST上传视频
/api/video/GET获取视频详情
/api/video/{id}/playGET获取播放地址
/api/video/listGET获取视频列表
/api/video/recommendGET获取推荐视频
/api/manuscriptPOST创建稿件
/api/manuscript/PUT更新稿件

4.3 弹幕服务 (danmaku-service) ​

4.3.1 服务职责 ​

功能模块功能描述
弹幕发送实时发送弹幕
弹幕显示按时间轴加载弹幕
弹幕管理屏蔽、过滤敏感词

4.3.2 数据库设计 ​

弹幕集合 (MongoDB: danmakus)

字段名类型说明
_idObjectId主键
videoIdInteger视频ID
userIdInteger用户ID
contentString弹幕内容
timeDouble出现时间(秒)
colorString弹幕颜色
modeInteger弹幕类型:1-滚动,2-顶部
createdAtDate创建时间

4.3.3 弹幕数据流 ​

用户发送弹幕
      │
      ▼
┌─────────────┐
│ 敏感词过滤  │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ 存储到MongoDB│
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ 广播给在线用户│
│ (WebSocket) │
└─────────────┘

4.3.4 API接口设计 ​

接口路径方法描述
/api/danmaku/sendPOST发送弹幕
/api/danmaku/GET获取视频弹幕
/api/danmaku/{videoId}/segmentGET获取时间段弹幕

4.4 搜索服务 (search-service) ​

4.4.1 服务职责 ​

功能模块功能描述
全文检索视频标题、描述搜索
热门搜索热门关键词排行
搜索建议搜索词自动补全
搜索历史用户搜索记录

4.4.2 Elasticsearch索引设计 ​

视频索引 (manuscripts)

字段名类型说明
idInteger稿件ID
titletext标题(分词)
descriptiontext描述(分词)
categoryNamekeyword分类名称
tagskeyword标签列表
viewCountInteger播放量
uploadTimeDate上传时间

4.4.3 搜索流程 ​

用户输入搜索词
      │
      ▼
┌─────────────┐
│ 分词处理    │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ ES全文检索  │
│ 相关性排序  │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ 返回搜索结果 │
│ 更新搜索历史 │
└─────────────┘

4.4.4 API接口设计 ​

接口路径方法描述
/api/searchGET搜索视频
/api/search/hotGET获取热门搜索
/api/search/suggestGET搜索建议
/api/search/historyGET搜索历史

4.5 评论服务 (comment-service) ​

4.5.1 服务职责 ​

功能模块功能描述
评论发布发表视频评论
评论回复回复他人评论
评论点赞点赞评论
评论管理删除、审核评论

4.5.2 数据库设计 ​

评论表 (comments)

字段名类型说明
idINT主键
manuscript_idINT稿件ID
user_idINT用户ID
contentTEXT评论内容
like_countINT点赞数
reply_countINT回复数
created_atDATETIME创建时间

回复表 (replies)

字段名类型说明
idINT主键
comment_idINT评论ID
user_idINT回复用户ID
reply_to_user_idINT被回复用户ID
contentTEXT回复内容
like_countINT点赞数

4.5.3 API接口设计 ​

接口路径方法描述
/api/commentPOST发表评论
/api/comment/GET获取评论列表
/api/comment/{id}/replyPOST回复评论
/api/comment/{id}/likePOST点赞评论

4.6 互动服务 (interaction-service) ​

4.6.1 服务职责 ​

功能模块功能描述
点赞视频点赞、取消点赞
投币视频投币
收藏收藏到收藏夹
分享分享视频

4.6.2 数据库设计 ​

点赞表 (likes)

字段名类型说明
idINT主键
user_idINT用户ID
manuscript_idINT稿件ID
created_atDATETIME点赞时间

投币表 (coins)

字段名类型说明
idINT主键
user_idINT用户ID
manuscript_idINT稿件ID
coin_countINT投币数量

收藏夹表 (favorite_folders)

字段名类型说明
idINT主键
user_idINT用户ID
nameVARCHAR(50)收藏夹名称
video_countINT视频数量

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)

字段名类型说明
idINT主键
user_idINT当前用户ID
target_user_idINT对方用户ID
last_message_contentVARCHAR(500)最后消息
unread_countINT未读数

消息表 (messages)

字段名类型说明
idINT主键
sender_idINT发送者ID
receiver_idINT接收者ID
contentTEXT消息内容
is_readTINYINT是否已读

通知表 (notifications)

字段名类型说明
idINT主键
user_idINT用户ID
typeINT通知类型
titleVARCHAR(255)标题
contentTEXT内容
is_readINT是否已读

4.7.3 API接口设计 ​

接口路径方法描述
/api/message/conversationsGET获取会话列表
/api/message/GET获取消息记录
/api/message/sendPOST发送私信
/api/notification/listGET获取通知列表
/api/notification/read/PUT标记已读

4.8 AI服务 (ai-service) ​

4.8.1 服务职责 ​

功能模块功能描述
语音识别Whisper语音转文字
字幕生成自动生成视频字幕
智能摘要大语言模型生成摘要
字幕管理字幕编辑、导入导出

4.8.2 数据库设计 ​

字幕集合 (MongoDB: subtitles)

字段名类型说明
_idObjectId主键
videoIdInteger视频ID
languageString语言
segmentsArray字幕片段
summaryStringAI摘要

字幕片段结构

字段名类型说明
startDouble开始时间
endDouble结束时间
textString字幕文本

4.8.3 AI处理流程 ​

视频审核通过
      │
      ▼
┌─────────────┐
│ 提取音频    │
└──────┬──────┘
       │
       ▼
┌─────────────┐     ┌─────────────┐
│ 发送消息到   │────►│ RabbitMQ    │
│ 消息队列     │     │ AI处理队列  │
└─────────────┘     └──────┬──────┘
                           │
                           ▼
                    ┌─────────────┐
                    │ Whisper识别 │
                    │ 生成字幕    │
                    └──────┬──────┘
                           │
                           ▼
                    ┌─────────────┐
                    │ 大语言模型  │
                    │ 生成摘要    │
                    └─────────────┘

4.8.4 API接口设计 ​

接口路径方法描述
/api/ai/subtitle/GET获取字幕
/api/ai/summary/GET获取智能摘要
/api/ai/subtitle/generatePOST生成字幕
/api/ai/subtitle/importPOST导入字幕

第五章 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弹幕服务弹幕数据
subtitlesAI服务字幕数据

9.4 Redis缓存设计 ​

Key模式类型说明过期时间
session:String用户会话7天
user:Hash用户信息缓存1小时
video:Hash视频信息缓存30分钟
hot:searchZSet热门搜索1天
hot:videoZSet热门视频1小时
count:video:{id}:viewString视频播放量永久
count:video:{id}:likeString视频点赞量永久

第十章 部署架构 ​

10.1 部署拓扑 ​

                         ┌─────────────┐
                         │   Nginx     │
                         │  负载均衡   │
                         └──────┬──────┘
                                │
              ┌─────────────────┼─────────────────┐
              │                 │                 │
              ▼                 ▼                 ▼
       ┌─────────────┐  ┌─────────────┐  ┌─────────────┐
       │   Gateway   │  │   Gateway   │  │   Gateway   │
       │   Node 1    │  │   Node 2    │  │   Node 3    │
       └──────┬──────┘  └──────┬──────┘  └──────┬──────┘
              │                 │                 │
              └─────────────────┼─────────────────┘
                                │
    ┌───────────┬───────────┬───┴───┬───────────┬───────────┐
    │           │           │       │           │           │
    ▼           ▼           ▼       ▼           ▼           ▼
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│用户服务│ │视频服务│ │弹幕服务│ │搜索服务│ │评论服务│ │消息服务│
│ x2     │ │ x3     │ │ x2     │ │ x2     │ │ x2     │ │ x2     │
└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘

10.2 服务器配置 ​

服务CPU内存实例数说明
Nacos2核4G3集群部署
Gateway2核4G2网关服务
用户服务2核4G2用户相关
视频服务4核8G3视频处理
弹幕服务2核4G2弹幕处理
搜索服务4核8G2ES搜索
评论服务2核4G2评论处理
互动服务2核4G2互动处理
消息服务2核4G2消息处理
AI服务4核8G2AI处理
MySQL4核16G2主从部署
MongoDB4核8G3副本集
Redis2核8G3集群部署
Elasticsearch4核16G3集群部署
RabbitMQ2核4G3集群部署

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-Aside1小时
视频详情Cache-Aside30分钟
热门视频Write-Through1小时
播放量计数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 系统特点 ​

  1. 微服务架构:服务独立部署,高可用、可扩展
  2. 多数据存储:MySQL + MongoDB + Redis + ES,各取所长
  3. 异步处理:RabbitMQ消息队列,提升响应速度
  4. 智能功能:AI摘要、语音识别,提升用户体验
  5. 实时互动:弹幕系统,增强学习互动性

14.2 未来改进方向 ​

改进方向说明
分布式事务引入Seata,保证数据一致性
服务网格引入Istio,提升服务治理能力
容器编排Kubernetes部署,弹性伸缩
智能推荐机器学习算法,个性化推荐
边缘计算CDN加速,提升访问速度

附录 ​

附录A:技术术语表 ​

术语说明
微服务一种架构风格,将应用拆分为独立服务
Nacos阿里巴巴开源的服务注册与配置中心
GatewayAPI网关,统一入口、路由转发
OpenFeign声明式HTTP客户端,服务间调用
RabbitMQ消息队列,异步通信
Elasticsearch分布式搜索引擎
MongoDB文档型数据库
JWTJSON Web Token,无状态认证

附录B:参考文献 ​

  1. 《Spring Cloud微服务实战》
  2. 《微服务架构设计模式》
  3. 《Elasticsearch权威指南》
  4. 《MongoDB实战》
  5. Spring Cloud官方文档

文档结束