Skip to content

Latest commit

 

History

History
210 lines (135 loc) · 13 KB

File metadata and controls

210 lines (135 loc) · 13 KB

Golang Lab5(2025)

鉴于今年的同学们进度相比往常更快,因此我们将对之后要做的内容做一些调整

在本Lab中,你拥有以下两种选择

  1. fzuherlper-server解决一些issue(具体咨询学长)
  2. 完成以下内容

目的

  • 完成项目结构优化
  • 掌握 WebSocket 原理与实践
  • 掌握微服务架构和Web工作原理
  • 掌握HTTP协议和RPC调度方法
  • 完善文档

背景

由于疫情封校了,FanOne和小哥哥们外出Happy的计划泡汤了,只能在宿舍一起网聊。她的小哥哥们提出和她一起在手机上看片,为了让FanOne和她的小哥哥们可以快乐看片,请你写一个基于微服务架构的视频网站 (使用Kitex),让FanOne能够享受封校生活!

任务

请遵照以下接口文档完成功能(你不需要完成其中的社交模块,但需要实现websocket)

https://doc.west2.online/

接口

  • 对于参加了字节跳动青训营的同学,你不必完成以上的全部功能,以下是完成本次作业的最低要求
模块名 最低需要完成的接口 数量
用户 注册、登录、用户信息、上传头像 4
视频 投稿、发布列表、搜索视频、热门排行榜 4
互动 点赞操作、点赞列表、评论、评论列表、删除评论 5
社交 聊天 1
  • 未参加字节跳动青训营的同学,本次你需要完成新增需求
模块名 最低需要完成的接口 数量
用户 获取 MFA qrcode、绑定 MFA 2
视频 视频流 1
互动 0
社交 聊天 1

以下需求是所有同学都要完成的

  1. 互动模块:评论接口需要实现对评论进行评论(即支持 comment_id 请求字段)
  2. 互动模块:点赞接口需要处理对评论的点赞
  3. 社交模块:完成基于 websocket 的聊天功能,考虑到聊天的实时性,请使用 Redis + MySQL 方式实现

Hertz 框架内置 WebSocket 实现,请使用 Hertz 内置的 WebSocket(文档

微服务

鉴于大家的进度比较超出预期,本次要求大家对项目使用微服务架构

如果你还不了解微服务架构,可以阅读这篇文章微服务架构 Intro

此外,大家还需对比单体架构和微服务架构,引入微服务后会带了什么优缺点(解决单点故障,带来一致性问题等等),并在报告文档中体现出来。

服务注册与发现(约 5h+ , 含学习及使用过程)

服务注册与发现是一种机制,用于管理和维护微服务架构中各个服务的地址和元数据的组件。

通过服务注册与发现,可以动态地发现和调用其他微服务,从而简化了系统的管理和维护。

在这一轮中,你需要在你的项目中实现服务注册和发现

目录结构

目录结构一定程度上决定了其他人理解你项目的难易程度,如果你的项目具有目录结构的提升可能性,请优化你的目录结构(请重点关注这一点

如果你上一个项目的目录树不是用tree生成的,请使用tree命令来生成目录树(不需要精确到每一个文件,只需要到目录,以及一些关键文件)

源代码管理

首先,请修改你这个项目的仓库权限——要求所有人不能直接推送到 main 分支(请注意,如果你仍然在使用 master 分支,立即改为 main 分支作为主分支)

接下来,以及未来的所有代码变更中,使用 Pull Request(pr)完成,即使这个项目目前仍然只有你一个人维护

在这过程中,请注意 pr 的规范性,你可以自己给自己拟定一套规范,也可以参考一些开源社区的规范

尤其是需要注意 pr 的标题,尽可能的保证可以通过标题直接知道你这个 pr 做了什么,但 pr 的标题不宜过长

我们会检查你的 pr 记录(不会检查时间,放心,可以在合适的时间范围内赶 deadline)

你还需要保证你的项目具备下述文件:

  1. .gitignore:如果你项目有一些无关数据,请使用 gitignore 忽略掉,下一次答辩会检查各位的仓库干净程度
  2. .dockerignoer:与上一个类似,但是目的是为了减少打包过程中的无关数据
  3. .editorconfig:EditorConfig有助于为跨各种编辑器和 IDE 处理同一项目的多个开发人员维护一致的编码风格。
  4. .gitattributes:用于指定 Git 应该如何对待特定文件或路径中的文件

你需要自行利用搜索引擎完成这几个文件的简单学习

持续集成(CI)

你的项目需要引入 Github Action 工作流(Github Action 快速入门

要求至少实现以下几点:

  1. 漏洞扫描:CodeQL(关于使用 Code QL 进行代码扫描
  2. 代码规范:golangci-lint(Introduction - golangci-lint

其中,golangci-lint 是一个静态代码扫描检查工具,它有本地的 cli(命令行)帮助你快速找到哪些地方的代码不合规范,规范是一个合格的软件工程师必备的技能,因此你需要

  1. 较为熟悉的使用 golangci-lint
  2. 在你项目的根目录中添加一个.golangci.yml文件,这个文件将会指定静态检查的严格程度(使用教程
  3. 在下一次答辩中,你需要说明你的这份配置文件开启了哪些检查,开启过少的检查是不合适的

不要直接套用现成的配置,你需要知道workflow的配置内容,答辩时会对你简单了解一下

文档编写

我们鼓励你使用飞书文档来提升文档编写的效率

  • 对于所有使用了缓存(如 Redis )的接口,请在文档中绘制一份流程图(这很简单)来描述接口运作原理
  • 对于所有使用了消息队列的接口,同上
  • 将这份飞书文档粘贴到你项目的README.md

自己编写接口的流程图,有助于我们快速了解整个流程,同时也有助于你自己发现这个流程中的问题(如有)

同时,请检查你的README.md文件,如果可能,可以做一些文档拆分(在根目录建立一个docs文档目录,里面存放子文档),README.md应该是尽可能的简单描述这个项目

最后,请提供一个部署文档在仓库中(可以写在 README.md),告诉用户你的项目应当如何部署到服务器(请注意这个需求,这隐含着一个要求:你的项目自己部署到服务器上过

由于今年加快了进度,为了保证各位同学能够跟上,请大家从项目初期就写一个自用的记录,在项目中期时我们会组织一到两场会议来确认各位同学的进度

单元测试

单测是很重要的(这里省略 20000 个字),虽然这和性能优化无关,但是你仍然需要为你的项目添加一定的单元测试

你可以简单的进行单元测试入门(Golang 单元测试指引 | 腾讯技术工程Golang 单元测试合集整理

Hertz 同样也提供了单元测试能力(单测 | CloudWeGo

你必须对你的项目添加一定量的单元测试(考虑大家能力、时间不同,不要求全部完成)

请在报告中提供:

  1. 单元测试覆盖率(可以使用 go 自带的 go test命令行工具获取单元测试覆盖率)
  2. 哪些部分使用了单元测试
  3. 你的项目该如何进行单元测试

你需要在报告的结尾添加你的单元测试学习笔记.

我们很少硬性规定一定要写笔记,但是这部分请认真对待,你可以写自己对单元测试的理解、go test 命令行工具的了解等。

字数不限,不需要贴很多字,不需要套话(写的笔记人能看得懂就行),但是请保证是自己的产出。

配置

请独立一个 config 文件夹,并内置一个config.yaml(请勿使用 ini),该文件负责一些常量的配置,要求支持配置热更新

可以使用 Viper 库(spf13/viper

同时,为了方便我们检查你的数据库结构,请在 config 文件夹内新建一个 sql 文件夹,在该文件夹内储存你数据库的建表语句(如init.sql

报告

你需要编写一份报告用于答辩(使用飞书文档),在项目提交时提交(可以先提交文档链接,后续继续优化文档),不限制报告格式、内容,但需要拥有以下内容

  1. (Problem Restatement)问题重述:用最简短的话复述你这次需要完成的内容
  2. (問題が解決しました)问题解决:使用打勾(复选框)来示意你全部完成的内容,对于部分完成的内容,请不要打勾,而是描述你目前已经完成的内容
  3. (如有)(Spotlight)项目亮点:这部分不是必须的,如果你认为你的项目有一些巧思,请写上
  4. (如有)(Advancement)进阶:超出文档需求的完成量,比如实现了部分Bonus 内容,则在这部分描述
  5. (如有)(Argument)抱怨:你对这个文档存在的不足的抱怨,请尽量写,不要害羞,最好不要写个无

Bonus

  1. 请考虑你的聊天系统的性能(例如使用Benchmark测试)
  2. 考虑聊天传输的安全性(可以学习一下Telegram是如何保证传输安全性的,但是现阶段是做不到的,可以尝试做一些小的安全性优化)
  3. 使用消息队列(RabbitMQ、RocketMQ、Kafka等)
  4. 使用缓存(如redis)
  5. 优化并发
  6. 优化数据库

参考

常见的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

当然,这里面只列举了一部分内容,微服务的资料网上非常非常的多