mirror of
https://gitee.com/shikong-sk/gofiber-study
synced 2025-02-23 23:32:15 +08:00
添加数据源配置
添加数据源重载
This commit is contained in:
parent
33c4b2dca2
commit
cd33f1e307
92
app.go
Normal file
92
app.go
Normal 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()))
|
||||||
|
})
|
||||||
|
}
|
@ -3,7 +3,9 @@ package config
|
|||||||
type BasicConfig struct {
|
type BasicConfig struct {
|
||||||
Server ServerConfig `yaml:"server"`
|
Server ServerConfig `yaml:"server"`
|
||||||
|
|
||||||
DataSources []DataBaseConfig `yaml:"dataSources"`
|
Mysql struct {
|
||||||
|
DataSources []string `yaml:"dataSources"`
|
||||||
|
} `yaml:"mysql"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ServerConfig struct {
|
type ServerConfig struct {
|
||||||
@ -19,11 +21,6 @@ type ServerConfig struct {
|
|||||||
ServerHeader string `yaml:"serverHeader"`
|
ServerHeader string `yaml:"serverHeader"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DataBaseConfig struct {
|
|
||||||
Addr string `yaml:"addr"`
|
|
||||||
DB string `yaml:"db"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type RedisConfig struct {
|
type RedisConfig struct {
|
||||||
Addr string `yaml:"addr"`
|
Addr string `yaml:"addr"`
|
||||||
Pass string `yaml:"pass"`
|
Pass string `yaml:"pass"`
|
||||||
|
5
common/logger/logger.go
Normal file
5
common/logger/logger.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
import "gofiber.study.skcks.cn/logger"
|
||||||
|
|
||||||
|
var Log = logger.Logger()
|
@ -4,3 +4,7 @@ server:
|
|||||||
caseSensitive: true
|
caseSensitive: true
|
||||||
strictRouting: false
|
strictRouting: false
|
||||||
serverHeader: SkServer
|
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
53
controller/controller.go
Normal 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",
|
||||||
|
}))
|
||||||
|
}
|
44
docs/docs.go
44
docs/docs.go
@ -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": {
|
"patch": {
|
||||||
"description": "错误信息示例",
|
"description": "错误信息示例",
|
||||||
"consumes": [
|
"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": {
|
"definitions": {
|
||||||
|
@ -142,27 +142,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"head": {
|
|
||||||
"description": "错误信息示例",
|
|
||||||
"consumes": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"produces": [
|
|
||||||
"application/json"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"Error"
|
|
||||||
],
|
|
||||||
"summary": "错误处理",
|
|
||||||
"responses": {
|
|
||||||
"default": {
|
|
||||||
"description": "",
|
|
||||||
"schema": {
|
|
||||||
"$ref": "#/definitions/errorx.CodeErrorResponse"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"patch": {
|
"patch": {
|
||||||
"description": "错误信息示例",
|
"description": "错误信息示例",
|
||||||
"consumes": [
|
"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": {
|
"definitions": {
|
||||||
|
@ -85,20 +85,6 @@ paths:
|
|||||||
summary: 错误处理
|
summary: 错误处理
|
||||||
tags:
|
tags:
|
||||||
- Error
|
- Error
|
||||||
head:
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
description: 错误信息示例
|
|
||||||
produces:
|
|
||||||
- application/json
|
|
||||||
responses:
|
|
||||||
default:
|
|
||||||
description: ""
|
|
||||||
schema:
|
|
||||||
$ref: '#/definitions/errorx.CodeErrorResponse'
|
|
||||||
summary: 错误处理
|
|
||||||
tags:
|
|
||||||
- Error
|
|
||||||
patch:
|
patch:
|
||||||
consumes:
|
consumes:
|
||||||
- application/json
|
- application/json
|
||||||
@ -141,4 +127,19 @@ paths:
|
|||||||
summary: 错误处理
|
summary: 错误处理
|
||||||
tags:
|
tags:
|
||||||
- Error
|
- 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"
|
swagger: "2.0"
|
||||||
|
5
global/datasources.go
Normal file
5
global/datasources.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package global
|
||||||
|
|
||||||
|
import "xorm.io/xorm"
|
||||||
|
|
||||||
|
var DataSources *xorm.EngineGroup
|
110
main.go
110
main.go
@ -3,19 +3,15 @@ package main
|
|||||||
import (
|
import (
|
||||||
"github.com/fsnotify/fsnotify"
|
"github.com/fsnotify/fsnotify"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/gofiber/swagger"
|
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"gofiber.study.skcks.cn/common/errorx"
|
"gofiber.study.skcks.cn/common/logger"
|
||||||
"gofiber.study.skcks.cn/common/response"
|
|
||||||
"gofiber.study.skcks.cn/global"
|
|
||||||
"gofiber.study.skcks.cn/logger"
|
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
_ "gofiber.study.skcks.cn/docs"
|
_ "gofiber.study.skcks.cn/docs"
|
||||||
)
|
)
|
||||||
|
|
||||||
var log = logger.Logger()
|
|
||||||
var app *fiber.App
|
var app *fiber.App
|
||||||
|
|
||||||
// @title GoFiber Study API
|
// @title GoFiber Study API
|
||||||
@ -35,15 +31,15 @@ func main() {
|
|||||||
|
|
||||||
if err := viper.ReadInConfig(); err != nil {
|
if err := viper.ReadInConfig(); err != nil {
|
||||||
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
||||||
log.Fatalf("未找到配置文件")
|
logger.Log.Fatalf("未找到配置文件")
|
||||||
} else {
|
} else {
|
||||||
log.Fatalf("配置解析失败 %s", err)
|
logger.Log.Fatalf("配置解析失败 %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
viper.WatchConfig()
|
viper.WatchConfig()
|
||||||
viper.OnConfigChange(func(in fsnotify.Event) {
|
viper.OnConfigChange(func(in fsnotify.Event) {
|
||||||
log.Infoln(in.Name)
|
logger.Log.Infoln(in.Name)
|
||||||
loadApp()
|
loadApp()
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -52,99 +48,5 @@ func main() {
|
|||||||
quit := make(chan os.Signal)
|
quit := make(chan os.Signal)
|
||||||
signal.Notify(quit, os.Interrupt)
|
signal.Notify(quit, os.Interrupt)
|
||||||
<-quit
|
<-quit
|
||||||
log.Infof("关闭服务")
|
logger.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",
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user