Go 包/中间件

casbin

权限管理。

简介

权限管理在几乎每个系统中都是必备的模块。如果项目开发每次都要实现一次权限管理,无疑会浪费开发时间,增加开发成本。因此,casbin库出现了。casbin是一个强大、高效的访问控制库。支持常用的多种访问控制模型,如ACL/RBAC/ABAC等。可以实现灵活的访问权限控制。同时,casbin支持多种编程语言,Go/Java/Node/PHP/Python/.NET/Rust。我们只需要一次学习,多处运用。

结构

权限实际上就是控制能对什么资源进行什么操作。casbin 将访问控制模型抽象到一个基于 PERM(Policy,Effect,Request,Matchers) 元模型的配置文件(模型文件)中。因此切换或更新授权机制只需要简单地修改配置文件。

policy 是策略或者说是规则的定义。它定义了具体的规则。

effect 根据对请求运用匹配器得出的所有结果进行汇总,来决定该请求是允许还是拒绝。

request 是对访问请求的抽象,它与 e.Enforce() 函数的参数是一一对应的

matcher 匹配器会将请求与定义的每个 policy 一一匹配,生成多个匹配结果。

BoltDB

嵌入式kv数据库

简介

BoltDB设计源于LMDB,具有以下特点:

  • 直接使用API存取数据,没有查询语句;
  • 支持完全可序列化的ACID事务,这个特性比LevelDB强;
  • 数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收;
  • 通过COW技术,可实现无锁的读写并发,但是无法实现无锁的写写并发,这就注定了读性能超高,但写性能一般,适合与读多写少的场景。

GORM

go-orm 数据库关系映射管理工具

  • gorm 更新数据,当用结构体更新的时候,当结构体的值是””或者0,false 等该数据类型的零值时,就什么也不会更新。
  • datatypes仓库负责收集各种自定义数据类型。
  • gorm 支持 clause 来实现 Upsert 的功能,但是发现只支持根据 id 进行判断,如果对应 id 记录存在则更新,对应 id 记录不存在则插入。

gorm 实现 upsert

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// gorm 实现有则修改,无则新增
res = dao.Db.Table(xxx).Where("abc = ?", r.Abc).First(&oneRow)
if res.Error != nil {
if res.Error == gorm.ErrRecordNotFound {
res = dao.Db.Table(xxx).Create(&r)
if res.Error != nil {
return res.Error
}
}
} else {
res = dao.Db.Table(xxx).Model(&oneRow).Updates(&r)
if res.Error != nil {
return res.Error
}
}

cron

定时任务

Golang 定时任务 github/robfig/cron/v3 使用与源码解析

flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

log := flag.String("LOG", "ERROR", "设置服务日志级别")
host := flag.String("HOST", "postgres", "数据库主机地址")
port := flag.Int("PORT", 5432, "数据库端口")
user := flag.String("USER", "postgres", "数据库用户名称")
name := flag.String("DBNAME", "postgres", "数据库Database名称")
pwd := flag.String("PASSWORD", "123456", "数据库连接密码")

flag.Parse()

flag.Set("logtostderr", "false") //日志输出到stderr,不输出到日志文件。false为关闭
flag.Set("log_file", "../log/srv.log")
// 一定要用指针
flag.Set("stderrthreshold", *log)

注意:注册之后,flag.Parse()完成才能拿到参数具体值。且一定要用指针类型使用 flag 解析出来的值,不然就会是默认值,而获取不到命令参数传递的值。

golang 每日一库

每日一库会甄选 go 语言中好用实用的库做推荐,内容中会讲解其目标领域和使用方法,有很多新颖且使用的封装库都可以在这里找到,在知乎、微信公众号、github均有维护,虽然目前更新频率已经不再保持,但是仍有许多值得了解的推荐。