这是一个用 go-zero 实现的商城秒杀项目。
- 使用 redis + lua 抗住大部分的并发请求
- 库存扣减和创建订单: 两种实现,分别使用分布式事务库dtm的 TCC 模式、二阶段消息实现,保证数据的最终一致性
- 使用 kafka 实现的误差1秒以内的延迟队列实现15分钟未支付关闭订单
- 服务发现:本地开发使用etcd,生产环境中直接使用kubernetes
- trace: jaeger
- metric:prometheus + grafana
- api gateway:主要用来做统一的鉴权中心,使用go-zero的api文件实现, 使用jwt的方式做鉴权
TCC模式下
二阶段消息下:
- 详细内容请参考 Makefile 中的注释
- 请使用提供的
postman_collection.json
进行创建新数据并测试
使用 docker-compose up -d 运行mysql、redis、etcd、jaeger、kafka、dtm 等依赖软件
编写的程序则在本地运行,省去构建镜像时间。详细步骤如下:
cd micro-mall
make up # docker-compose up -d
make docker-compose-initdb # 创建数据库、表
make run # 运行所有程序
make stop # 关闭所有程序
make down # docker-compose down
make bulid-images
make load
make minikube-ingress
make apply
在本地构建镜像后,直接使用load命令加载到minikube中,省去 push 到 registry 又 pull 下来的消耗。
注意,部分服务使用init-container进行了启动顺序控制,首次创建时,数据库因为没有初始化会使得依赖数据库的服务启动失败。
这需要在 make apply
之后使用 make initdb
命令初始化数据库,运行命令后,按回车进入mysql交互命令行,将dummy.sql中的内容粘贴并运行即可
使用 postman 打开项目里的postman的json文件
使用wrk进行压力测试,命令为make wrk_test
,详细参考 wrk.lua
文件