Skip to content

配置说明

配置目录:configs/

configs/
├── dev.yaml    # 开发环境配置
├── test.yaml   # 测试环境配置
└── prod.yaml   # 生产环境配置

配置加载

加载优先级

  1. 环境变量 APP_ENV 决定加载哪个配置文件
  2. 默认加载 dev.yaml
bash
# 开发环境
export APP_ENV=dev

# 生产环境
export APP_ENV=prod

# 启动应用
go run main.go

环境变量覆盖

任何配置项都可以通过环境变量覆盖,格式:APP_<模块>_<字段>

bash
# 覆盖数据库密码
export APP_DATABASE_PASSWORD="new-password"

# 覆盖 Redis 地址
export APP_REDIS_HOST="remote-redis.com"

# 覆盖 JWT 密钥
export APP_SECURITY_JWT_SECRETKEY="new-secret"

数据库配置

yaml
database:
  host: www.youlai.tech      # MySQL 主机地址
  port: 3306                 # MySQL 端口
  username: youlai           # 数据库用户名
  password: 123456           # 数据库密码
  dbname: youlai_admin       # 数据库名称
  charset: utf8mb4           # 字符集
  parseTime: true            # 自动解析时间类型
  loc: Local                 # 时区设置

  # 连接池配置
  maxIdleConns: 10           # 最大空闲连接数
  maxOpenConns: 100          # 最大打开连接数
  connMaxLifetime: 3600      # 连接最大存活时间(秒)
配置项默认值说明
hostlocalhostMySQL 主机地址
port3306MySQL 端口
maxIdleConns10最大空闲连接数
maxOpenConns100最大打开连接数
connMaxLifetime3600连接最大存活时间(秒)

Redis 配置

yaml
redis:
  host: www.youlai.tech      # Redis 主机
  port: 6379                 # Redis 端口
  password: 123456           # Redis 密码
  database: 4                # Redis 数据库编号

  # 连接池配置
  pool:
    maxIdle: 10              # 最大空闲连接数
    maxActive: 100           # 最大活动连接数
    minIdle: 5               # 最小空闲连接数

  # 超时配置(秒)
  timeout:
    dial: 5                  # 建立连接超时
    read: 3                  # 读取超时
    write: 3                 # 写入超时
    pool: 5                  # 连接池获取连接超时

日志配置

yaml
logger:
  level: debug               # 日志级别

  console:
    enabled: true            # 是否启用控制台输出
    color: true              # 是否启用彩色输出
    format: text             # 输出格式:text/json

  file:
    enabled: true            # 是否启用文件输出
    path: logs/dev.log       # 日志文件路径
    maxSize: 100             # 单文件最大大小(MB)
    maxBackups: 7            # 保留旧文件数量
    maxAge: 7                # 保留天数
    compress: false          # 是否压缩旧日志
    errorPath: logs/dev-error.log  # 错误日志路径

安全配置

yaml
security:
  sessionType: jwt           # 会话类型:jwt/redis-token

  # JWT 配置
  jwt:
    secretKey: "change-me"   # JWT 签名密钥
    accessTokenTTL: 7200     # 访问令牌有效期(秒)
    refreshTokenTTL: 2592000 # 刷新令牌有效期(秒)
    enableSecurityVersion: true  # 启用安全版本号

  # Redis Token 配置
  redisToken:
    accessTokenTTL: 7200
    refreshTokenTTL: 2592000
    allowMultiLogin: true    # 是否允许多设备登录

会话模式

模式说明适用场景
jwt无状态,Token 自包含信息微服务、分布式
redis-token有状态,Token 存储在 Redis需要会话治理

环境差异

开发环境(dev.yaml)

  • 日志级别:debug
  • 控制台彩色输出
  • 允许多设备登录

生产环境(prod.yaml)

  • 日志级别:info
  • JSON 格式输出
  • 单设备登录
  • 更严格的密钥配置

配置读取

go
package config

import (
    "fmt"
    "os"
    "path/filepath"

    "github.com/spf13/viper"
)

// Load 加载指定环境的配置
// 环境优先级:参数 env > 环境变量 APP_ENV > 默认 dev
func Load(env ...string) error {
    // 确定环境
    environment := "dev"
    if len(env) > 0 && env[0] != "" {
        environment = env[0]
    } else if envVar := os.Getenv("APP_ENV"); envVar != "" {
        environment = envVar
    }

    // 配置文件名:dev.yaml / test.yaml / prod.yaml
    configFile := fmt.Sprintf("%s.yaml", environment)
    configPath := filepath.Join("configs", configFile)

    // 检查配置文件是否存在
    if _, err := os.Stat(configPath); os.IsNotExist(err) {
        return fmt.Errorf("配置文件不存在: %s", configPath)
    }

    v := viper.New()

    // 支持环境变量覆盖,前缀为 APP_
    v.SetEnvPrefix("APP")
    v.AutomaticEnv()

    // 设置配置文件
    v.SetConfigFile(configPath)
    v.SetConfigType("yaml")

    // 读取配置文件
    if err := v.ReadInConfig(); err != nil {
        return fmt.Errorf("读取配置文件失败: %w", err)
    }

    // 解析到配置结构体
    var cfg Config
    if err := v.Unmarshal(&cfg); err != nil {
        return fmt.Errorf("配置解析失败: %w", err)
    }

    Cfg = &cfg

    return nil
}

相关文件

文件说明
internal/common/config/loader.go配置加载逻辑
internal/common/config/config.go配置结构体定义
configs/dev.yaml开发环境配置
configs/prod.yaml生产环境配置
configs/test.yaml测试环境配置

基于 MIT 许可发布 · 由 ❤️ 和 ☕ 驱动 · 支持作者