go-skeleton

module
v0.0.0-...-5cf9733 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 26, 2024 License: MIT

README

go-skeleton

基于Go语言(版本:>=v1.22.0)和fiber框架的高性能高并发的Web项目骨架

持续更新中...

基于go-skeleton + Reactjs + shadcn-ui 开发的面向出海的插件化电商系统 敬请期待~

项目地址:https://github.com/MQEnergy/mqshop

GoDoc GitHub license codebeat badge

一、项目结构

├── 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         # 企业微信

目前已集成和实现:
下一步计划:
  • 支持 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

1、全局变量

在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      // 配置
)
2、基于gorm/gen生成model和dao
# 查看帮助
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) {},
    },
    // ...
}
3、创建command命令
# 查看帮助
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]
4、创建controller
# 查看帮助
go run cmd/cli/main.go genController -h

# 命令示例 -n: 命令行名称 -d: 命令存放目录 支持无限极子目录 如:foo/foo
go run cmd/cli/main.go genController -n=foo [-d=foo]
5、创建service
# 查看帮助
go run cmd/cli/main.go genService -h

# 命令示例 -n: 命令行名称 -d: 命令存放目录 支持无限极子目录 如:foo/foo
go run cmd/cli/main.go genService -n=foo [-d=foo]
6、中间件

1、通过命令创建中间件

# 查看帮助
go run cmd/cli/main.go genMiddleware -h

# 命令示例 -n: 命令行名称
go run cmd/cli/main.go genMiddleware -n=foo
7、日志
import "log/slog"

slog.Info("Info")
slog.Error("Error")
slog.Warning("Warning")
slog.Debug("Debug")
8、验证器

在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, &params); err != nil {
    return response.BadRequestException(ctx, err.Error())
    }
    return response.SuccessJSON(ctx, "", "index")
}
9、响应体

pkg/response/response.go文件中

// 基础返回
response.JSON(ctx *fiber.Ctx, status int, errcode Code, message string, data interface{})

// 成功返回
response.SuccessJSON(ctx *fiber.Ctx, message string, data interface{})
// ...
10、数据迁移 migrate
11、上传类

参考:

1、调用 internal/app/controller/backend/attachment.go

2、组件 pkg/upload/upload.go

12、service查询数据

查看service/backend/auth.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 .   
六、检查shadow变量
# 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 
七、注意
1、air配置文件 .air.toml在不同环境下需要修改

注意查看.air.toml文件

benchmark (Todo)
wrk -t12 -c1000 -d30s --script=benchmark/login.lua --latency http://127.0.0.1:9527/backend/auth/login

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL