fastfiber

package module
v1.0.8 Latest Latest
Warning

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

Go to latest
Published: Apr 21, 2023 License: Apache-2.0 Imports: 25 Imported by: 0

README

fastfiber

fastfiber是一个基于fiber的快速开始goweb开发的脚手架。目的是为了让开发者更快的进入开发,而无需关注项目组织,系统配置,驱动集成,日志等基础模块。

QuickStart

详细示例 fastfiber-demo

go get -u github.com/nerocho/fastfiber@latest

Features

  • 很棒的性能,参见fasthttp
  • 低内存占用
  • 集成 viper 的配置文件管理
  • 集成 sls 的高性能日志输出
  • 集成 gorm 的数据库操作
  • 集成 go-redis 的缓存操作
  • 自动的参数校验及全局错误处理
  • 集成 Sql TracingRedis Tracing
  • Graceful Shutdown
  • 开箱即用的中间件&工具包
    • 访问日志,限流,跨域,JWT,接口级缓存...
    • 邮件,tracing,response,加解密...

关于Tracing的设计(以nginx为例)

业界比较流行的jaeger 有点重,小团队不需要高效、简洁、够用就成。主体逻辑为:应用日志打印日志时携带上下游的request_id,通过日志采集程序统一采集,即可通过request_id进行关键字查询

  1. 请求到nginx时,为请求追加request_id
  2. 应用收到请求时,可以使用一个中间件负责解析request_id,并把它存入如context
  3. 应用日志中,打印request_id字段即可
  4. SQL日志,需要到配置文件中开启 Database.EnableSQLLog配置,同时在执行sql时,通过.withContext()透传context
    1. 实现见 utils/orm/plugin文件
  5. REDIS日志,待补充

配置文件 config.env.yml

配置文件,默认与启动程序同级,也可以通过-f指定位置

配置文件依赖于环境变量APP_ENV,如APP_ENV=test,则配置文件会读取config.test.yml

# 系统配置
System:
  AppName: "go-express" # 应用名称
  Port: 8080 # 启动端口
  LogType: console # 见logger的sdk文档
  LogResponseBody: false # 是否打印response日志,默认关闭,开启比较影响性能和存储,比如返回给前端数据很大时,记录日志消耗会比较大

Jwt:
  Secret: "password" # 秘钥
  Expire: 1 # 1小时

# 数据库配置
Database:
  IsInit: true # 是否初始化到fastfiber对象上
  EnableSQLLog: true # 是否开启SQL日志
  Type: "mysql" # 仅支持mysql 和 postgres
  SlowThreshold: 100 # 慢日志,单位毫秒,执行时间大于SlowThreshold的sql会被记录到日志中
  MaxIdleConns: 10 # 最大空闲连接数即一直持有
  MaxIdleTime: 1800 # 默认30分钟,最大空闲时间秒
  MaxLifeTime: 3600 # 默认1小时,配置时建议小于wait_timeout
  MaxOpenConns: 128 # 连接池大小
  EnableReplicas: false # 是否开启读写分离

  #密码中如果包含特殊字符,需要提前url encode
  #Mysql格式为:"mysql://root:123456@127.0.0.1:3306/dbName"
  #Postgres格式为: postgres://root:123456@1127.0.0.1:5432/Winner
  Dsn:
    Write: ENV_OF_MYSQL_DSN_WRITE
    Read: ENV_OF_MYSQL_DSN_READ # 多个从库的话用,号隔开

# redis 配置
Redis:
  IsInit: true # 是否初始化到fastfiber对象上
  EnableTraceLog: true #是否开启日志
  #密码中如果包含特殊字符,需要提前url encode
  #格式必须为: redis://root:123456@1127.0.0.1:6379,
  #无密码无账号如:redis://:@1127.0.0.1:6379
  #有密码无账号如:redis://:password@1127.0.0.1:6379
  Addr: ENV_OF_REDIS_DSN 
  MaxIdle: 10 #最大空闲连接数
  MaxActive: 1000 # 连接池大小
  IdleTimeout: 60 #空闲超时时间
  IndexDb: 0 #数据库

# Id生成器
IdWorker:
  IsInit: true # 是否初始化到全局对象
  WorkerId: 0 # 为0 则使用默认值 建议按照节点数量自行设置
  DataCenterId: 0 # 为0 则使用默认值 建议按照业务线自行设置
  Twepoch: 0 # 为0 则使用默认值

# 限流配置
Limiter:
  Enable: true # true开启 false 关闭
  IpWhiteList: # 白名单
    - "127.0.0.1"
    - "其他信任ip,如其他内网机器"

# 接口缓存配置
ApiCache:
  Enable: false #true开启 false 关闭

数据库操作

// 安装模型类生成工具
go install github.com/xxjwxc/gormt@latest

// 项目目录下执行,默认会把所有的dev库里面所有的表生成到models文件夹下
gormt -H=127.0.0.1 -d=dev -p=123456 -u=root --port=3306 -F=true -o=models

// 具体代码可以查看相关文件夹

Stargazers

如果您觉得本项目对您有所帮助,请不要吝啬一个⭐哦!

Stargazers over time

Documentation

Index

Constants

View Source
const (
	// keys
	EventDestroyPrefix = "Destroy_"
	ProcessKilled      = "收到信号,进程被结束"

	// errors
	ErrInitConfigFile       = "初始化配置文件出错:"
	ErrInitLoggerFail       = "初始化日志出错:"
	ErrConfigFileNotExists  = "化配置文件不存在:"
	ErrorsDbInitFail        = "数据库初始化失败:"
	ErrorsIdWorkerInitFail  = "ID生成器 初始化失败:"
	ErrorsRedisInitConnFail = "Redis 初始化连接池失败:"
	ErrorsTracerInitFail    = "Tracer 初始化失败:"
)

Variables

View Source
var (
	// globals
	Logger    winner_logger.Logger   //全局日志
	Conf      interf.ConfigInterface //全局配置
	Db        *gorm.DB               //数据库
	IdWorker  *snowflake.IdWorker    //id 生成器
	RedisPool *redis.Client          //全局redisPool

)

Functions

func BindAndAllErr

func BindAndAllErr(ctx *fiber.Ctx, ptr interface{}) error

绑定请求参数并返回校验的错误(所有)

func BindAndOneErr

func BindAndOneErr(ctx *fiber.Ctx, ptr interface{}) error

绑定请求参数并返回校验的错误(一个)

func Bootstrap

func Bootstrap()

func ErrorHandler

func ErrorHandler(ctx *fiber.Ctx, err error) error

错误处理

func GetEnv

func GetEnv(envName string, defaultValues ...string) string

获取环境变量

func GoSafe

func GoSafe(fn func())

安全运行goroutine

func GraceRun

func GraceRun(app *fiber.App, timeout time.Duration)

Grace shutdown with timeout

func TaskWithTimeout

func TaskWithTimeout(task func() error, d time.Duration) bool

带时限的异步执行 返回true为超时、false为未超时

Types

This section is empty.

Directories

Path Synopsis
utils
jwt
orm

Jump to

Keyboard shortcuts

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