基于 gin+gorm+redis+mysql 读写分离的电子商城,包括 JWT 鉴权,CORS跨域,AES 对称加密,引入ELK体系方便日志查看,jaeger进行trace查看,skywalking进行检测,使用docker容器化部署
基于 gin+gorm+mysql读写分离 的一个电子商场
本项目改自于作者Congz的电子商城 去除了一些如第三方登录,极验,第三方支付等功能,新增了MySQL读写分离、ELK日志体系、AES对称加密进行数据脱敏等。 在此也非常感谢作者开源!🫡
此项目比较全面,比较适合小白入门web开发
V2版本,结构较比V1版本有很大的改动 全部转化成 controller、dao、service 模式,更加符合企业开发
考虑到部分同学的基础,所以V2版本的技术栈只有mysql,redis,docker。
而 ELK,MQ,Jaeger,Prometheus 这部分都集成在V3版本,并且V3版本的项目结构进行部分重构。
由于整合上传oss和上传到本地,需要在 conf 中进行配置 UploadModel
字段,上传到 oss 则配置 oss,上传本地则配置 local
其中我个人用到的测试sql数据都放在了config/sql/
文件当中
项目前端地址:react-mall
前端采用react+antd+axios+redux
,还在coding,功能还不完善,也希望有意向的同学可以一起完善
本项目采用GOMODULE管理依赖,同时接入 skywalking-go
普通运行
cd ./cmd
go run main.go
以二进制文件运行
go mod tidy
cd ./cmd
go build -o ../main
./main
注意:手动运行方式不支持Skywalking,如果需要支持Skywalking,可以参考Makefile,按照文件内命令编译
项目根目录内置了 Dockerfile、Makefile、docker-compose.yml 等文件 目的是快速构建项目环境,简易化项目运行难度
下面介绍 Makefile 中内置的几条指令,可根据需要在控制台当前项目根目录下进行相应操作的执行
make tools # 构建Skywalking-Agent二进制文件
make # 构建二进制文件并自动运行
make build # 构建二进制文件
make env-up # 拉起项目环境
make env-down # 停止并删除环境
make docker-up # 以容器方式拉起项目
make docker-down # 停止并删除容器
对于第一次运行本项目,可以按如下顺序执行
ARCH
和OS
以对应自己的电脑系统,在注释中提供了可选项make env-up tools build # 拉起项目环境、编译Agent、构建项目二进制文件
./main # 运行项目
欢迎大家把自己的想法 pr 到这个项目中。
⚠️ 注意一定要自己测试好,才能提 pr
名称 | 版本 |
---|---|
golang | 1.18 |
gin | v1.9.0 |
gorm | v1.9.6 |
mysql | v1.5.0 |
redis | v9.0.4 |
jwt-go | v3.2.0 |
crypto | v0.8.0 |
logrus | v1.9.0 |
qiniu-go-sdk | v7.14.0 |
dbresolver | v1.4.1 |
gin-mall
├── api # 用于定义接口函数,也就是controller的作用
├── cmd # 程序入口
├── conf # 配置文件
├── doc # 文档
├── middleware # 中间件
├── model # 数据库模型
├── pkg
│ ├── e # 错误码
│ └── util # 工具函数
├── repository
│ ├── cache # Redis缓存
│ ├── db # 持久层的mysql
│ │ ├── dao # dao层,对db进行操作
│ │ └── model # 定义mysql的模型
│ ├── es # ElasticSearch,形成elk体系
│ └── mq # 放置各种mq,kafka,rabbitmq等等
├── routes # 路由逻辑处理
├── serializer # 将数据序列化为 json 的函数,便于返回给前端
├── service # 接口函数的实现
└── static # 存放静态文件
config/locales/config.yaml
文件配置,配置文件可以将config.yaml.example
重命名为config.yaml
。
如果还没接触相关应用,可以在cmd/main.go
文件中进行注释
#debug开发模式,release生产模式
system:
domain: mall
version: 1.0
env: "dev"
HttpPort: ":5001"
Host: "localhost"
UploadModel: "local"
mysql:
default:
dialect: "mysql"
dbHost: "127.0.0.1"
dbPort: "3306"
dbName: "mall_db"
userName: "mall"
password: "123456"
charset: "utf8mb4"
kafka:
default:
debug: true
address: localhost:9092
requiredAck: -1 # 发送完数据后是否需要拿多少个副本确认 -1 需要全部
readTimeout: 30 # 默认30s
writeTimeout: 30 # 默认30s
maxOpenRequests: 5 # 在发送阻塞之前,允许有多少个未完成的请求,默认为5
partition: 2 # 分区生成方案 0根据topic进行hash、1随机、2轮询
redis:
redisDbName: 4
redisHost: 127.0.0.1
redisPort: 6379
redisUsername: default
redisPassword: 123456
redisNetwork: "tcp"
cache:
cacheType: redis
cacheEmpires: 600
cacheWarmUp:
cacheServer:
email:
address: http://localhost:8080/#/vaild/email/
smtpHost:
smtpEmail:
smtpPass:
encryptSecret:
jwtSecret: "FanOne666Secret"
emailSecret: "EmailSecret"
phoneSecret: "PhoneSecret"
oss:
AccessKeyId:
AccessKeySecret:
BucketName:
QiNiuServer:
photoPath:
photoHost: http://127.0.0.1
ProductPath: /static/imgs/product/
AvatarPath: /static/imgs/avatar/
es:
EsHost: 127.0.0.1
EsPort: 9200
EsIndex: mylog
rabbitMq:
rabbitMQ: amqp
rabbitMQUser: guest
rabbitMQPassWord: guest
rabbitMQHost: localhost
rabbitMQPort: 5672
mysql
是存储主要的数据。redis
用来存储商品的浏览次数。static/imgs/avatar/avatar.jpg
打开postman,点击导入
选择导入文件
效果
接下来点击Collection标题(gin-mall)
在Variables
中新增一个名为url
的变量,Initial value和Current value均填入localhost:5001/api/v1/
,然后保存,就可以开始测试了
这里是用postman查询es,Kibana也可以查看es!