一个轻量级的渐进式 Golang Web 框架。 A lightweight progressive Web Framework 使用 Go 语言编写。
一个轻量级的渐进式 Golang Web 框架。 A lightweight progressive Web Framework 使用 Go 语言编写。
go-sail是一个轻量的渐进式Web框架,使用Go语言实现。它并不是重复造轮子的产物,而是站在巨人的肩膀上,整合现有的优秀组件,旨在帮助使用者以最简单的方式构建稳定可靠的服务。 正如它的名字一般,你可以把它视作自己在Golang生态的一个开始。go-sail将助力你从轻出发,扬帆起航。
推荐go version >= 1.23
go get -u github.com/keepchen/go-sail/v3
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/keepchen/go-sail/v3/sail"
"github.com/keepchen/go-sail/v3/sail/config"
)
var (
conf = &config.Config{}
registerRoutes = func(ginEngine *gin.Engine) {
ginEngine.GET("/hello", func(c *gin.Context){
c.String(http.StatusOK, "%s", "hello, world!")
})
}
)
func main() {
sail.WakeupHttp("go-sail", conf).Hook(registerRoutes, nil, nil).Launch()
}当你看到终端如下图所示内容就表示服务启动成功了:
parseFn := func(content []byte, viaWatch bool){
fmt.Println("config content: ", string(content))
if viaWatch {
//reload config...
}
}
etcdConf := etcd.Conf{
Endpoints: []string{""},
Username: "",
Password: "",
}
key := "go-sail.config.yaml"
sail.Config(parseFn).ViaEtcd(etcdConf, key).Parse(parseFn)func UserRegisterSvc(c *gin.Context) {
...
sail.LogTrace(c).Warn("log something...")
...
}func UserLoginSvc(c *gin.Context) {
...
uid := "user-1000"
exp := time.Now().Add(time.Hour * 24).Unix()
otherFields := map[string]interface{}{
"nickname": "go-sail",
"avatar": "https://go-sail.dev/assets/avatar/1.png",
...
}
ok, token, err := sail.JWT().MakeToken(uid, exp, otherFields)
...
}func UserInfoSvc(c *gin.Context) {
...
ok, claims, err := sail.JWT().ValidToken(token)
...
}func UserInfoSvc(c *gin.Context) {
sail.Response(c).Wrap(constants.ErrNone, resp).Send()
}func UserInfoSvc(c *gin.Context) {
uid := "user-1000"
var user models.User
//READ: query user info
sail.GetDBR().Where("uid = ?", uid).First(&user)
...
//WRITE: update user info
sail.GetDBW().Model(&models.User{}).
Where("uid = ?", uid).
Updates(map[string]interface{}{
"avatar": "https://go-sail.dev/assets/avatar/2.png"
})
}func UserInfoSvc(c *gin.Context) {
uid := "user-1000"
err := sail.GetDBW().Transaction(func(tx *gorm.DB){
e1 := tx.Model(&models.User{}).
Where("uid = ?", uid).
Updates(map[string]interface{}{
"avatar": "https://go-sail.dev/assets/avatar/2.png"
}).Error
if e1 != nil {
return e1
}
e2 := tx.Create(&models.UserLoginHistory{
Uid: uid,
...
}).Error
return e2
})
}func UserInfoSvc(c *gin.Context) {
...
sail.GetRedis().Set(ctx, "go-sail:userInfo", "user-1000", time.Hour*24).Result()
...
}sail.Password().RSAEncrypt(plaintext, publicKey)
sail.Password().RSADecrypt(encryptedStr, privateKey)sail.Password().BcryptHashMake(plaintext)
sail.Password().BcryptHashCheck(plaintext, hash)sail.Password().Argon2HashMake(plaintext)
sail.Password().Argon2HashCheck(plaintext, hash)sail.Password().AesGCMEncrypt(plaintext, key)
sail.Password().AesGCMDecrypt(ciphertext, key)sail.Password().SM4GCMEncrypt(plaintext, key)
sail.Password().SM4GCMDecrypt(ciphertext, key)func TodoSomething() {
fn := func() { ... }
sail.Schedule("todoSomething", fn).Daily()
}func TodoSomething() {
fn := func() { ... }
sail.Schedule("todoSomething", fn).RunAt("*/5 * * * *")
}func TodoSomething() {
fn := func() { ... }
sail.Schedule("todoSomething", fn).Withoutoverlapping().RunAt("*/5 * * * *")
}func UpdateUserBalance() {
if !sail.RedisLocker().TryLock(key) {
return false
}
defer sail.RedisLocker().Unlock(key)
...
}ulimit -n 65535 && sh run_benchmark.sh测试结果(真实的HTTP请求)
goos: darwin
goarch: amd64
pkg: github.com/keepchen/go-sail/v3
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkGoSailParallel-12 88252 12898 ns/op 8860 B/op 92 allocs/op
BenchmarkGinParallel-12 96548 11722 ns/op 7187 B/op 82 allocs/op
PASS
ok github.com/keepchen/go-sail/v3 3.663s感谢在体验、使用过程中提出宝贵建议和意见以及提供过其他各种帮助的各位小伙伴!
图标
地址
类别
行业
https://fsx120.cn
网站
医疗
https://sendflare.com
网站
SaaS
https://stardots.io
网站
SaaS
https://t.me/PiggyPiggyofficialbot
Telegram小程序
Web3 GameFi
-
微信小程序
生活服务
https://fantagoal.io
网站
Web3 GameFi
-
网站
Web3 GameFi
-
网站
Web3 GameFi暂无开放 Issues,或尚未同步最近议题。