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 {
|
||||
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
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
|
||||
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
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": {
|
||||
"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": {
|
||||
|
@ -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": {
|
||||
|
@ -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
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 (
|
||||
"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("关闭服务")
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user