鉴于今年的同学们进度相比往常更快,因此我们将对之后要做的内容做一些调整
在本Lab中,你拥有以下两种选择
- 为fzuherlper-server解决一些issue(具体咨询学长)
- 完成以下内容
- 完成项目结构优化
- 掌握 WebSocket 原理与实践
- 掌握微服务架构和Web工作原理
- 掌握HTTP协议和RPC调度方法
- 完善文档
由于疫情封校了,FanOne和小哥哥们外出Happy的计划泡汤了,只能在宿舍一起网聊。她的小哥哥们提出和她一起在手机上看片,为了让FanOne和她的小哥哥们可以快乐看片,请你写一个基于微服务架构的视频网站 (使用Kitex),让FanOne能够享受封校生活!
请遵照以下接口文档完成功能(你不需要完成其中的社交模块,但需要实现websocket)
- 对于参加了字节跳动青训营的同学,你不必完成以上的全部功能,以下是完成本次作业的最低要求
| 模块名 | 最低需要完成的接口 | 数量 |
|---|---|---|
| 用户 | 注册、登录、用户信息、上传头像 | 4 |
| 视频 | 投稿、发布列表、搜索视频、热门排行榜 | 4 |
| 互动 | 点赞操作、点赞列表、评论、评论列表、删除评论 | 5 |
| 社交 | 聊天 | 1 |
- 未参加字节跳动青训营的同学,本次你需要完成新增需求
| 模块名 | 最低需要完成的接口 | 数量 |
|---|---|---|
| 用户 | 获取 MFA qrcode、绑定 MFA | 2 |
| 视频 | 视频流 | 1 |
| 互动 | 0 | |
| 社交 | 聊天 | 1 |
以下需求是所有同学都要完成的
- 互动模块:评论接口需要实现对评论进行评论(即支持 comment_id 请求字段)
- 互动模块:点赞接口需要处理对评论的点赞
- 社交模块:完成基于 websocket 的聊天功能,考虑到聊天的实时性,请使用 Redis + MySQL 方式实现
Hertz 框架内置 WebSocket 实现,请使用 Hertz 内置的 WebSocket(文档)
鉴于大家的进度比较超出预期,本次要求大家对项目使用微服务架构
如果你还不了解微服务架构,可以阅读这篇文章微服务架构 Intro
此外,大家还需对比单体架构和微服务架构,引入微服务后会带了什么优缺点(解决单点故障,带来一致性问题等等),并在报告文档中体现出来。
服务注册与发现是一种机制,用于管理和维护微服务架构中各个服务的地址和元数据的组件。
通过服务注册与发现,可以动态地发现和调用其他微服务,从而简化了系统的管理和维护。
在这一轮中,你需要在你的项目中实现服务注册和发现
目录结构一定程度上决定了其他人理解你项目的难易程度,如果你的项目具有目录结构的提升可能性,请优化你的目录结构(请重点关注这一点)
如果你上一个项目的目录树不是用tree生成的,请使用tree命令来生成目录树(不需要精确到每一个文件,只需要到目录,以及一些关键文件)
首先,请修改你这个项目的仓库权限——要求所有人不能直接推送到 main 分支(请注意,如果你仍然在使用 master 分支,立即改为 main 分支作为主分支)
接下来,以及未来的所有代码变更中,使用 Pull Request(pr)完成,即使这个项目目前仍然只有你一个人维护
在这过程中,请注意 pr 的规范性,你可以自己给自己拟定一套规范,也可以参考一些开源社区的规范
尤其是需要注意 pr 的标题,尽可能的保证可以通过标题直接知道你这个 pr 做了什么,但 pr 的标题不宜过长
我们会检查你的 pr 记录(不会检查时间,放心,可以在合适的时间范围内赶 deadline)
你还需要保证你的项目具备下述文件:
.gitignore:如果你项目有一些无关数据,请使用 gitignore 忽略掉,下一次答辩会检查各位的仓库干净程度.dockerignoer:与上一个类似,但是目的是为了减少打包过程中的无关数据.editorconfig:EditorConfig有助于为跨各种编辑器和 IDE 处理同一项目的多个开发人员维护一致的编码风格。.gitattributes:用于指定 Git 应该如何对待特定文件或路径中的文件
你需要自行利用搜索引擎完成这几个文件的简单学习
你的项目需要引入 Github Action 工作流(Github Action 快速入门)
要求至少实现以下几点:
- 漏洞扫描:CodeQL(关于使用 Code QL 进行代码扫描)
- 代码规范:golangci-lint(Introduction - golangci-lint)
其中,golangci-lint 是一个静态代码扫描检查工具,它有本地的 cli(命令行)帮助你快速找到哪些地方的代码不合规范,规范是一个合格的软件工程师必备的技能,因此你需要
- 较为熟悉的使用 golangci-lint
- 在你项目的根目录中添加一个
.golangci.yml文件,这个文件将会指定静态检查的严格程度(使用教程) - 在下一次答辩中,你需要说明你的这份配置文件开启了哪些检查,开启过少的检查是不合适的
不要直接套用现成的配置,你需要知道workflow的配置内容,答辩时会对你简单了解一下
我们鼓励你使用飞书文档来提升文档编写的效率
- 对于所有使用了缓存(如 Redis )的接口,请在文档中绘制一份流程图(这很简单)来描述接口运作原理
- 对于所有使用了消息队列的接口,同上
- 将这份飞书文档粘贴到你项目的
README.md上
自己编写接口的流程图,有助于我们快速了解整个流程,同时也有助于你自己发现这个流程中的问题(如有)
同时,请检查你的README.md文件,如果可能,可以做一些文档拆分(在根目录建立一个docs文档目录,里面存放子文档),README.md应该是尽可能的简单描述这个项目
最后,请提供一个部署文档在仓库中(可以写在 README.md),告诉用户你的项目应当如何部署到服务器(请注意这个需求,这隐含着一个要求:你的项目自己部署到服务器上过)
由于今年加快了进度,为了保证各位同学能够跟上,请大家从项目初期就写一个自用的记录,在项目中期时我们会组织一到两场会议来确认各位同学的进度
单测是很重要的(这里省略 20000 个字),虽然这和性能优化无关,但是你仍然需要为你的项目添加一定的单元测试
你可以简单的进行单元测试入门(Golang 单元测试指引 | 腾讯技术工程、Golang 单元测试合集整理)
Hertz 同样也提供了单元测试能力(单测 | CloudWeGo)
你必须对你的项目添加一定量的单元测试(考虑大家能力、时间不同,不要求全部完成)
请在报告中提供:
- 单元测试覆盖率(可以使用 go 自带的
go test命令行工具获取单元测试覆盖率) - 哪些部分使用了单元测试
- 你的项目该如何进行单元测试
你需要在报告的结尾添加你的单元测试学习笔记.
我们很少硬性规定一定要写笔记,但是这部分请认真对待,你可以写自己对单元测试的理解、go test 命令行工具的了解等。
字数不限,不需要贴很多字,不需要套话(写的笔记人能看得懂就行),但是请保证是自己的产出。
请独立一个 config 文件夹,并内置一个config.yaml(请勿使用 ini),该文件负责一些常量的配置,要求支持配置热更新
可以使用 Viper 库(spf13/viper)
同时,为了方便我们检查你的数据库结构,请在 config 文件夹内新建一个 sql 文件夹,在该文件夹内储存你数据库的建表语句(如init.sql)
你需要编写一份报告用于答辩(使用飞书文档),在项目提交时提交(可以先提交文档链接,后续继续优化文档),不限制报告格式、内容,但需要拥有以下内容
- (Problem Restatement)问题重述:用最简短的话复述你这次需要完成的内容
- (問題が解決しました)问题解决:使用打勾(复选框)来示意你全部完成的内容,对于部分完成的内容,请不要打勾,而是描述你目前已经完成的内容
- (如有)(Spotlight)项目亮点:这部分不是必须的,如果你认为你的项目有一些巧思,请写上
- (如有)(Advancement)进阶:超出文档需求的完成量,比如实现了部分Bonus 内容,则在这部分描述
- (如有)(Argument)抱怨:你对这个文档存在的不足的抱怨,请尽量写,不要害羞,最好不要写个无
- 请考虑你的聊天系统的性能(例如使用Benchmark测试)
- 考虑聊天传输的安全性(可以学习一下Telegram是如何保证传输安全性的,但是现阶段是做不到的,可以尝试做一些小的安全性优化)
- 使用消息队列(RabbitMQ、RocketMQ、Kafka等)
- 使用缓存(如redis)
- 优化并发
- 优化数据库
常见的RPC框架
| 公司 | 名称 | 地址 |
|---|---|---|
| 谷歌 | grpc-go | https://github.com/grpc/grpc-go |
| 七牛 | go-zero | https://github.com/zeromicro/go-zero |
| Bilibili | Kratos | https://github.com/go-kratos/kratos |
| 字节跳动 | Kitex | https://github.com/cloudwego/kitex |
| Apache | Dubbo | https://github.com/apache/dubbo-go |
| 腾讯 | Tars | https://github.com/TarsCloud/TarsGo |
| 斗鱼 | jupiter | https://github.com/douyu/jupiter |
建议学习一些资料较为完善的RPC框架,比如grpc-go,这里不推荐go-micro,因为国内用的少且版本比较混乱。
| 标题 | 地址 |
|---|---|
| Google API 设计指南 | https://cloud.google.com/apis/design |
| 如何才能更好的学习MIT 6.824? | https://zhuanlan.zhihu.com/p/110168818 |
| MIT 6.824课程中文学习资料 | https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/ |
| Sorosliu1029/6.824 | https://github.com/Sorosliu1029/6.824 |
| 字节跳动自研高性能微服务框架Kitex的演进之旅 | https://juejin.cn/post/7098631562232594462 |
| RPC框架Kitex实践入门:性能测试指南 | https://juejin.cn/post/7033972008257847304 |
| 高性能RPC框架CloudWeGo-Kitex内外统一的开源实践 | https://juejin.cn/post/7148688078083915807 |
| [译] Go 语言的整洁架构之道 —— 一个使用 gRPC 的 Go 项目整洁架构例子 | https://juejin.cn/post/6844903687463108616 |
| 写给go开发者的gRPC教程-protobuf基础 | https://juejin.cn/post/7191008929986379836 |
| go基于grpc构建微服务框架-服务注册与发现 | https://juejin.cn/post/6844903593758162958 |
| 《gor入门grpc》第一章:什么是gRPC | https://segmentfault.com/a/1190000043343832 |
| Raft算法动画演示 | https://github.com/klboke/raft-animation |
当然,这里面只列举了一部分内容,微服务的资料网上非常非常的多