一、项目介绍
- 项目核心信息:基于MySQL+Gorm+Hertz实现的极简版抖音后端服务
- 项目服务地址:example.com
- Github地址:github.com/your-repo
二、项目分工
-
团队成员:
- 组长:李昌家,负责项目管理、技术选型、系统设计和开发任务分配等
- 组员1:胡旭旭,负责开发视频投稿功能和喜欢列表功能,负责开发视频Feed流功能和用户评论功能
- 组员2:xxx,负责开发个人主页功能和关系列表功能
三、项目实现
3.1 技术选型与相关开发文档
我们选用了Mysql数据库,Gorm ORM,Hertz和Kitex框架作为项目的主要技术栈,相关文档见:
Mysql: www.mysqlzh.com/
Gorm: gorm.io/docs/
Hertz: www.cloudwego.io/zh/docs/her…
Kitex: www.cloudwego.io/zh/docs/kit…
3.2 架构设计
可以补充场景分析环节,明确要解决的问题和前提假设,比如预计0.5%的用户属于大V,粉丝很多,也会经常上传视频,当前架构的解决方案是xxx。
整体采用微服务架构,客户端发送http请求到Hertz-Server中,然后Hertz-Server中建立起Kitex-Client向Kitex-Server发送rpc请求,Kitex-Server中提供对应的服务。
3.3 项目代码介绍
项目主要的目录结构如下:
Cmd中存放项目的主要运行代码,idl存放Kitex生成代码所对应的申明文件,kitex_gen是kitex的生成代码存放存放目录,pkg里面装一些工具类,pprof是测试用的。
项目的主要运行代码目录结构如下:
Api中实现请求路由的代码,并且其中实现了视频上传的功能。Interact是交互服务,主要实现了评论列表,评论操作,点赞列表,点赞操作。Social是社交服务,主要实现了关注操作,关注与被关注列表,好友列表以及消息操作和消息列表。User是用户服务,主要实现了用户信息,用户注册和用户登录。Video是视频服务,主要实现了视频流推荐和视频列表的功能。
其中比较重要的代码有:
上传视频的操作:主要是将视频上传到minio,并将其路径保存到mysql数据库中,并利用ffmpeg的命令行操作生成对应视频的封面,然后也将其上传到minio,路径记录在mysql数据库中。
用户密码的加密存储功能:
用户注册时,我们是利用golang自带的bcrypt包中的方法将密码加密存储到数据库,然后在登录时我们再用bcrypt包中的比较方法来比对密码是否正确。
数据库操作的协程并发实现
我们发现运行时间较长的往往是数据库操作,所以我们对其进行加工,将连续并且无关的数据库操作利用goroutine协程来实现并发操作,这样能减少数据库操作的耗时。
四、测试结果
1、功能测试
我们对项目的所有功能进行了测试,包括视频 Feed 流、视频投稿、个人主页、喜欢列表、用户评论、关系列表和消息等。在测试过程中,我们发现了以下问题并进行了修复:
- 在视频 Feed 流中,未登录用户可以查看所有用户的视频,存在隐私泄露的风险。我们修复了这个问题,现在只有登录用户才能查看视频。
- 在喜欢列表中,点赞和取消点赞操作之间存在延迟,会导致用户点赞和取消点赞的状态不一致。我们通过优化程序逻辑,解决了这个问题。
- 在用户评论中,用户可以发表包含敏感词汇的评论,这对用户造成不必要的骚扰。我们增加了敏感词过滤功能,防止用户发表包含敏感词汇的评论。
- 在关系列表中,用户可以重复关注同一用户,导致关注列表和粉丝列表中出现重复的用户。我们在关注操作时进行了去重处理,避免了这个问题的发生。
- 在消息中,用户可以向自己发送消息,这不符合实际需求。我们增加了判断逻辑,禁止用户向自己发送消息。
进行了各种接口的功能测试,数据库数据如下。
4.2 性能测试
我们对项目进行了性能测试,主要包括以下内容:
①压力测试:
通过使用 Apache JMeter 工具模拟多用户同时访问项目,测试系统的并发性能。测试结果显示,在 1000 个并发用户下,项目响应时间仍能保持在 200ms 以内,且无任何异常。
②数据库性能测试:
我们使用 sysbench 工具测试了数据库的读写性能和连接数性能。测试结果显示,数据库在高并发下能够保持稳定,读写性能良好,连接数性能优秀。在进行数据库性能测试时,我们主要测试了以下内容:
- 数据库读写速度:测试系统在高并发情况下数据库的读写速度。
数据库性能测试结果如下:
| 测试项目 | 测试结果 |
|---|---|
| 数据库读写速度 | 在高并发情况下,数据库的读写速度表现稳定 |
可优化点:
- 可以考虑采用数据库分库分表等技术,以提高数据库的读写性能。
③稳定性测试:
我们通过模拟网络抖动、服务器宕机等异常情况,测试了项目的稳定性和容错能力。测试结果显示,项目能够良好地应对这些异常情况,并及时进行自我修复和恢复,确保了系统的稳定性和可用性。我们进行以下测试:
压力测试
压力测试是通过在高负载条件下对系统进行测试来检查其稳定性和可靠性的一种测试。我们将使用Apache JMeter来模拟多个用户同时访问应用程序,并观察应用程序的行为。我们将测试以下方面:
- 视频Feed流:在同时访问应用程序的用户数量增加时,视频Feed流是否能够稳定地提供服务。
- 视频投稿:在同时访问应用程序的用户数量增加时,视频投稿功能是否能够稳定地提供服务。
- 用户评论:在同时访问应用程序的用户数量增加时,用户评论功能是否能够稳定地提供服务。
- 喜欢列表:在同时访问应用程序的用户数量增加时,喜欢列表功能是否能够稳定地提供服务。
- 关系列表:在同时访问应用程序的用户数量增加时,关系列表功能是否能够稳定地提供服务。
- 消息:在同时访问应用程序的用户数量增加时,消息功能是否能够稳定地提供服务。
我们将使用Apache JMeter来模拟100个并发用户,并进行10分钟的测试。测试结果将包括响应时间、错误率和吞吐量。
内存泄漏测试
内存泄漏是指应用程序中的内存不断增加,但没有释放的现象。这可能导致应用程序崩溃或变慢。我们将使用Golang官方提供的工具pprof来检测应用程序中的内存泄漏问题。
我们将在应用程序启动后,让其运行一段时间,然后使用pprof来检测内存使用情况。如果发现内存泄漏问题,我们将调查并修复它们。
日志监控
在生产环境中,日志监控是保证应用程序稳定性的重要手段。我们将使用ELK(Elasticsearch + Logstash + Kibana)来监控应用程序的日志,并及时发现和解决问题。
ELK是一个开源的日志管理平台,它可以收集、存储、搜索和可视化各种类型的日志数据。我们将配置应用程序将日志输出到标准输出,并使用Logstash来收集和处理这些日志数据,最后将它们存储在Elasticsearch中。我们将使用Kibana来搜索和可视化日志数据。
通过日志监控,我们可以发现并解决应用程序中的错误和异常。
4.3 可优化点
在测试过程中,我们发现了一些可优化点,包括:
- 优化视频 Feed 流的加载速度和稳定性,确保用户可以快速、流畅地浏览视频。
- 优化数据库读写性能,提高系统的响应速度和并发能力。
- 增加系统的容错性和可用性,提高系统的稳定性和可靠性。
五、Demo 演示视频
file:///C:/Users/Ng%0Cf%EF%BF%BD[/Desktop/%EF%BF%BDb%EF%BF%BDy%EF%BF%BD%EF%BF%BDv.mp4
六、项目
1.目前仍存在的问题
虽然我们在测试和修复过程中已经解决了许多问题,但是项目仍然存在一些问题,需要进一步的改进:
1.1 用户体验不够流畅 在一些场景下,如视频加载、评论提交等操作,用户可能会遇到卡顿或等待时间过长的情况,这对用户体验造成了一定影响。我们需要进一步优化系统的性能,提高用户体验。
1.2 安全性仍有提升空间 尽管我们增加了敏感词过滤功能和登录认证等措施,但是系统仍存在一些安全风险,如用户密码安全、SQL注入等问题,需要进一步的安全加固。
1.3 功能不够完善 虽然我们已经实现了视频投稿、用户关系等核心功能,但是还有许多功能没有完全实现,如用户私信、搜索、推荐等功能,需要进一步的开发和完善。
2.已识别出的优化项
在测试和优化过程中,我们已经识别出了一些优化项,包括:
2.1 性能优化 我们需要进一步优化系统的性能,提高响应速度和并发能力。具体包括数据库读写性能优化、系统负载均衡优化等。
2.2 安全加固 我们需要进一步加固系统的安全性,如加强用户密码安全、防范SQL注入攻击等。
2.3 功能完善 我们需要进一步完善系统的功能,如增加搜索、推荐、私信等功能,提高系统的用户体验和交互性。
3.架构演进的可能性
我们认为,随着用户量的增加和功能的扩展,项目的架构需要不断演进和升级。可能的演进方向包括:
3.1 微服务架构 当系统规模变大时,我们可以将不同的功能模块拆分成不同的服务,采用微服务架构来提高系统的可维护性和可扩展性。
3.2 云原生架构 云原生架构是一种利用云计算和容器技术构建、运行、管理应用程序的架构。当系统规模达到一定级别时,我们可以考虑采用云原生架构来提高系统的弹性和可靠性。
4.项目过程中的反思与总结
在这个项目中,我们经历了需求分析、设计、开发、测试、上线等多个阶段,学习和掌握了许多软件开发的技术和方法。在此过程中,我们也遇到了许多问题和挑战,总结反思如下:
4.1 需求分析和设计阶段非常重要 在项目开始之前,我们需要进行充分的需求分析和设计,以确定项目的目标、范围和功能,以及技术选型和架构设计。这个阶段的质量对后续的开发和测试至关重要。
4.2 团队协作和沟通非常关键 在项目开发过程中,团队成员之间的协作和沟通非常重要,需要及时解决问题、分享经验和信息,以保证项目的顺利进行和高质量的交付。
4.3 测试和优化也是项目成功的关键 在开发阶段之后,测试和优化也是非常关键的。测试可以帮助我们发现和解决问题,优化可以提高系统的性能和用户体验,以满足用户的需求和期望。
4.4 不断学习和更新技术知识 软件开发是一个快速发展和不断变化的领域,我们需要不断学习和更新技术知识,以跟上时代的步伐并提高自己的技能和竞争力。
总之,这个项目让我们学到了很多,也发现了许多不足之处。我们将在今后的工作中不断完善自己,提高自己的技能和能力,为用户提供更好的服务和体验。