Skip to content

jackylee92/rgo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

57 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RGO

RGo:

Rgo是一个基于Gin二次开发的框架,该框架集成了Log、MySQL、Jaeger、Config、pprof、Redis、Hook等组件功能,所有组件配置简单,高并发场景下日志文件写入,MySQL单例模式等。

安装

go get github.com/jackylee92/rgo

建议目录结构

├── README.md              // 项目ReadMe
├── cmd                    // 项目主入口
│   └── main.go 
├── common                 // 项目公共方法/常量
│   ├── README.md
│   ├── common.go
│   └── const.go
├── config                 // 配置文件
│   └── config.yaml
├── controller             // 控制器层
│   ├── README.md
│   └── api.go
├── docs                   // 详细的迭代等文档
│   └── 项目介绍.md
├── go.mod
├── go.sum
├── hook                   // 钩子文件
│   └── hook.go
├── message                // 语言包定义文件
│   ├── README.md
│   └── message.go
├── middleware             // 中间件
│   └── README.md
├── model                  // 数据层
│   ├── README.md
│   ├── datamate           // 调用三方数据源层
│   │   └── datemate.go
│   └── mysql              // 对接MySQL层
│       ├── README.md
│       ├── userdb
│       │   └── user.go
│       └── mysql.go
├── router                 // 路由层
│   ├── README.md
│   └── router.go
├── service                // 业务层
│   ├── README.md
│   └── user.go
├── storage                // 静态文件/日志
│   ├── README.md
│   └── log
│       └── log.log
├── test                   // 单元测试
│   ├── README.md
│   └── test_user.go
└── validator              // 验证层
    └── validator.go

启动:

go run cmd/main.go -config=config/config.yaml

模块使用

Router

对Gin路由二次封装,router := rgrouter.NewRouter()获取路由对象。NewRouter自动加载eager.Handle(), requestlog.Handle(), recovery.Handle(), container.Handle() 中间件,定义默认路由:健康检查elb-status,动态修改日志级别setLogLevel等,可查看源码core/rgrouter/rgrouter.go

案例:

// 获取默认路由
router := rgrouter.NewRouter()
// 定义路由规则
api := router.Group("/v1")
{
   api.GET("info/get", info.GetHandle) 
}
// 启动
rgrouter.Run(router)

Log

日志默认会记录在storage/log/项目名.log,默认会按天备份,项目名定义在config.yaml中sys_app_name,日志使用zerolog默认每秒每5000条输入一次。

日志输入流只有一个,在12点时会重命名,建立新的项目名.log文件,更新输入目标为新的日志文件。

通过获取请求上下文rgrequest.Get(ctx)写入日志会记录本次唯一的uniqId。

配置日志:config/config.yaml

日志文件配置:sys_log_dir:xxx/xxx/

日志级别配置:sys_log_level:debug/info/warn/error

记录日志

this := rgrequest.Get(ctx) // 获取请求上下文
this.Log.Info("info") // 记录info日志
this.Log.Error(err) // 记录错误日志

MySQL

配置数据库连接 config/config.yaml

sys_mysql:
   db_name:"root:password@tcp(127.0.0.1:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local"

获取MySQL链接

model, err := this.Mysql.New("db_name") // 获取db_name链接
if err != nil {
    return err
}

操作

 92 func (c *User) Update(param mysql.SearchParam, data map[string]interface{}) (err error) {
 93     model, err := param.This.Mysql.New("db_name")
 95     if err != nil {
 96         return err
 97     }
 98     data["updated_at"] = mysql.NowTime()
 99     return model.Db.Table(c.TableName()).Where(param.Query, param.Args...).Updates(data).Error
100 }
101
102 func (c *User) Find(param mysql.SearchParam) (err error) {
103     model, err := param.This.Mysql.New("db_name")
104     if err != nil {
105         return err
106     }
108     m := model.Db.Table(c.TableName()).Where(param.Query, param.Args...)
109     if param.Fields != nil && len(param.Fields) != 0 {
110         m = m.Select(param.Fields)
111     }
112     m.Find(&c)
113     if m.RowsAffected == 0 {
114         return mysql.ErrNil
115     }
116     return m.Error
117 }

Config

日志文件实现了本地yaml/apollo,不同的配置方式,只要实现ConfigInterface即可,通过配置config.yaml中 config: file表示配置使用文件方式

  8 type ConfigInterface interface {
  9     GetStr(string) string               // 获取String类型
 10     GetInt(string) int64                // 获取int64类型
 11     GetBool(string) bool                // 获取bool类型
 12     GetStrMap(string) map[string]string // 获取map[string]string类型
 13     GetStrSlice(string) []string        // 获取[]string类型
 14     GetContent() string                 // 获取所有配置文件string
 15     SetConfig(string, interface{})      // 设置配置
 16     Isset(string) bool                  // 判断配置是否存在
 17     Reload() error                      // 重新加载配置
 18     Load() func() error
 19 }
使用
name := rgconfig.GetStr("name")
age := rgconfig.GetInt("age")
res := rgconfig.GetBool("res")

pprof

通过配置文件,是否启动 sys_pprof true/false

Redis

Hook

启动时可像rgstarthook中注册函数

import (
   "github.com/jackylee92/rgo/core/rgstarthook"
    _ "github.com/jackylee92/rgo/util/rgstarthook" // 注册内置启动通知
) 
rgstarthook.Run() // 运行hook注册的方法

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages