Skip to content

基于Go语言和fiber框架的面向生产开发的高性能高并发的Web项目骨架

License

Notifications You must be signed in to change notification settings

MQEnergy/go-skeleton

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

85 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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      // 配置
	Once     sync.Once
)

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 

七、静态分析

# install
go install go.uber.org/nilaway/cmd/nilaway@latest

# run 根目录
nilaway ./...

八、注意

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

About

基于Go语言和fiber框架的面向生产开发的高性能高并发的Web项目骨架

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published