# NexPlay-高并发流媒体互动社区 **Repository Path**: bu-jianwu/nexplay ## Basic Information - **Project Name**: NexPlay-高并发流媒体互动社区 - **Description**: 基于 Spring Cloud Alibaba 微服务架构实现的高并发 UGC 视频社区平台,包含视频上传、转码、搜索、推荐、弹幕、评论、关注等核心能力。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-03-31 - **Last Updated**: 2026-07-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NexPlay - 高并发流媒体互动社区 > 基于 Spring Cloud Alibaba 微服务架构的流媒体平台,类似 Bilibili 的视频互动社区 ![Spring Cloud](https://img.shields.io/badge/Spring%20Cloud-2021.0-green) ![Vue](https://img.shields.io/badge/Vue-3.x-blue) ![License](https://img.shields.io/badge/License-MIT-yellow) ## 📖 项目简介 NexPlay 是一个高并发流媒体互动社区平台,采用前后端分离架构,后端基于 Spring Cloud 微服务,前端基于 Vue 3 + Element Plus。项目实现了视频上传播放、弹幕互动、实时聊天、消息通知、全文搜索等核心功能,覆盖了流媒体平台的主要业务场景。 ## ✨ 技术亮点 - **微服务架构**:6 个独立微服务,服务拆分清晰,支持独立部署和扩展 - **高并发优化**:Redis 缓存 + 布隆过滤器 + XXL-JOB 异步同步,支持高并发读写 - **搜索引擎**:Elasticsearch 全文检索 + MoreLikeThis 推荐算法 - **异步解耦**:RocketMQ 消息队列实现数据库与 ES 的异步同步 - **分片上传**:大视频分片上传,支持断点续传 - **实时通信**:WebSocket 实现弹幕和聊天,AI 助手对话功能 - **容错机制**:ES 查询降级策略,保证系统高可用性 - **链路追踪**:Zipkin 全链路监控,服务调用可视化 - **指标监控**:Prometheus + Micrometer 全服务指标采集,23 个自定义埋点指标 ## 技术栈 ### 后端 - **Spring Cloud Alibaba** - 微服务框架 - **Nacos** - 服务注册与配置中心 - **Spring Cloud Gateway** - 网关服务 - **MyBatis Plus** - 持久层框架 - **Redis** - 缓存、Session、布隆过滤器 - **Elasticsearch** - 全文搜索引擎 - **RocketMQ** - 异步消息队列 - **MinIO** - 分布式对象存储 - **Zipkin + Sleuth** - 全链路追踪 - **Prometheus + Micrometer** - 服务监控与指标采集 - **WebSocket** - 实时双向通信 - **XXL-JOB** - 分布式定时任务 - **JWT** - 无状态认证 ### 前端 - **Vue 3** - 响应式前端框架 - **Element Plus** - UI 组件库 - **Vite** - 前端构建工具 - **Vue Router** - 路由管理 - **Pinia** - 状态管理 - **Axios** - HTTP 请求库 ## 🎯 核心技术点 | 技术领域 | 实现方案 | | -------- | --------------------------------------- | | 微服务 | Spring Cloud + Nacos + Gateway | | 服务调用 | OpenFeign + Ribbon 负载均衡 | | 高并发 | Redis 缓存 + 布隆过滤器防穿透 | | 异步处理 | RocketMQ 异步消息 + XXL-JOB 定时任务 | | 全文搜索 | Elasticsearch + MoreLikeThis 推荐算法 | | 文件存储 | MinIO 分片上传 + 断点续传 | | 实时通信 | WebSocket 弹幕 + 聊天室 | | 安全认证 | JWT + Spring Security | | 链路追踪 | Zipkin + Sleuth 全链路监控 | | 指标监控 | Prometheus + Micrometer 自定义埋点 | | 性能分析 | Histogram 分位数统计(P50/P90/P95/P99) | | 降级容错 | ES 查询失败自动降级普通模式 | | 数据同步 | MySQL → ES 异步同步 | | 前端优化 | Vue 3 + Composition API + 路由懒加载 | ## 💡 项目难点与解决方案 ### 1. 高并发场景优化 - **问题**:视频推荐频繁查询 ES 导致性能瓶颈 - **方案**:Redis 缓存热点数据 + 布隆过滤器防止缓存穿透 + 降级策略保障可用性 ### 2. 大视频文件上传 - **问题**:单视频文件过大,网络不稳定易导致上传失败 - **方案**:前端分片上传 + 断点续传 + 后端分片合并 + MinIO 存储 ### 3. 数据一致性保障 - **问题**:MySQL 与 ES 数据同步存在延迟 - **方案**:RocketMQ 异步消息 + XXL-JOB 定时全量同步 + 手动刷新 ES 索引 ### 4. 前后端字段映射 - **问题**:微服务间通过 Feign 调用,字段不一致导致数据丢失 - **方案**:使用 `@JsonProperty` 注解统一字段映射 + VO 层数据转换 ### 5. WebSocket 弹幕实时性 - **问题**:高并发弹幕消息处理延迟 - **方案**:WebSocket 长连接 + 事件驱动 + 异步消息处理 ### 6. 微服务全链路可观测性 - **问题**:多服务分布式部署,缺乏统一的性能指标和异常监控 - **方案**:Actuator 暴露 `/metrics` 端点 + Micrometer 自定义埋点(Counter/Timer/Gauge) + Gateway 全局过滤器 + AOP 切面零侵入采集 + Prometheus 定时抓取 + Grafana 可视化仪表盘 ## 项目结构 ``` NexPlay/ ├── gateway/ # 网关服务 (端口: 8200) ├── user_center/ # 用户中心 (端口: 3000) ├── video/ # 视频服务 (端口: 10201) ├── chat/ # 聊天服务 (端口: 1688) ├── notice/ # 通知服务 (端口: 30000) ├── search/ # 搜索服务 (端口: 8201) ├── common/ # 公共模块 └── vue/NexPlay-vue/ # 前端项目 ``` ## 环境准备 ### 必需服务 1. **MySQL** - 数据库服务 2. **Redis** - 缓存服务 3. **Nacos** - 服务注册中心 4. **Elasticsearch** - 搜索引擎 5. **Kibana** - ES 可视化 6. **RocketMQ** - 消息队列 7. **MinIO** - 对象存储 8. **Zipkin** - 链路追踪 9. **Prometheus** - 监控指标采集 10. **Grafana** - 可视化仪表盘 ### Docker 环境部署 ```bash # 启动基础服务 docker start es kibana rmqnamesrv rmqbroker # 同步虚拟机时间 chronyc makestep # 部署 Zipkin docker run -d --name zipkin --restart always -p 9411:9411 openzipkin/zipkin # 部署 Nacos docker run -d --name nacos --restart always \ -p 8848:8848 -p 9848:9848 -p 9849:9849 \ -e MODE=standalone \ -e JVM_XMS=256m -e JVM_XMX=256m \ nacos/nacos-server:v2.2.3-slim # 部署 RocketMQ NameServer docker run -d --name rmqnamesrv -p 9876:9876 \ -e "JAVA_OPT=-server -Xms64m -Xmx64m -Xmn32m" \ apache/rocketmq:4.9.4 sh mqnamesrv # 部署 RocketMQ Broker mkdir -p /root/rocketmq/conf cat > /root/rocketmq/conf/broker.conf << EOF brokerIP1=192.168.174.144 autoCreateTopicEnable=true namesrvAddr=192.168.174.144:9876 EOF docker run -d --name rmqbroker -p 10911:10911 \ --link rmqnamesrv \ -e "NAMESRV_ADDR=rmqnamesrv:9876" \ -v /root/rocketmq/conf/broker.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf \ apache/rocketmq:4.9.4 sh mqbroker # 部署 Prometheus mkdir -p /root/prometheus cat > /root/prometheus/prometheus.yml << 'EOF' global: scrape_interval: 15s scrape_configs: - job_name: 'nexplay' metrics_path: '/actuator/prometheus' static_configs: - targets: - '192.168.174.144:8200' # gateway - '192.168.174.144:3000' # user_center - '192.168.174.144:10201' # video - '192.168.174.144:1688' # chat - '192.168.174.144:30000' # notice - '192.168.174.144:8201' # search EOF docker run -d --name prometheus --restart always \ -p 9090:9090 \ -v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus # 部署 Grafana docker run -d --name grafana --restart always \ -p 3001:3000 \ grafana/grafana ``` ### MinIO 配置 ```bash # 创建存储桶并设置公开访问 mc anonymous set public myminio/user-cover mc anonymous set public myminio/video-cover mc anonymous set public myminio/video ``` ## 数据库配置 1. 创建 MySQL 数据库 `bilibili` 2. 修改各微服务的数据库连接配置: - 数据库地址 - 用户名 - 密码 ## Elasticsearch 索引 ### 1. 视频索引 (video) ```json PUT /video { "mappings": { "properties": { "video_id": { "type": "integer" }, "video_name": { "type": "text" }, "author_id": { "type": "integer" }, "author_name": { "type": "text" }, "intro": { "type": "text" }, "cover": { "type": "keyword" }, "url": { "type": "keyword" }, "length": { "type": "keyword" }, "play_count": { "type": "integer" }, "danmaku_count": { "type": "integer" }, "collect_count": { "type": "integer" }, "create_time": { "type": "date", "format": "yyyy-MM-dd'T'HH:mm:ss||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } ``` ### 2. 用户索引 (user) ```json PUT /user { "mappings": { "properties": { "id": { "type": "keyword" }, "nickname": { "type": "text" }, "intro": { "type": "text" }, "cover": { "type": "keyword" }, "fans_count": { "type": "integer" }, "video_count": { "type": "integer" } } } } ``` ### 3. 搜索历史索引 (history_search) ```json PUT /history_search { "mappings": { "properties": { "user_id": { "type": "keyword" }, "search_word": { "type": "text" }, "create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } ``` ## 📊 Prometheus 监控体系 ### 架构概览 ``` ┌─────────────┐ scrape ┌─────────────┐ visualize ┌──────────┐ │ NexPlay │ ───────────→ │ Prometheus │ ─────────────→ │ Grafana │ │ 微服务集群 │ /actuator/ │ (TSDB) │ │ (仪表盘) │ │ │ prometheus │ │ │ │ └─────────────┘ └──────────────┘ └──────────┘ ``` ### 指标清单 #### HTTP 请求层(AOP 切面自动采集,零侵入) | 指标名 | 类型 | 说明 | | --------------------------------------- | ------- | ------------------------------- | | `nexplay_http_requests_total` | Counter | Controller 请求总数 | | `nexplay_http_request_duration_seconds` | Timer | 请求耗时分布(P50/P90/P95/P99) | | `nexplay_http_request_errors_total` | Counter | 异常请求数 | #### 业务层(手动埋点) | 指标名 | 类型 | 说明 | | --------------------------------------- | ------- | -------------------- | | `nexplay_user_registrations_total` | Counter | 用户注册数 | | `nexplay_user_logins_total` | Counter | 用户登录数 | | `nexplay_video_uploads_total` | Counter | 视频上传数 | | `nexplay_video_views_total` | Counter | 视频播放数 | | `nexplay_comments_total` | Counter | 评论数 | | `nexplay_danmaku_total` | Counter | 弹幕数 | | `nexplay_likes_total` | Counter | 点赞数 | | `nexplay_collects_total` | Counter | 收藏数 | | `nexplay_follows_total` | Counter | 关注数 | | `nexplay_search_requests_total` | Counter | 搜索请求数 | | `nexplay_notice_sent_total` | Counter | 通知发送数 | | `nexplay_rocketmq_consumed_total` | Counter | RocketMQ 消费数 | | `nexplay_rocketmq_consume_errors_total` | Counter | RocketMQ 消费失败数 | | `nexplay_websocket_connections` | Gauge | WebSocket 实时连接数 | #### 网关层(GlobalFilter 自动采集) | 指标名 | 类型 | 说明 | | ------------------------------------------ | ------- | ------------------------------- | | `nexplay_gateway_requests_total` | Counter | 网关路由请求数 | | `nexplay_gateway_request_duration_seconds` | Timer | 网关路由耗时(P50/P90/P95/P99) | | `nexplay_gateway_errors_total` | Counter | 网关错误请求数(5xx) | > 此外还自动暴露 JVM 内存/GC/线程、CPU、Tomcat 线程池、HikariCP 连接池等系统级指标。 ### 指标端点 各服务启动后,Prometheus 抓取地址: | 服务 | 端口 | 抓取端点 | | ----------- | ----- | -------------------------------------------- | | gateway | 8200 | `http://localhost:8200/actuator/prometheus` | | user_center | 3000 | `http://localhost:3000/actuator/prometheus` | | video | 10201 | `http://localhost:10201/actuator/prometheus` | | chat | 1688 | `http://localhost:1688/actuator/prometheus` | | notice | 30000 | `http://localhost:30000/actuator/prometheus` | | search | 8201 | `http://localhost:8201/actuator/prometheus` | ### Grafana 仪表盘 登录 Grafana(`http://192.168.174.144:3001`,默认账号 admin/admin),添加 Prometheus 数据源后,可导入以下常用仪表盘: | 仪表盘 | ID | 说明 | | ------------------- | ------ | ------------------------ | | JVM Micrometer | 4701 | JVM 内存/GC/线程监控 | | Spring Boot 2.x | 11378 | Spring Boot 运行时监控 | | 自定义 NexPlay 面板 | 自定义 | 使用下方 PromQL 自行创建 | ### 常用 PromQL 查询 ```promql # 每秒请求速率(QPS) rate(nexplay_http_requests_total[1m]) # P99 请求延迟 histogram_quantile(0.99, rate(nexplay_http_request_duration_seconds_bucket[5m])) # 错误率 rate(nexplay_http_request_errors_total[1m]) / rate(nexplay_http_requests_total[1m]) # 视频播放速率(按分钟) rate(nexplay_video_views_total[1m]) # WebSocket 实时连接数 nexplay_websocket_connections # RocketMQ 消费失败率 rate(nexplay_rocketmq_consume_errors_total[5m]) / rate(nexplay_rocketmq_consumed_total[5m]) # 网关路由请求速率 rate(spring_cloud_gateway_requests_seconds_count[1m]) # JVM 堆内存使用率 sum(jvm_memory_used_bytes{area="heap"}) / sum(jvm_memory_max_bytes{area="heap"}) ``` ### 业务埋点使用示例 ```java @RestController public class VideoController { @Autowired private CustomMetricsService metricsService; @PostMapping("/play/recordPlay") public Result recordPlay() { metricsService.recordVideoView(); // 视频播放 +1 // 业务逻辑... return Result.success(); } @PostMapping("/comment/sendComment") public Result sendComment() { metricsService.recordComment(); // 评论 +1 // 业务逻辑... return Result.success(); } } ``` ### 关键组件说明 | 组件 | 文件 | 职责 | | ---------- | ------------------------------------------------- | ------------------------------------------- | | 指标常量 | `common/.../metrics/MetricsConstant.java` | 统一管理 20 个指标名和 6 个标签名 | | 配置类 | `common/.../metrics/PrometheusMetricsConfig.java` | commonTags 注入 + MeterFilter 过滤 | | 指标服务 | `common/.../metrics/CustomMetricsService.java` | 14 个业务 Counter + WS 连接数 Gauge | | AOP 切面 | `common/.../metrics/PrometheusMetricsAspect.java` | 自动拦截 @RestController 记录耗时/次数/错误 | | 网关过滤器 | `gateway/.../filter/GatewayMetricsFilter.java` | WebFlux GlobalFilter 网关级指标 | ## 服务配置 ### Gateway 网关 配置文件:`gateway/src/main/resources/application-dev.yml` 需要修改: - **邮件配置**:QQ 邮箱 SMTP 授权码 - **Nacos 地址**:服务注册中心地址 - **Zipkin 地址**:链路追踪地址 - **MySQL 配置**:数据库连接信息 ### 各微服务通用配置 - Nacos 服务注册地址 - MySQL 数据库连接 - Redis 连接配置 - Zipkin 追踪地址 - Prometheus Actuator 端点(已默认开启) ## 启动方式 ### 后端服务 ```bash # 1. 启动 Nacos # 2. 启动 MySQL、Redis、ES、RocketMQ、MinIO 等依赖服务 # 3. 按顺序启动微服务: # - gateway (8200) # - user_center (3000) # - video (10201) # - chat (1688) # - notice (30000) # - search (8201) # 4. 启动 Prometheus + Grafana(可选) ``` ### 前端项目 ```bash # 进入前端目录 cd NexPlay/vue/NexPlay-vue # 安装依赖 npm install # 启动开发服务器 npm run dev ``` ## 功能模块 ### 用户中心 (user_center) - 多方式登录(密码、手机号验证码、邮箱验证码) - JWT 双 Token 机制(短期 Token + 长期 Refresh Token) - 个人信息管理、头像上传 - 关注/粉丝关系管理(防重复关注校验) - 权限管理系统(RBAC) ### 视频服务 (video) - 视频分片上传(支持大文件、断点续传) - 视频播放(流式传输) - 弹幕系统(WebSocket 实时发送与展示) - 互动功能(点赞、收藏、评论、评论回复) - 播放历史记录(COALESCE 处理空值) - 创作者中心(视频管理、数据统计) ### 搜索服务 (search) - Elasticsearch 全文搜索(支持中文分词) - MoreLikeThis 推荐算法(基于内容的视频推荐) - 搜索历史记录(用户维度) - 降级容错机制(ES 不可用时降级普通查询) - 数据同步(RocketMQ 异步 + XXL-JOB 定时全量同步) ### 聊天服务 (chat) - WebSocket 实时聊天 - AI 智能助手(集成大模型 API) - PPT 生成功能 - 消息持久化与离线推送 ### 通知服务 (notice) - 消息通知推送(评论、点赞、关注) - RocketMQ 异步消息处理 - 通知状态管理(已读/未读) - 数据库变更监听与同步 ### 网关服务 (gateway) - 路由转发与负载均衡 - JWT 认证鉴权 - 邮件/短信验证码发送 - 全局异常处理 - 跨域配置 ## API 文档 启动 Gateway 服务后访问: ``` http://localhost:8200/doc.html ``` ## 上线图 ### 登录 ![登录](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_12.png) ### 首页 ![首页](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img.png) ### 视频详情页 ![视频详情页](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_2.png) ### 访问用户 ![访问用户](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_11.png) ### 聊天 ![聊天](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_10.png) ### 搜索 ![搜索](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_7.png) ### 个人中心 ![个人中心](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_8.png) ### 收藏视频 ![收藏视频](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_9.png) ### 设置 ![设置](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_4.png) ### 消息中心 ![消息中心](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_3.png) ### AI助手 ![AI助手](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_1.png) ### 观看历史 ![观看历史](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_5.png) ### 视频上传 ![视频上传](https://gitee.com/bu-jianwu/nexplay/raw/master/NexPlay/assets/img_6.png) ### 项目亮点总结 - ✅ 独立设计并实现 6 个微服务 - ✅ 完整的前后端分离架构 - ✅ 真实业务场景的高并发优化 - ✅ 多种中间件集成(Redis、ES、RocketMQ、MinIO、Nacos、Prometheus) - ✅ Prometheus + Micrometer 全服务监控,23 个自定义指标 - ✅ 完善的异常处理和容错机制 ## ⚠️ 注意事项 1. **时间同步**:MinIO 上传需要时间同步,使用 `chronyc makestep` 同步虚拟机时间 2. **邮件服务**:需配置 QQ 邮箱 SMTP 授权码 3. **ES 索引刷新**:批量写入后需手动刷新索引确保数据可见性 4. **文件上传**:前端接收文件名后需拼接 MinIO URL 5. **Nacos 配置**:各微服务需正确配置 Nacos 服务发现地址 6. **Prometheus 端点**:Gateway 已放行 `/actuator/**`,各微服务直接通过端口访问即可 ## 开发环境 - JDK 8+ - Node.js 16+ - Maven 3.6+ - Docker ## 许可证 本项目仅供学习交流使用。