Skip to content
keepchen edited this page Dec 19, 2023 · 3 revisions

一个用go语言实现的轻量的渐进式web框架

go-sail是什么? Whats the go-sail?

go-sail是一个轻量的渐进式web框架,使用golang语言实现。它并不是重复造轮子的产物,而是站在巨人的肩膀上,整合现有的优秀组件,旨在帮助使用者以最简单的方式构建稳定可靠的服务。
正如它的名字一般,你可以把它视作自己在golang生态的一个开始。go-sail将助力你从轻出发,扬帆起航。

go-sail is a lightweight progressive web framework implemented using golang language. It is not the product of reinventing the wheel, but stands on the shoulders of giants and integrates existing excellent components to help users build stable and reliable services in the simplest way. As its name suggests, you can regard it as the beginning of your own journey in the golang ecosystem. go-sail will help you start lightly and set sail.

如何使用? How to use?

go version >= 1.19

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{
        LoggerConf: logger.Conf{
            Filename: "examples/logs/running.log",
        },
        HttpServer: config.HttpServerConf{
            Debug: true,
            Addr:  ":8000",
            Swagger: config.SwaggerConf{
                Enable:      true,
                RedocUIPath: "examples/pkg/app/user/http/docs/docs.html",
                JsonPath:    "examples/pkg/app/user/http/docs/swagger.json",
            },
            Prometheus: config.PrometheusConf{
                Enable:     true,
                Addr:       ":19100",
                AccessPath: "/metrics",
	    },
	},
    }
    apiOption = &api.Option{
        EmptyDataStruct:  api.DefaultEmptyDataStructObject,
        ErrNoneCode:      constants.CodeType(200),
        ErrNoneCodeMsg:   "SUCCEED",
        ForceHttpCode200: true,
    }
    registerRoutes = func(ginEngine *gin.Engine) {
        ginEngine.GET("/hello", func(c *gin.Conext){
            c.String(http.StatusOK, "%s", "hello, world!")
        })
    }
    fn = func() {
        fmt.Println("call user function to do something...")
    }
)

sail.WakeupHttp("go-sail", conf, apiOption).Launch(registerRoutes, fn)

当你看到终端如下图所示内容就表示服务启动成功了: Console screenshot after launched like this:
go-sail launch.png

特性 Features

  • 获取组件 Get components

go-sail启动时,会根据配置文件启动相应的应用组件,可使用sail关键字统一获取

import (
    "github.com/keepchen/go-sail/v3/sail"
)

//日志组件
sail.GetLogger()

//数据库连接(读、写实例)
sail.GetDB()

//redis连接(standalone模式)
sail.GetRedis()

//redis连接(cluster模式)
sail.GetRedisCluster()

//nats连接
sail.GetNats()

更多组件持续开发中,也欢迎大家提PR👏🏻👏🏻 PR is welcome👏🏻👏🏻

  • 返回响应 Response
import (
    "net/http"
    "github.com/gin-gonic/gin"
    "github.com/keepchen/go-sail/v3/constants"
    "github.com/keepchen/go-sail/v3/sail"
)

//handler
func SayHello(c *gin.Context) {
    sail.Response(c).Builder(constants.ErrNone, nil, "OK").Send()
}
  • 返回响应实体 Response (entity)
import (
    "net/http"
    "github.com/gin-gonic/gin"
    "github.com/keepchen/go-sail/v3/constants"
    "github.com/keepchen/go-sail/v3/http/pojo/dto"
    "github.com/keepchen/go-sail/v3/sail"
)

type UserInfo struct {
    dto.Base
    Data struct {
        Nickname string `json:"nickname" validate:"required" format:"string"` //nickname
        Age int `json:"int" validate:"required" format:"number"` //age
    } `json:"data" validate:"required"` //body data
}

//implement dto.IResponse interface
func (v UserInfo) GetData() interface{} {
	return v.Data
}

//handler
func GetUserInfo(c *gin.Context) {
    var resp UserInfo
    resp.Data.Nickname = "go-sail"
    resp.Data.Age = 18

    sail.Response(c).Builder(constants.ErrNone, resp).Send()
}

已集成的组件

日志 Logger

日志组件封装的是Uber提供的zap日志库,go-sail封装好的logger提供了以下功能:

  • 日志轮转
    支持按文件大小和文件数量上限进行留存文件,防止写满磁盘。
  • 日志导出器
    目前已内置了redis、nats-io两种方式的导出器,也支持在初始化的时候设置其他自定义的导出器。
  • 按模块写入不同的日志文件
    可以在初始化的时候,根据不同的逻辑或需求区分日志文件。

数据库 Database

数据库组件是对gorm的简单封装,实现了简单的读写实例分离(在调用时显式指定),并将其默认的logger整合到go-sail的logger组件中。

缓存 Cache

缓存组件是对go-redis的简单封装,可以根据配置自行决定使用standalone模式还是cluster模式的连接。go-sail的redis导出器使用到的就是这里的组件。

消息队列 Message Queue

消息队列组件是简单封装的nats连接客户端。go-sail的nats导出器使用到的就是这里的组件。

配置中心 Config Center

配置中心组件是简单封装的nacos客户端,由于自身业务的发展历史,配置中心使用的java生态的nacos而不是etcd,因此go-sail封装的是nacos的连接客户端。实现了一些常用功能的语法糖:监听配置、注册/下线服务、获取健康实例。

路由中间件 Route Middleware

go-sail封装了一些常用的路由中间件,包括:

  • 跨域配置
  • Prometheus指标收集
  • 请求载荷打印
  • 前置上下文注入
    注入请求到达时间、注入请求id(用于调用链日志查询调试)、注入带请求id的日志组件。

工具类

  • AES加解密
  • Base64转义
  • File文件操作
    保存、读取、逐行读取
  • IP地址获取
    获取本地ip地址(全局单播地址)
  • Redis锁
    锁定、释放、自动续期
  • RSA加签验签
  • Signal信号量监听
  • String字符串处理
    随机字符串、包装公私钥
  • Time时区封装
  • Webpush浏览器消息推送

框架常量

  • 错误码
    内置错误码、注册自定义错误码,框架的响应组件使用的就是这里的错误码。
  • 时区
    从-11 ~ +12时区和默认时区。

其他插件 Other Plugins

README.md

源代码仓库地址 Source Code Repo

Github