lazygo

module
v0.2.22 Latest Latest
Warning

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

Go to latest
Published: May 6, 2021 License: MIT

README

lazygo

lazygo框架

功能简介
HTTP
  路由:自动路由
  中间件:不支持
  REST风格:不支持
  变量获取器:支持 json formdata
  错误处理:支持
HTTP请求:
  REST风格:支持
  文件上传:支持
  cookie:支持
  http代理:支持
配置文件:
  json格式配置文件: 支持
日志:
  console
  file
数据库
  mysql
    连接池:支持
    多数据库:支持
    ORM:不支持
    查询构建器:支持
    防注入:支持
  redis
    连接池:支持
    多数据库:支持
    使用redigo组件
  memcached:
    连接池:支持
    多数据库:支持
    分片:支持
  lruCache:
    本地内存缓存

模板:原生模板

定时任务:支持

一键打包资源文件:支持makefile

helper方法


生命周期

框架启动

初始化config
->初始化mysql、redis、memcached、cache、cron等组件
->注册路由、注册定时任务
->初始化资源
->常驻内存等待http请求

http请求-->http响应

匹配路由
通过反射创建控制器实例
读取request
业务代码
响应

命名规范: 控制器: 需继承Controller,命名必须为XxxController

控制器方法: 必须已Action结尾,否则自动路由加载不到

model: 需继承Model

定时任务Task: 需继承Task,命名必须为XxxTask

定时任务方法 必须已Action结尾,否则加载不到

路由

控制器需要注册,注册之后,会按照请求路径匹配控制器和函数

// 自动路由
router.RegisterController(&controller.User{})
变量获取
ctl.GetString(name string) string
ctl.GetInt(name string) int
ctl.PostString(name string) string
ctl.PostInt(name string) int
ctl.GetHeader(name string) string
http 客户端
// 实例:post 请求json数据
var res map[string]interface{}
err := libhttp.Post(checkUpdateApi).SetHeader(header).SetParams(params).ToJSON(&res)
读取配置文件

配置文件使用json格式

serverConfig, err := config.Config.GetSection("server")
utils.CheckFatal(err)
hostArray := serverConfig.Get("host").Array()
ip := serverConfig.Get("ip").String()
port := serverConfig.Get("port").Int()
日志
func Emergency(f interface{}, v ...interface{})
func Alert(f interface{}, v ...interface{})
func Critical(f interface{}, v ...interface{})
func Error(f interface{}, v ...interface{})
func Warn(f interface{}, v ...interface{})
func Notice(f interface{}, v ...interface{})
func Info(f interface{}, v ...interface{})
func Debug(f interface{}, v ...interface{})

mysql
// 获取数据库
// dbname 是数据库配置中的name字段
database, err = mysql.Database("dbname")

// 执行SQL
database.Query(query string) (*sql.Rows, error)
database.Exec(query string) (sql.Result, error)
database.GetAll(query string) ([]map[string]interface{}, error)
database.GetAll(query string) ([]map[string]interface{}, error)

// 指定表名,获取查询构建器
builder := database.Table("table_name")

// 查询构建器使用

链式调用

// 设置条件

// 可以通过指定参数调用的方式设置条件,性能高。
builder.WhereMap(cond map[string]interface{})
.WhereRaw(cond string)
.WhereIn(k string, in []interface{})
.WhereNotIn(k string, in []interface{})

或者通过自动匹配参数方式设置条件

// `k` IN('1', '2')
builder.Where("k", []interfece{}{1, 2})

// `name` = 'li' AND (`group`='admin' OR `group`='dev')
builder.Where(map[string]interface{}{"name": "li"}).Where("(`group`='admin' OR `group`='dev')")

// `name` = 'li' AND group IN("admin", "1")
cond := map[string]interface{}{
    "name": "li"
    "group": []interface{}{
        "admin",
        "dev",
    }
}
builder.Where(cond)


// 获取结果
builder.FetchOne(field string, order string, group string, start int) string
builder.FetchRow(fields string, order string, group string, start int) (map[string]interface{}, error)
builder.Fetch(fields string, order string, group string, limit int, start int) ([]map[string]interface{}, error)
builder.FetchWithPage(fields string, order string, group string, limit int, page int) (*ResultData, error)

// 聚合查询
builder.Count() int64

// 插入
builder.Insert(set map[string]interface{}) (int64, error)

// 更新
builder.Update(set map[string]interface{}, limit ...int) (int64, error)

// string column 自增的字段
// amount 自增数量
// column set 同时更新的字段(可选参数)
builder.Increment(column string, amount int, set ...map[string]interface{}) (int64, error)
builder.Decrement(column string, amount int, set ...map[string]interface{}) (int64, error)

// 删除
builder.Delete(limit ...int) (int64, error)

redis、memcached

方法太多,暂不做详细介绍

缓存

缓存支持memcached、redis和本地lru内存缓存,对于分布式系统主要使用memeceched或redis适配器

初始化

adapterName := "redis"
opt := map[string]interface{}{
    "name": "default", // db连接mame
}
cache.Init(adapterName, opt)

操作

// 设置缓存
cache.Remember(key string, value interface{}, timeout time.Duration) DataResult
// 获取缓存
cache.Get(key string) (DataResult, error)
// 判断缓存是否存在
cache.Has(key string) bool
// 删除缓存
cache.Forget(key string) bool

type DataResult interface {
	GetType() int32
	ToString() (string, error)
	ToByteArray() ([]byte, error)
	ToMap() (map[string]interface{}, error)
	ToMapArray() ([]map[string]interface{}, error)
}

// Remember的value参数可以是 DataResult 中的类型,或返回DataResult中类型的函数

callcack := func () interface {
    mdlUser := model.NewUser()
    cond := map[string]interface{}{
        "uid": 112,
    }
    data, err := mdlUser.GetInfo(cond)
    utils.CheckError(err)
    return data
}

res := cache.Remember("xxxxx_user_uid_112", callcack, 10*time.Minute)

data := res.ToMap()

分布式锁

初始化

adapterName := "redis"
opt := map[string]interface{}{
    "name": "default", // db连接mame
}
locker.Init(adapterName, opt)

使用示例1:

手动获取锁,释放锁

// 资源标识符
resource := "lock_resource_key_uid_1"

// 获取锁,并给锁设置10秒有效期
// 如果并发,等待200ms重试,共重试50次
// 如果需要立即返回,retry参数传0即可
lock, ok, err := locker.TryLock(resource, 10, 50)
if (err != nil) {
    // 错误处理
    panic(err)
}
if (!ok) {
    panic("并发了,获取锁超时")
}
// 获取到锁
// 处理业务逻辑
// 释放锁,建议使用defer 在处理业务逻辑之前
lock.Release()

使用示例2: 为函数增加方并发处理,自释放锁

// 资源标识符
resource := "lock_resource_key_uid_1"
// 设置防止并发的函数
f := func () interface{} {
    // 处理业务逻辑
    // 必须有返回值
    return "我是一个字符串"
}
// 获取锁,并给锁设置10秒有效期
// 重试次数*重试间隔时间自动控制,无需设置
// 函数执行完锁会自动释放
res, err := locker.LockFunc(resource, 10, f)

if (err != nil) {
    // 获取锁超时或其他错误,错误处理
    // 函数未被执行
    panic(err)
}

// 函数正常执行,获取结果
fmt.Println(res.(string))

模板
ctl.AssignMap(data map[string]interface{}) *Template

ctl.Assign(key string, data interface{}) *Template

ctl.Display(tpl string)
定时任务

分布式部署时 ,请注意定时任务可能会有问题, 如果只允许一台机器执行cron,可根据主机名来进行限制

RegisterTask(c, "*/5 * * * *", &task.DomainTask{}, "due")
RegisterTask(c, "*/6 * * * *", &task.DomainTask{}, "release")
RegisterTask(c, "*/1 * * * *", &task.DomainTask{}, "unlock")
工具方法

变量相关 ToString(value interface{}, defVal ...string) string ToInt64(value interface{}, defVal ...int64) int64 ToInt(value interface{}, defVal ...int) int

字符串相关 ToCamelString(s string) string VersionCompare(version1, version2, operator string) bool

文件相关 GetMimeType(name string) string PathIsExist(f string) bool

日志相关

Debug(v ...interface{}) Info(v ...interface{}) Warn(v ...interface{}) Error(v ...interface{}) Fatal(v ...interface{})

错误相关 CheckError(err error) CheckFatal(err error)

认证相关 CreateJwt(uid int64) string VerifyJwt(tokenStr string) (int64, error)

Directories

Path Synopsis
app

Jump to

Keyboard shortcuts

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