yiigo
Go è½»é‡çº§å¼€å‘通用库
Features
- æ”¯æŒ MySQL
- æ”¯æŒ PostgreSQL
- æ”¯æŒ MongoDB
- æ”¯æŒ Redis
- æ”¯æŒ Zipkin
- æ”¯æŒ Apollo
- �件使用 gomail
- é…ç½?使用 toml
- SQL使用 sqlx
- ORM使用 gorm
- 日志使用 zap
- 包å«ä¸€äº›å?žç”¨çš„å¸?助方法,如:httpã€cyptoã€dateã€IP ç‰
Requirements
Go1.11+
Installation
go get github.com/iiinsomnia/yiigo/v4Usage
Config
yiigo.toml
[app]
env = "dev" # dev | beta | prod
debug = true
[apollo]
app_id = "test"
cluster = "default"
address = "127.0.0.1:8080"
namespace = ["apollo_test"]
cache_dir = "./"
accesskey_secret = ""
insecure_skip_verify = true
[db]
[db.default]
driver = "mysql"
dsn = "username:password@tcp(localhost:3306)/dbname?timeout=10s&charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&loc=Local"
# dsn = "host=localhost port=5432 user=root password=secret dbname=test connect_timeout=10 sslmode=disable" # pgsql
max_open_conns = 20
max_idle_conns = 10
conn_max_lifetime = 60 # ç§’
[mongo]
[mongo.default]
dsn = "mongodb://username:password@localhost:27017"
connect_timeout = 10 # ç§’
pool_size = 10
max_conn_idle_time = 60 # ç§’
mode = "primary" # primary | primary_preferred | secondary | secondary_preferred | nearest
[redis]
[redis.default]
address = "127.0.0.1:6379"
password = ""
database = 0
connect_timeout = 10 # ç§’
read_timeout = 10 # ç§’
write_timeout = 10 # ç§’
pool_size = 10
pool_limit = 20
idle_timeout = 60 # ç§’
wait_timeout = 10 # ç§’
prefill_parallelism = 0
[log]
[log.default]
path = "app.log"
max_size = 500
max_age = 0
max_backups = 0
compress = true
[email]
[email.default]
host = "smtp.exmail.qq.com"
port = 25
username = ""
password = ""
# apollo namespace
[apollo_test]
name = "yiigo"- usage
yiigo.Env("app.env").String("dev")
yiigo.Env("app.debug").Bool(true)
yiigo.Env("apollo_test.name").String("foo")
âš ï¸ æ³¨æ„ï¼å¦‚æžœé…ç½?了
apollo,则:
namespaceä¸çš„é…ç½?项优先从apollo读å–,若ä¸å˜åœ¨ï¼Œåˆ™ä»Žyiigo.tomlä¸è¯»å–ï¼›- è‹¥
namespaceä¸åœ¨apolloé…ç½?ä¸ï¼Œåˆ™å…¶é…ç½?项从yiigo.tomlä¸èŽ·å–;- 当
app.env = "dev"时,é…ç½?从yiigo.tomlä¸è¯»å–
MySQL
// default db
yiigo.DB().Get(&User{}, "SELECT * FROM `user` WHERE `id` = ?", 1)
yiigo.Orm().First(&User{}, 1)
// other db
yiigo.DB("foo").Get(&User{}, "SELECT * FROM `user` WHERE `id` = ?", 1)
yiigo.Orm("foo").First(&User{}, 1)MongoDB
// default mongodb
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
yiigo.Mongo().Database("test").Collection("numbers").InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})
// other mongodb
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
yiigo.Mongo("foo").Database("test").Collection("numbers").InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})Redis
// default redis
conn, err := yiigo.Redis().Get()
if err != nil {
log.Fatal(err)
}
defer yiigo.Redis().Put(conn)
conn.Do("SET", "test_key", "hello world")
// other redis
conn, err := yiigo.Redis("foo").Get()
if err != nil {
log.Fatal(err)
}
defer yiigo.Redis("foo").Put(conn)
conn.Do("SET", "test_key", "hello world")Zipkin
reporter := yiigo.NewZipkinHTTPReporter("http://localhost:9411/api/v2/spans")
// sampler
sampler := zipkin.NewModuloSampler(1)
// endpoint
endpoint, _ := zipkin.NewEndpoint("yiigo-zipkin", "localhost")
tracer, err := yiigo.NewZipkinTracer(reporter,
zipkin.WithLocalEndpoint(endpoint),
zipkin.WithSharedSpans(false),
zipkin.WithSampler(sampler),
)
if err != nil {
log.Fatal(err)
}
client, err := tracer.HTTPClient(yiigo.WithZipkinClientOptions(zipkinHttp.ClientTrace(true)))
if err != nil {
log.Fatal(err)
}
b, err := client.Get(context.Background(), "url...",
yiigo.WithRequestHeader("Content-Type", "application/json; charset=utf-8"),
yiigo.WithRequestTimeout(5*time.Second),
)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))Logger
// default logger
yiigo.Logger().Info("hello world")
// other logger
yiigo.Logger("foo").Info("hello world")Documentation
Enjoy