基于Go语言(版本:>=v1.22.0)和fiber框架的高性能高并发的Web项目骨架
基于go-skeleton + Reactjs + shadcn-ui 开发的面向出海的插件化电商系统 敬请期待~
项目地址:https://github.com/MQEnergy/mqshop
├── LICENSE
├── Makefile # 构建
├── README.md
├── benchmark # benchmark
├── cmd
│ ├── app # 接口运行命令
│ └── cli # 命令行运行命令
├── configs # 配置文件
├── database # 数据表文件
├── go.mod
├── go.sum
├── internal
│ ├── app # 模块目录
│ ├── bootstrap # 服务启动
│ ├── command # 命令行
│ ├── middleware # 中间件
│ ├── request # 请求参数绑定的结构体目录
│ ├── router # 路由
│ └── vars # 全局变量
└── pkg
├── cache # 缓存类 redis sync.Map
├── command # 命令行接口定义
├── config # 配置加载类
├── crontab # 定时任务
├── database # 数据库类
├── helper # 帮助函数
├── jwtauth # jwt类
├── logger # 日志类
├── oss # aliyun oss上传
├── response # 接口返回类
├── restyHttp # 网络请求类
├── upload # 上传类
└── wecom # 企业微信
- 支持 jwt Authorization token验证组件
- 支持 cors 跨域组件
- 支持 gorm 数据库操作组件
- 支持 redis cache组件
- 支持 slog 日志组件
- 支持 controller、service、model、middleware、command 命令行方式生成代码工具
- 支持 casbin rbac权限 集成于中间件中 casbin.go
- 支持 viper yaml、json、toml等配置文件解析组件
- 支持 validator 数据字段验证器组件,同时支持中文
- 支持 snowflake 生成雪花算法全局唯一ID
- 实现 ip白名单配置 集成于中间件中 whitelist.go
- 实现 code 统一定义的返回码,exception 统一错误返回处理组件
- 实现 wecom 企业微信组件
- 实现 oss 阿里云oss组件
- 支持 cron 定时任务
- 支持 pprof 性能剖析组件
- 支持 trace 项目内部链路追踪
- 支持 rate 接口限流组件
- 支持 grpc rpc组件
- 支持 go-rabbitmq 消息队列组件 基于rabbitmq官方 amqp 组件封装实现的消费者和生产者
- 实现 ticker 定时器组件
- 实现 mongodb 数据库连接
# 安装依赖
go mod tidy
# web命令 e: 支持三种环境变量 p: 端口号(默认9527)
go run cmd/app/main.go [-e=dev|test|prod] [-p=9527...]
# 查看帮助
go run cmd/app/main.go -h
go run cmd/cli/main.go -h
# cli命令
go run cmd/cli/main.go [-e=dev|test|prod]
# 热更新
# 安装热更新
go install github.com/cosmtrek/air@latest
air
# 查看帮助
make help
# 格式化代码
make lint
# 打包成window
make windows
# 打包成linux
make linux
# 打包成macos
make darwin
配置文件存在于configs
在internal/vars目录中可查看全局可用的参数
var (
BasePath string // 根目录
DB *gorm.DB // Mysql数据库
MDB map[string]*gorm.DB // mysql多数据库操作
Redis *redis.Client // redis连接池
Router *fiber.Router // 路由
Config config.Config // 配置
Once sync.Once
)
# 查看帮助
go run cmd/cli/main.go genModel -h
# 命令示例:
# -m: 数据表名称(不填是生成别名为default的数据库的全部模型)
# -e: dev、test、prod(默认环境:dev)
# -a: 数据库别名(在yaml配置文件中database.mysql.sources.alias里面配置)(默认:default)
go run cmd/cli/main.go genModel [-m=foo] [-e=prod] [-a=demo]
命令使用-a参数 会生成新的dao目录,
参考文档:https://gorm.io/zh_CN/gen/dynamic_sql.html
1、在entity目录中定义模型的查询接口(按需使用)
参考:internal/app/entity/admin/admin.go
代码如下:
type Querier interface {
// SELECT * FROM @@table WHERE id = @id
GetByID(id int) (gen.T, error)
// SELECT * FROM @@table WHERE account = @account
GetByAccount(account string) (*gen.T, error)
}
2、在entity.go文件中引入数据表的相关接口,
参考:internal/app/entity/entity.go
代码如下:
var methodMaps = MethodMaps{
"cn_admin": { // 表名称
func(Querier) {}, // 扩展的查询接口 可多个
func(admin.Querier) {},
},
// ...
}
# 查看帮助
go run cmd/cli/main.go genCommand -h
# 命令示例
# -n: 命令行名称
# -d: 命令存放目录 支持无限极子目录 如:foo/foo
# -s: 加载已经存在的服务 如:mysql,redis 格式:多个服务以英文逗号相隔 如:mysql,redis
go run cmd/cli/main.go genCommand -n=foo [-d=foo] [-s=mysql,redis]
# 查看帮助
go run cmd/cli/main.go genController -h
# 命令示例 -n: 命令行名称 -d: 命令存放目录 支持无限极子目录 如:foo/foo
go run cmd/cli/main.go genController -n=foo [-d=foo]
# 查看帮助
go run cmd/cli/main.go genService -h
# 命令示例 -n: 命令行名称 -d: 命令存放目录 支持无限极子目录 如:foo/foo
go run cmd/cli/main.go genService -n=foo [-d=foo]
1、通过命令创建中间件
# 查看帮助
go run cmd/cli/main.go genMiddleware -h
# 命令示例 -n: 命令行名称
go run cmd/cli/main.go genMiddleware -n=foo
import "log/slog"
slog.Info("Info")
slog.Error("Error")
slog.Warning("Warning")
slog.Debug("Debug")
在controller中文件中直接调用Validate方法 示例如下:
package backend
import (
"github.com/MQEnergy/go-skeleton/pkg/response"
"github.com/MQEnergy/go-skeleton/internal/app/controller"
)
type FooController struct {
controller.Controller
}
// IndexReq 请求参数绑定
type IndexReq struct {
Name string `form:"name" query:"name" json:"name" xml:"name" validate:"required"`
Id int `form:"id" query:"id" xml:"id" validate:"required"`
}
// Index ...
func (c *FooController) Index(ctx *fiber.Ctx) error {
var params IndexReq
if err := c.Validate(ctx, ¶ms); err != nil {
return response.BadRequestException(ctx, err.Error())
}
return response.SuccessJSON(ctx, "", "index")
}
// 基础返回
response.JSON(ctx *fiber.Ctx, status int, errcode Code, message string, data interface{})
// 成功返回
response.SuccessJSON(ctx *fiber.Ctx, message string, data interface{})
// ...
参考:
1、调用 internal/app/controller/backend/attachment.go
2、组件 pkg/upload/upload.go
var (
u = dao.YfoAdmin
)
adminInfo, err = u.GetByAccount(reqParams.Account) // 这个是entity暴露的查询方法 可查看entity/admin/admin.go文件
dao.{数据模型}.{查询方法}
# install
go install mvdan.cc/gofumpt@latest
# run
gofumpt -l -w .
# install
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
# run path为shadow所在目录
go vet -vettool={path}/shadow ./cmd/app/main.go
# install
go install go.uber.org/nilaway/cmd/nilaway@latest
# run 根目录
nilaway ./...
注意查看.air.toml文件
wrk -t12 -c1000 -d30s --script=benchmark/login.lua --latency http://127.0.0.1:9527/backend/auth/login