微服务版、Java实现
本仓库是字节青训营的官方项目,开发文档参考《在线接口文档分享》以及字节官方提供的《极简版抖音App使用说明-青训营版》
系统整体架构图如下图所示:
需要使用的项目中间件全部使用docker部署到了服务器中
- 使用主流的微服务架构进行开发,降低项目的耦合度;
- 代码风格参考《Java开发手册(黄山版)》进行开发,符合大厂开发规范;
- 使用Sharding-JDBC进行数据层的读写分离+分库分表,提升数据库的性能;
- 引入Seata解决分布式事务问题,加强程序的健壮性;
- 引入安全性更高的KDF算法加强用户登录注册的验证环节,防止用户密码被暴力破解或者出现彩虹表攻击;
- RabbitMQ实现流量削峰,提高系统的可用性;
- 使用存储默认值的形式解决缓存穿透问题
- 缓存过期值随机打散+Sentinel限流缓解缓存雪崩问题
- 多种模式的缓存同步方案:
- 同步双写:实时性高的信息同步更新
- 异步通知:RabbitMQ异步更新缓存
- 后台监听MySQL日志,实时更新缓存
- 多种模式的
Feed
流,降低推荐视频的延迟:- 热点用户:投稿作品使用拉模式,不主动更新
- 普通用户:投稿时使用推模式将作品推送到粉丝的收件箱中
- 实现父子模式的评论,前端显示带层级结构,延迟推送所有的子评论列表
- 。。。
项目中涉及到的交换机和队列以及对应的RoutingKey
如下图所示:
需要注意的是,项目中专门定义了一个交换机和队列来接收超过重试次数的消息集中进行处理
整个项目的结构如下:
tiktok:.
├─common
│ └─src
│ ├─config
│ ├─constant
│ ├─exception
│ ├─feign
│ │ └─fallback
│ ├─result
│ └─utils
├─gateway
│ └─src
│ │ ├─config
│ │ └─filter
│ └─resources
├─resource
│ ├─img
│ └─static
│ ├─cover
│ └─video
├─user-service
│ └─src
│ │ ├─config
│ │ ├─controller
│ │ ├─dto
│ │ ├─entity
│ │ ├─interceptor
│ │ ├─listener
│ │ ├─mapper
│ │ └─service
│ │ └─impl
│ └─resources
└─video-service
└─src
│ ├─config
│ ├─controller
│ ├─dto
│ ├─entity
│ ├─interceptor
│ ├─listener
│ ├─mapper
│ └─service
│ └─impl
└─resources
下载本项目后,需要在各个微服务模块的application.txt
的后缀名换成.yml
,之后将每个中间件对应的地址替换成自己需要的,然后加上腾讯云cos需要的配置项,例如:
# videoservice中腾讯云上传文件的配置
tencent:
cos:
secretId: yourSecertId
secretKey: yourSecretKey
bucketName: yourBucketName
region: ap-beijing
# userservice中腾讯云发送短信的配置
tencent:
sms:
secretId: yourSecretId
secretKey: yourSecretKey
endpoint: yourEndpoint
region: yourRegion
sdkAppId: yourSdkAppId
signName: yourSignName
templateId: yourTemplateId
signMethod: "HmacSHA256"