golang环境变量与JSON配置自动解析重载插件库joshbetz/config的使用
golang环境变量与JSON配置自动解析重载插件库joshbetz/config的使用
简介
joshbetz/config 是一个小型 Go 配置库,它可以解析环境变量和 JSON 文件,并在收到 SIGHUP
信号时自动重新加载配置。
示例代码
下面是一个完整的示例代码,展示如何使用 joshbetz/config 库:
package main
import (
"fmt"
"net/http"
"github.com/joshbetz/config"
)
func main() {
// 初始化配置,指定配置文件路径为 config.json
c := config.New("config.json")
// 设置HTTP路由处理函数
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
var value string
// 从配置中获取"value"键的值
c.Get("value", &value)
fmt.Fprintf(w, "Value: %s", value)
})
// 启动HTTP服务器
http.ListenAndServe(":3000", nil)
}
配置文件示例
假设有一个 config.json
文件内容如下:
{
"value": "Hello, World!",
"debug": true,
"port": 8080
}
API说明
构造函数
func New(file string) *Config
初始化一个 Config 对象并设置 SIGHUP 监听器。
获取配置值
func (config *Config) Get(key string, v interface{}) error
从配置文件中获取指定键的值。v
可以是字符串、布尔值或浮点数的指针。
重新加载配置
func (config *Config) Reload()
手动重新加载配置文件。当收到 SIGHUP
信号时会自动调用此方法。
高级示例
下面是一个更完整的示例,展示如何同时使用环境变量和JSON配置:
package main
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"github.com/joshbetz/config"
)
type AppConfig struct {
Host string
Port int
Debug bool
Database struct {
Host string
Port int
Username string
Password string
}
}
func main() {
// 初始化配置
c := config.New("config.json")
// 设置信号处理,当收到SIGHUP时打印重新加载信息
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGHUP)
go func() {
for {
<-sigChan
log.Println("Received SIGHUP, config reloaded")
}
}()
// 从配置中读取值
var cfg AppConfig
c.Get("host", &cfg.Host)
c.Get("port", &cfg.Port)
c.Get("debug", &cfg.Debug)
c.Get("database.host", &cfg.Database.Host)
c.Get("database.port", &cfg.Database.Port)
c.Get("database.username", &cfg.Database.Username)
c.Get("database.password", &cfg.Database.Password)
// 打印配置
fmt.Printf("App Config: %+v\n", cfg)
}
这个库特别适合需要动态重新加载配置的长期运行服务,如Web服务器或后台服务。通过简单的API,您可以轻松地管理应用程序配置,并在运行时更新配置而无需重启服务。
更多关于golang环境变量与JSON配置自动解析重载插件库joshbetz/config的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang环境变量与JSON配置自动解析重载插件库joshbetz/config的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用joshbetz/config实现Golang环境变量与JSON配置自动解析重载
joshbetz/config 是一个实用的Go配置管理库,它支持从环境变量、JSON文件等多种来源加载配置,并支持配置变更时的自动重载。下面我将详细介绍它的使用方法。
安装
go get github.com/joshbetz/config
基本使用
1. 定义配置结构
首先定义一个结构体来表示你的配置:
type AppConfig struct {
Port int `json:"port" env:"APP_PORT"`
LogLevel string `json:"log_level" env:"LOG_LEVEL"`
Database struct {
Host string `json:"host" env:"DB_HOST"`
Username string `json:"username" env:"DB_USER"`
Password string `json:"password" env:"DB_PASS"`
} `json:"database"`
}
2. 初始化配置
package main
import (
"fmt"
"log"
"time"
"github.com/joshbetz/config"
)
func main() {
var cfg AppConfig
// 初始化配置,从config.json和环境变量加载
c, err := config.New("config.json", &cfg)
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// 打印初始配置
fmt.Printf("Initial config: %+v\n", cfg)
// 设置自动重载间隔为5秒
c.AutoRefresh(5 * time.Second)
// 添加配置变更回调
c.OnChange(func(newConfig interface{}) {
fmt.Println("Config changed!")
updated := newConfig.(*AppConfig)
fmt.Printf("New config: %+v\n", *updated)
})
// 保持程序运行以观察配置变更
select {}
}
3. 配置文件示例 (config.json)
{
"port": 8080,
"log_level": "info",
"database": {
"host": "localhost",
"username": "admin",
"password": "secret"
}
}
高级特性
1. 环境变量覆盖
环境变量的优先级高于JSON文件中的配置。例如:
export APP_PORT=9090
export DB_HOST=production.db.example.com
程序启动时会优先使用这些环境变量的值。
2. 多配置文件支持
可以指定多个配置文件,后面的文件会覆盖前面的配置:
c, err := config.New("config.default.json", "config.json", &cfg)
3. 自定义加载器
你可以实现自己的配置加载器:
type CustomLoader struct{}
func (l *CustomLoader) Load(cfg interface{}) error {
// 自定义加载逻辑
return nil
}
c.AddLoader(&CustomLoader{})
4. 手动刷新配置
if err := c.Refresh(); err != nil {
log.Printf("Failed to refresh config: %v", err)
}
实际应用示例
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/joshbetz/config"
)
type ServerConfig struct {
Port int `json:"port" env:"PORT"`
Timeout time.Duration `json:"timeout" env:"TIMEOUT"`
FeatureFlag bool `json:"feature_flag" env:"FEATURE_FLAG"`
}
func main() {
var cfg ServerConfig
// 初始化配置
c, err := config.New("config.json", &cfg)
if err != nil {
log.Fatal(err)
}
// 设置自动重载
c.AutoRefresh(10 * time.Second)
// 启动HTTP服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if cfg.FeatureFlag {
fmt.Fprintf(w, "New feature is enabled! Timeout: %v", cfg.Timeout)
} else {
fmt.Fprintf(w, "Standard response. Port: %d", cfg.Port)
}
})
log.Printf("Starting server on :%d", cfg.Port)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", cfg.Port), nil)
}
注意事项
- 配置结构体字段必须是可导出的(首字母大写)
- 环境变量名称默认是全大写的结构体字段名,可以通过
env
标签自定义 - 自动重载会定期检查文件修改时间,可能不适合高性能场景
- 对于敏感信息,建议使用环境变量而非配置文件
joshbetz/config 提供了一种简单灵活的方式来管理应用程序配置,特别适合需要动态重载配置的场景。通过合理使用环境变量和配置文件,可以实现开发、测试和生产环境之间的无缝切换。