添加数据源配置

添加数据源重载
This commit is contained in:
Shikong 2022-10-04 00:24:41 +08:00
parent 33c4b2dca2
commit cd33f1e307
10 changed files with 206 additions and 143 deletions

92
app.go Normal file
View File

@ -0,0 +1,92 @@
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/spf13/viper"
"gofiber.study.skcks.cn/common/config"
"gofiber.study.skcks.cn/common/errorx"
"gofiber.study.skcks.cn/common/logger"
"gofiber.study.skcks.cn/common/response"
"gofiber.study.skcks.cn/controller"
"gofiber.study.skcks.cn/global"
"xorm.io/xorm"
)
func loadApp() {
err := viper.Unmarshal(global.Config)
if err != nil {
logger.Log.Fatalf("配置文件解析失败: %s", err)
}
logger.Log.Infof("\n%#v", global.Config)
reloadDataSources(global.Config)
app = reloadApp(global.Config)
if err := app.Listen(global.Config.Server.Addr); err != nil {
logger.Log.Fatalf("[服务] 致命错误: %s", err)
}
}
func reloadDataSources(c *config.BasicConfig) {
if global.DataSources != nil {
_ = global.DataSources.Close()
}
connGroup, err := xorm.NewEngineGroup("mysql", c.Mysql.DataSources)
if err != nil {
logger.Log.Fatalf("[x] [数据源] 致命错误: %s", err)
}
logger.Log.Infoln("[√] [初始化数据源]")
global.DataSources = connGroup
}
func reloadApp(c *config.BasicConfig) *fiber.App {
if app != nil {
_ = app.Shutdown()
}
app := fiber.New(fiber.Config{
Prefork: c.Server.PreFork,
CaseSensitive: c.Server.CaseSensitive,
StrictRouting: c.Server.StrictRouting,
ServerHeader: c.Server.ServerHeader,
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError
if e, ok := err.(*fiber.Error); ok {
code = e.Code
}
err = ctx.Status(code).JSON(errorx.NewDefaultError(err.Error()))
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}
return nil
},
})
routes(app)
controller.SwaggerHandler(app)
controller.HelloWorld(app)
controller.ErrorHandler(app)
logger.Log.Infoln("[√] [服务启动完成]")
return app
}
// routes
// @Summary 获取所有路由
// @Description 获取所有路由信息
// @Tags Routes
// @Accept json
// @Produce json
// @Success 200 {object} response.Response(Data=[][]fiber.Route)
// @Router /routes [get]
func routes(app *fiber.App) {
app.Get("/routes", func(ctx *fiber.Ctx) error {
return ctx.JSON(response.NewResponse(app.Stack()))
})
}

View File

@ -3,7 +3,9 @@ package config
type BasicConfig struct {
Server ServerConfig `yaml:"server"`
DataSources []DataBaseConfig `yaml:"dataSources"`
Mysql struct {
DataSources []string `yaml:"dataSources"`
} `yaml:"mysql"`
}
type ServerConfig struct {
@ -19,11 +21,6 @@ type ServerConfig struct {
ServerHeader string `yaml:"serverHeader"`
}
type DataBaseConfig struct {
Addr string `yaml:"addr"`
DB string `yaml:"db"`
}
type RedisConfig struct {
Addr string `yaml:"addr"`
Pass string `yaml:"pass"`

5
common/logger/logger.go Normal file
View File

@ -0,0 +1,5 @@
package logger
import "gofiber.study.skcks.cn/logger"
var Log = logger.Logger()

View File

@ -4,3 +4,7 @@ server:
caseSensitive: true
strictRouting: false
serverHeader: SkServer
mysql:
dataSources:
- root:12341234@tcp(10.10.10.100:3306)/gofiber?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai

53
controller/controller.go Normal file
View File

@ -0,0 +1,53 @@
package controller
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/swagger"
"gofiber.study.skcks.cn/common/errorx"
"gofiber.study.skcks.cn/common/logger"
"gofiber.study.skcks.cn/common/response"
)
// HelloWorld
//
// @Summary HelloWorld
// @Description 简单的 HelloWorld 示例
// @Tags HelloWorld
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=string}
// @Failure default {object} errorx.CodeErrorResponse
// @Router / [get]
func HelloWorld(app *fiber.App) {
app.Get("/", func(c *fiber.Ctx) error {
logger.Log.Infof("\n%s", c.Request().String())
return c.JSON(response.NewResponse("Hello, World 👋!"))
})
}
// ErrorHandler
//
// @Summary 错误处理
// @Description 错误信息示例
// @Tags Error
// @Accept json
// @Produce json
// @Failure default {object} errorx.CodeErrorResponse
// @Router /error [get]
// @Router /error [post]
// @Router /error [put]
// @Router /error [delete]
// @Router /error [patch]
func ErrorHandler(app *fiber.App) {
app.All("/error", func(ctx *fiber.Ctx) error {
return ctx.JSON(errorx.NewDefaultError("错误信息示例"))
})
}
func SwaggerHandler(app *fiber.App) {
app.Get("/swagger/*", swagger.New(swagger.Config{
DeepLinking: false,
// Expand ("list") or Collapse ("none") tag groups by default
DocExpansion: "list",
}))
}

View File

@ -150,27 +150,6 @@ const docTemplate = `{
}
}
},
"head": {
"description": "错误信息示例",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Error"
],
"summary": "错误处理",
"responses": {
"default": {
"description": "",
"schema": {
"$ref": "#/definitions/errorx.CodeErrorResponse"
}
}
}
},
"patch": {
"description": "错误信息示例",
"consumes": [
@ -192,6 +171,29 @@ const docTemplate = `{
}
}
}
},
"/routes": {
"get": {
"description": "获取所有路由信息",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Routes"
],
"summary": "获取所有路由",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
}
}
}
}
},
"definitions": {

View File

@ -142,27 +142,6 @@
}
}
},
"head": {
"description": "错误信息示例",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Error"
],
"summary": "错误处理",
"responses": {
"default": {
"description": "",
"schema": {
"$ref": "#/definitions/errorx.CodeErrorResponse"
}
}
}
},
"patch": {
"description": "错误信息示例",
"consumes": [
@ -184,6 +163,29 @@
}
}
}
},
"/routes": {
"get": {
"description": "获取所有路由信息",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"Routes"
],
"summary": "获取所有路由",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/response.Response"
}
}
}
}
}
},
"definitions": {

View File

@ -85,20 +85,6 @@ paths:
summary: 错误处理
tags:
- Error
head:
consumes:
- application/json
description: 错误信息示例
produces:
- application/json
responses:
default:
description: ""
schema:
$ref: '#/definitions/errorx.CodeErrorResponse'
summary: 错误处理
tags:
- Error
patch:
consumes:
- application/json
@ -141,4 +127,19 @@ paths:
summary: 错误处理
tags:
- Error
/routes:
get:
consumes:
- application/json
description: 获取所有路由信息
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/response.Response'
summary: 获取所有路由
tags:
- Routes
swagger: "2.0"

5
global/datasources.go Normal file
View File

@ -0,0 +1,5 @@
package global
import "xorm.io/xorm"
var DataSources *xorm.EngineGroup

110
main.go
View File

@ -3,19 +3,15 @@ package main
import (
"github.com/fsnotify/fsnotify"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/swagger"
"github.com/spf13/viper"
"gofiber.study.skcks.cn/common/errorx"
"gofiber.study.skcks.cn/common/response"
"gofiber.study.skcks.cn/global"
"gofiber.study.skcks.cn/logger"
"gofiber.study.skcks.cn/common/logger"
"os"
"os/signal"
_ "github.com/go-sql-driver/mysql"
_ "gofiber.study.skcks.cn/docs"
)
var log = logger.Logger()
var app *fiber.App
// @title GoFiber Study API
@ -35,15 +31,15 @@ func main() {
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
log.Fatalf("未找到配置文件")
logger.Log.Fatalf("未找到配置文件")
} else {
log.Fatalf("配置解析失败 %s", err)
logger.Log.Fatalf("配置解析失败 %s", err)
}
}
viper.WatchConfig()
viper.OnConfigChange(func(in fsnotify.Event) {
log.Infoln(in.Name)
logger.Log.Infoln(in.Name)
loadApp()
})
@ -52,99 +48,5 @@ func main() {
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Infof("关闭服务")
}
func loadApp() {
err := viper.Unmarshal(global.Config)
if err != nil {
log.Fatalf("配置文件解析失败: %s", err)
}
log.Infof("\n%#v", global.Config)
if app != nil {
_ = app.Shutdown()
}
app = createApp()
if err := app.Listen(global.Config.Server.Addr); err != nil {
log.Fatalf("致命错误: %s", err)
}
}
func createApp() *fiber.App {
app := fiber.New(fiber.Config{
Prefork: global.Config.Server.PreFork,
CaseSensitive: global.Config.Server.CaseSensitive,
StrictRouting: global.Config.Server.StrictRouting,
ServerHeader: global.Config.Server.ServerHeader,
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError
if e, ok := err.(*fiber.Error); ok {
code = e.Code
}
err = ctx.Status(code).JSON(errorx.NewDefaultError(err.Error()))
if err != nil {
return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
}
return nil
},
})
swaggerHandler(app)
helloWorld(app)
errorHandler(app)
app.Get("/routes", func(ctx *fiber.Ctx) error {
return ctx.JSON(response.NewResponse(app.Stack()))
})
return app
}
// helloWorld
//
// @Summary HelloWorld
// @Description 简单的 HelloWorld 示例
// @Tags HelloWorld
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=string}
// @Failure default {object} errorx.CodeErrorResponse
// @Router / [get]
func helloWorld(app *fiber.App) {
app.Get("/", func(c *fiber.Ctx) error {
log.Infof("\n%s", c.Request().String())
return c.JSON(response.NewResponse("Hello, World 👋!"))
})
}
// errorHandler
//
// @Summary 错误处理
// @Description 错误信息示例
// @Tags Error
// @Accept json
// @Produce json
// @Failure default {object} errorx.CodeErrorResponse
// @Router /error [get]
// @Router /error [post]
// @Router /error [put]
// @Router /error [delete]
// @Router /error [patch]
// @Router /error [head]
func errorHandler(app *fiber.App) {
app.All("/error", func(ctx *fiber.Ctx) error {
return ctx.JSON(errorx.NewDefaultError("错误信息示例"))
})
}
func swaggerHandler(app *fiber.App) {
app.Get("/swagger/*", swagger.New(swagger.Config{
DeepLinking: false,
// Expand ("list") or Collapse ("none") tag groups by default
DocExpansion: "list",
}))
logger.Log.Infof("关闭服务")
}