个人简介
lips,一名普普通通的本科大三学生,专业是软件工程,大学以来参加过两次项目开发,分别是字节跳动青训营的极简版抖音项目和七牛云1024创作节的网页短视频项目,在这两个项目中,我都是负责后端代码的编写,使用的是Go语言,但是都没有涉及到微服务和go-zero的使用。
学习目标(为什么要参与这个项目)
- 学习新的知识,主要就是学习微服务以及框架
go-zero。 - 增加项目经验,丰富自己的简历,为以后找工作打下基础。
- 和训练营内部各位前辈一起写项目,增长见识。
学习方法
- 看教学视频和文档(
go-zero、环境搭建) - 效仿阳哥写好的代码写新功能(开发抽奖功能)
1024code的AI编程助手(遇到不理解的错误)
学习经验
如何搭建环境(参考文档)
采用docker技术,简洁高效快速安全。由于以前使用过,省去了下载这一步骤。
- 创建一个Docker网络。通过将容器连接到同一个网络,可以在容器之间建立通信通道进行相互通信,而且不需要暴露它们的端口给外部网络。
docker network create go-zero-looklook_looklook_net
- 使用 Docker Compose 来启动一个基于指定配置文件的容器化环境。
-f参数用于指定要使用的配置文件,这里是docker-compose-env.yml。up命令用于创建并启动容器,根据配置文件中定义的服务和容器规范来创建和运行容器。-d参数用于在后台运行容器,即以守护进程模式运行容器,使其在后台持续运行。
docker-compose -f docker-compose-env.yml up -d
- 在 Kafka 中创建主题(topic)。
$ docker exec -it kafka /bin/sh //进入kafka容器,启动一个交互式的shell
$ cd /opt/kafka/bin/ //切换到了kafka安装目录下的bin目录
创建一个名为 "looklook-log" (日志收集)的主题和一个名为 "payment-update-paystatus-topic"(支付成功通知所有订阅者)的主题。
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic looklook-log
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic payment-update-paystatus-topic
- 在 MySQL 容器中执行命令来修改 MySQL 用户的权限和配置。
docker exec -it mysql mysql -uroot -p
(进入名为 "mysql" 的容器,并以 root 用户身份连接到 MySQL 数据库。)
****
(输入密码,完成身份验证。)
use mysql;
(切换到 MySQL 数据库。)
update user set host='%' where user='root';
(修改 root 用户的主机(host)为 `%`,表示允许 root 用户从任意主机连接到 MySQL。)
FLUSH PRIVILEGES;
(刷新 MySQL 的权限表,使修改后的权限生效。)
- 考虑依赖可能会比较大,会影响启动项目,所以最好先把这个镜像拉取下来再去启动项目
docker pull lyumikael/gomodd:v1.20.3
- 最后就是启动项目。
docker-compose up -d
我在搭建环境的时候比较顺利,没遇到什么问题,一次就跑通了。
怎么开发功能(参考已有代码)
跑通项目后,阳哥就给我分配了一个任务:发布抽奖的接口。虽然逻辑比较简单,就是一个更新抽奖的publish_time的功能,但是让我学到了开发的基本流程,我也试着把他们写下来了。
团队协作
通过本次项目,我接触到了 git 技术、codeup 平台以及云效工具,这让我对团队项目开发流程有了更深入的了解,也提前熟悉了企业开发模式。
遇到的问题
阳哥第一次给我review代码就发现了不少的错误,也让我从中学到了很多。
1. 修改了app/lottery/model/lotteryModel_gen.go 文件
之前操作失误,导致引用了genModel.ErrNotFound
2. app/lottery/cmd/api/internal/types/types.go 文件中的字段定义错误
(1)UpdateLotteryReq 和 CreateLotteryResp 中 Id 的类型为int,修改成int64
修改方法: 在lottery.api文件中修改,然后使用goctl自动生成
(2)不应该设置PublishTime字段,前端不需要传递这个字段,直接设置为当前时间即可
3. app/lottery/cmd/rpc/internal/logic/updateLotteryLogic.go 文件中不应该使用事务
事务是什么?
事务是一组数据库操作的执行单元,它要么完全执行,要么完全回滚。事务可以确保数据库操作的一致性和可靠性。
什么时候使用事务?
- 当需要执行一系列数据库操作时,要么全部成功,要么全部回滚,以确保数据的一致性。
- 当多个并发操作需要访问和修改相同的数据时,使用事务可以确保数据的隔离性,避免并发操作导致的数据冲突和不一致。
- 当需要执行复杂的业务逻辑,涉及多个数据库表的操作时,使用事务可以确保操作的原子性,避免部分操作成功而导致数据不一致。