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

1 回复

更多关于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)
}

注意事项

  1. 配置结构体字段必须是可导出的(首字母大写)
  2. 环境变量名称默认是全大写的结构体字段名,可以通过env标签自定义
  3. 自动重载会定期检查文件修改时间,可能不适合高性能场景
  4. 对于敏感信息,建议使用环境变量而非配置文件

joshbetz/config 提供了一种简单灵活的方式来管理应用程序配置,特别适合需要动态重载配置的场景。通过合理使用环境变量和配置文件,可以实现开发、测试和生产环境之间的无缝切换。

回到顶部