Files
workspace/code/allapp/allapp-go/config/index.go
T
2026-03-08 22:17:01 +08:00

152 lines
2.8 KiB
Go

package config
import (
"allapp/db"
"allapp/utils/redisx"
"bytes"
_ "embed"
"fmt"
"os"
"strings"
"time"
"github.com/spf13/viper"
)
var (
conf *Config
)
func InitConfig() error {
// 加载配置
err := readConfigFile()
if err != nil {
return fmt.Errorf("read config file failed: %w", err)
}
initLogger()
initUniqueId()
// 加载数据库
pool, queries, err := initDB()
if err != nil {
return fmt.Errorf("加载数据库失败: %w", err)
}
db.Pool = pool
db.Queries = queries
// 加载 redis
redis, err := initRedis()
if err != nil {
return fmt.Errorf("加载Redis失败: %w", err)
}
redisx.Client = redis
return nil
}
func defaultConfig() *Config {
return &Config{
Server: ServerConfig{
Port: "8080",
BaseUrl: "/",
WsUrl: "/ws",
},
JWT: JwtConfig{
Secret: "qwemwddlalmskadklsdklamlkdsakld",
AccessExpiry: 24 * time.Hour,
},
UniqueID: UniqueIDConfig{
DataCenterID: 1,
WorkerID: 1,
},
Postgres: PostgresConfig{
Port: 5432,
SslMode: false,
TimeZone: "Asia/Shanghai",
MaxOpenConns: 20,
MaxIdleConns: 10,
ConnMaxLifetime: 30 * time.Minute,
},
Log: LogConfig{
Level: "info",
Dir: "logs",
MaxSize: 100,
MaxBackups: 10,
MaxAge: 30,
Compress: true,
},
Redis: RedisConfig{
Port: 6379,
},
}
}
//go:embed resources/application.yaml
var defaultYaml []byte
//go:embed resources/application-dev.yaml
var devYaml []byte
//go:embed resources/application-build.yaml
var buildYaml []byte
func readConfigFile() error {
conf = defaultConfig()
env := GetEnv()
v := viper.New()
v.SetConfigType("yaml")
// 读取默认配置
if err := v.ReadConfig(bytes.NewReader(defaultYaml)); err != nil {
return fmt.Errorf("read default config failed: %w", err)
}
// 根据环境合并
switch env {
case "build":
if err := v.MergeConfig(bytes.NewReader(buildYaml)); err != nil {
return fmt.Errorf("merge build config failed: %w", err)
}
default: // dev 或其他值都使用 dev
if err := v.MergeConfig(bytes.NewReader(devYaml)); err != nil {
return fmt.Errorf("merge dev config failed: %w", err)
}
}
if err := v.Unmarshal(&conf); err != nil {
return fmt.Errorf("unmarshal config failed: %w", err)
}
conf.Env = env
fmt.Println("✅ 加载配置成功, 环境:", env)
return nil
}
// GetEnv 获取 GO_ENV 环境变量,默认返回 "dev"
func GetEnv() string {
e := os.Getenv("GO_ENV")
if len(e) == 0 {
// 如果没有设置 GO_ENV,使用默认的 "dev" 配置
return "dev"
}
return e
}
// GetConf 获取配置信息
func GetConf() *Config {
return conf
}
// GetServerPort 项目启动端口
func GetServerPort() string {
port := conf.Server.Port
if strings.HasPrefix(port, ":") {
return port
}
return ":" + port
}