golang-yitisheng-server/server/config/config.go

110 lines
3.1 KiB
Go

// Package config 应用配置
package config
import (
"fmt"
"os"
"gopkg.in/yaml.v3"
)
// AppConfig 应用配置
var AppConfig = &appConfig{}
type appConfig struct {
Log LogConfig `yaml:"log"`
Security SecurityConfig `yaml:"security"`
RateLimit RateLimitConfig `yaml:"rate_limit"`
Swagger SwaggerConfig `yaml:"swagger"`
Database DatabaseConfig `yaml:"database"`
Redis RedisConfig `yaml:"redis"`
}
// LogConfig 日志配置
type LogConfig struct {
Level string `yaml:"level"` // 日志级别
Dir string `yaml:"dir"` // 日志目录
Console bool `yaml:"console"` // 是否输出到控制台
}
// SecurityConfig 安全配置
type SecurityConfig struct {
Enable bool `yaml:"enable"` // 是否启用
HeaderKey string `yaml:"header_key"` // 请求头字段名
SecretKey string `yaml:"secret_key"` // 签名密钥
}
// RateLimitConfig 限流配置
type RateLimitConfig struct {
Enable bool `yaml:"enable"` // 是否启用
Default RateLimitRule `yaml:"default"` // 默认规则
Rules map[string]RateLimitRule `yaml:"rules"` // 特定路径规则
}
// RateLimitRule 限流规则
type RateLimitRule struct {
Interval int `yaml:"interval"` // 时间间隔(秒)
MaxRequests int `yaml:"max_requests"` // 最大请求次数
}
// SwaggerConfig Swagger文档认证配置
type SwaggerConfig struct {
User string `yaml:"user"`
Password string `yaml:"password"`
}
// DatabaseConfig 数据库配置
type DatabaseConfig struct {
Driver string `yaml:"driver"`
Host string `yaml:"host"`
Port int `yaml:"port"`
Database string `yaml:"database"`
Username string `yaml:"username"`
Password string `yaml:"password"`
Charset string `yaml:"charset"`
MaxIdleConns int `yaml:"max_idle_conns"`
MaxOpenConns int `yaml:"max_open_conns"`
ConnMaxLifetime int `yaml:"conn_max_lifetime"` // 小时
LogMode bool `yaml:"log_mode"` // 是否开启SQL日志
}
// RedisConfig Redis配置
type RedisConfig struct {
Addr string `yaml:"addr"`
Password string `yaml:"password"`
DB int `yaml:"db"`
}
// LoadConfig 加载配置
func LoadConfig() {
env := os.Getenv("GO_ENV")
if env == "" {
env = "dev"
}
configFile := fmt.Sprintf("config/config.%s.yaml", env)
// 如果是测试环境,可能需要从上级目录查找,这里简单处理,如果找不到尝试从根目录找
if _, err := os.Stat(configFile); os.IsNotExist(err) {
// 尝试在当前目录下找 (比如在 server 目录下运行)
configFile = fmt.Sprintf("config.%s.yaml", env)
if _, err := os.Stat(configFile); os.IsNotExist(err) {
// 如果是单元测试,可能在 tests 目录下
configFile = fmt.Sprintf("../config/config.%s.yaml", env)
}
}
fmt.Printf("正在加载配置文件: %s\n", configFile)
data, err := os.ReadFile(configFile)
if err != nil {
fmt.Printf("读取配置文件失败: %v, 使用默认配置\n", err)
return
}
err = yaml.Unmarshal(data, AppConfig)
if err != nil {
fmt.Printf("解析配置文件失败: %v\n", err)
panic(err)
}
}