This commit is contained in:
oneao committed 2025-08-11 17:29:58 +08:00
1 parent 7c8e2906bc
commit 72a1a9184a
25 files changed
+744 -125

No files matched your search

Whitespace-only changes.
@@ -0,0 +1,40 @@
package app
import (
"github.com/spf13/viper"
"time"
)
type ServerConfig struct {
Port int
}
type JWTConfig struct {
Secret string
Expiry time.Duration
}
var (
Server ServerConfig
JWT JWTConfig
)
func InitAppConfig(configPath string) (error, error) {
v := viper.New()
v.SetConfigFile(configPath)
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
return err, nil
}
if err := v.UnmarshalKey("server", &Server); err != nil {
return err, nil
}
if err := v.UnmarshalKey("jwt", &JWT); err != nil {
return err, nil
}
return nil, nil
}
@@ -0,0 +1,5 @@
server:
port: 8082
jwt:
secret: 3Bde3BGEbYqtqyEUzW3ry8jKFcaPH17fRmTmqE7MDr05Lwj95uruRKrrkb44TJ4s
expiry: 43200 # 12 * 60 * 60 秒过期
@@ -0,0 +1,80 @@
package app
import (
"fmt"
"log"
"sync"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
// DBConfig 数据库单个配置结构
type DBConfig struct {
Host string
Port int
Username string
Password string
Dbname string
}
// dbConfigs 全局变量,存放所有数据库配置,key为配置名,如 test1, test2
var (
dbConfigs map[string]DBConfig
mu sync.RWMutex
v *viper.Viper
)
// InitDBConfig 初始化并加载 db.yaml 配置,同时启动监听
func InitDBConfig(configPath string) error {
v = viper.New()
v.SetConfigFile(configPath)
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
return fmt.Errorf("读取数据库配置失败: %w", err)
}
if err := unmarshalConfigs(); err != nil {
return err
}
// 监听配置文件变化
v.WatchConfig()
v.OnConfigChange(func(e fsnotify.Event) {
log.Printf("数据库配置文件发生变化: %s\n", e.Name)
if err := unmarshalConfigs(); err != nil {
log.Printf("重新加载数据库配置失败: %v\n", err)
} else {
log.Println("数据库配置已更新")
}
})
return nil
}
// unmarshalConfigs 解析配置到全局变量,内部加锁保证并发安全
func unmarshalConfigs() error {
mu.Lock()
defer mu.Unlock()
temp := make(map[string]DBConfig)
if err := v.Unmarshal(&temp); err != nil {
return fmt.Errorf("解析数据库配置失败: %w", err)
}
dbConfigs = temp
return nil
}
// GetDBConfigs 并发安全地返回当前的所有数据库配置副本
func GetDBConfigs() map[string]DBConfig {
mu.RLock()
defer mu.RUnlock()
// 返回一份拷贝,避免外部修改内部数据
res := make(map[string]DBConfig, len(dbConfigs))
for k, v := range dbConfigs {
res[k] = v
}
return res
}
@@ -0,0 +1,12 @@
test1:
host: 127.0.0.1
port: 5432
username: admin
password: 123456
dbname: test1
test2:
host: 127.0.0.1
port: 5432
username: admin
password: 123456
dbname: test1