golang模块化JSON配置管理插件库gone/jconf的使用
gone/jconf - Golang模块化JSON配置管理插件库使用指南
gone/jconf是一个模块化的JSON配置解析库,支持//注释并能够将整个结果数据层次结构完整序列化为JSON。
功能特点
- 允许你避免让主配置数据结构知道每个单独代码模块的内部配置结构
- 可以将模块配置数据结构与使用它们的代码放在一起
- 支持JSON注释(//)
- 支持完整的配置序列化
完整示例1:使用注释过滤预处理器
import (
"github.com/One-com/gone/jconf"
"encoding/json"
"os"
"bytes"
"log"
)
// 主应用配置结构
type AppConfig struct {
A string
S *jconf.MandatorySubConfig // 必须的子配置
}
// 模块配置结构
type ModuleConfig struct {
B string
}
// 带注释的JSON配置数据
var confdata2 = `// start comment
{
"a" : "app",
// comment
"s" : {
"b" : "x // y" // end line comment
}
}`
// 初始化子模块
func initSubModule(cfg jconf.SubConfig) {
var jc *ModuleConfig
err := cfg.ParseInto(&jc) // 将子配置解析到模块配置结构
if err != nil {
log.Fatal("Module Config parsing failed")
}
}
func main() {
// 主应用配置对象
cfg := &AppConfig{}
// 从字符串创建缓冲区
buf := bytes.NewBufferString(confdata2)
// 解析JSON配置到主配置结构
err := jconf.ParseInto(buf, &cfg)
if err != nil {
log.Fatal(err.Error())
}
// 让子模块解析自己的配置
initSubModule(cfg.S)
// 序列化配置并格式化输出
var out bytes.Buffer
b, err := json.Marshal(cfg)
if err != nil {
log.Fatalf("Marshal error: %s", err.Error())
}
err = json.Indent(&out, b, "", " ")
if err != nil {
log.Fatalf("Indent error: %s", err.Error())
}
out.WriteTo(os.Stdout)
}
完整示例2:仅使用子配置功能
import (
"github.com/One-com/gone/jconf"
"encoding/json"
"os"
"bytes"
"log"
)
// 主应用配置结构
type AppConfig struct {
A string
S *jconf.MandatorySubConfig // 必须的子配置
}
// 模块配置结构
type ModuleConfig struct {
B string
}
// 不带注释的JSON配置数据
var confdata = `{ "a" : "app", "s" : {"b": "module"}}`
// 初始化子模块
func initSubModule(cfg jconf.SubConfig) {
var jc *ModuleConfig
err := cfg.ParseInto(&jc) // 将子配置解析到模块配置结构
if err != nil {
log.Fatal("Module Config parsing failed")
}
}
func main() {
// 主应用配置对象
cfg := &AppConfig{}
// 创建JSON解码器
dec := json.NewDecoder(bytes.NewBuffer([]byte(confdata)))
dec.UseNumber()
// 解析主配置
err := dec.Decode(&cfg)
if err != nil {
log.Fatal(err.Error())
}
// 让子模块解析自己的配置
initSubModule(cfg.S)
// 序列化配置并格式化输出
var out bytes.Buffer
b, err := json.Marshal(cfg)
if err != nil {
log.Fatalf("Marshal error: %s", err)
}
err = json.Indent(&out, b, "", " ")
if err != nil {
log.Fatalf("Indent error: %s", err)
}
out.WriteTo(os.Stdout)
}
关键点说明
jconf.MandatorySubConfig
表示必须的子配置,如果配置中缺少会报错ParseInto
方法用于将子配置解析到目标结构体- 支持标准的JSON解析,同时增加了对//注释的支持
- 可以方便地将模块配置与主配置分离管理
这两个示例展示了如何使用gone/jconf库来管理模块化的JSON配置,第一个示例展示了带注释的JSON配置解析,第二个示例展示了基本的子配置功能。
更多关于golang模块化JSON配置管理插件库gone/jconf的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang模块化JSON配置管理插件库gone/jconf的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
gone/jconf - Go语言模块化JSON配置管理库
gone/jconf 是一个用于Go语言的模块化JSON配置管理库,它提供了灵活的配置加载、解析和管理功能。下面我将详细介绍其使用方法并提供示例代码。
安装
go get github.com/gone-io/jconf
基本功能
1. 加载JSON配置文件
package main
import (
"fmt"
"github.com/gone-io/jconf"
)
func main() {
// 加载JSON配置文件
config, err := jconf.LoadJsonConfig("config.json")
if err != nil {
panic(err)
}
// 获取配置值
appName := config.GetString("app.name", "defaultApp")
port := config.GetInt("server.port", 8080)
fmt.Printf("App Name: %s, Port: %d\n", appName, port)
}
2. 动态更新配置
// 监听配置文件变化
watcher, err := jconf.WatchConfig("config.json", func(newConfig *jconf.JsonConfig) {
fmt.Println("Config changed!")
// 处理配置变更
})
if err != nil {
panic(err)
}
// 程序结束时关闭监听
defer watcher.Close()
高级功能
1. 配置项验证
type ServerConfig struct {
Host string `json:"host" validate:"required"`
Port int `json:"port" validate:"min=1024,max=65535"`
}
func main() {
config, err := jconf.LoadJsonConfig("config.json")
if err != nil {
panic(err)
}
var serverCfg ServerConfig
if err := config.Unmarshal("server", &serverCfg); err != nil {
panic(err)
}
fmt.Printf("Server Config: %+v\n", serverCfg)
}
2. 多环境配置
func loadConfig(env string) (*jconf.JsonConfig, error) {
baseConfig, err := jconf.LoadJsonConfig("config/base.json")
if err != nil {
return nil, err
}
envConfig, err := jconf.LoadJsonConfig(fmt.Sprintf("config/%s.json", env))
if err != nil {
return nil, err
}
// 合并配置,envConfig会覆盖baseConfig中的相同配置项
merged := jconf.MergeConfigs(baseConfig, envConfig)
return merged, nil
}
func main() {
config, err := loadConfig("production")
if err != nil {
panic(err)
}
// 使用配置...
}
3. 自定义配置解析
type Duration time.Duration
func (d *Duration) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}
dur, err := time.ParseDuration(s)
if err != nil {
return err
}
*d = Duration(dur)
return nil
}
type AppConfig struct {
Timeout Duration `json:"timeout"`
}
func main() {
config, err := jconf.LoadJsonConfig("config.json")
if err != nil {
panic(err)
}
var appCfg AppConfig
if err := config.Unmarshal("app", &appCfg); err != nil {
panic(err)
}
fmt.Printf("Timeout: %v\n", time.Duration(appCfg.Timeout))
}
最佳实践
-
配置结构设计:
- 将配置按功能模块划分
- 为每个模块定义明确的结构体类型
- 添加必要的验证标签
-
错误处理:
- 总是检查配置加载和解析错误
- 在启动时验证关键配置项
-
环境管理:
- 使用不同的配置文件区分环境
- 通过环境变量指定当前环境
-
安全考虑:
- 不要将敏感信息直接放在配置文件中
- 考虑使用配置中心或密钥管理服务
完整示例
package main
import (
"fmt"
"log"
"time"
"github.com/gone-io/jconf"
)
type DBConfig struct {
Host string `json:"host" validate:"required"`
Port int `json:"port" validate:"min=1,max=65535"`
Username string `json:"username"`
Password string `json:"password"`
Database string `json:"database" validate:"required"`
}
type ServerConfig struct {
Port int `json:"port" validate:"min=1024,max=65535"`
Timeout time.Duration `json:"timeout"`
EnableHTTPS bool `json:"enable_https"`
}
type AppConfig struct {
Name string `json:"name" validate:"required"`
Version string `json:"version"`
Env string `json:"env"`
}
func main() {
// 加载配置
config, err := jconf.LoadJsonConfig("config.json")
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// 解析配置
var dbConfig DBConfig
if err := config.Unmarshal("database", &dbConfig); err != nil {
log.Fatalf("Failed to parse database config: %v", err)
}
var serverConfig ServerConfig
if err := config.Unmarshal("server", &serverConfig); err != nil {
log.Fatalf("Failed to parse server config: %v", err)
}
var appConfig AppConfig
if err := config.Unmarshal("app", &appConfig); err != nil {
log.Fatalf("Failed to parse app config: %v", err)
}
// 打印配置
fmt.Printf("Application: %s v%s (%s)\n", appConfig.Name, appConfig.Version, appConfig.Env)
fmt.Printf("Server: :%d, HTTPS: %v, Timeout: %v\n",
serverConfig.Port, serverConfig.EnableHTTPS, serverConfig.Timeout)
fmt.Printf("Database: %s@%s:%d/%s\n",
dbConfig.Username, dbConfig.Host, dbConfig.Port, dbConfig.Database)
// 监听配置变化
watcher, err := jconf.WatchConfig("config.json", func(newConfig *jconf.JsonConfig) {
log.Println("Configuration has been updated")
// 在这里处理配置更新逻辑
})
if err != nil {
log.Printf("Failed to watch config: %v", err)
}
defer watcher.Close()
// 保持程序运行...
select {}
}
gone/jconf 提供了强大而灵活的配置管理功能,适合各种规模的Go应用程序。通过合理设计配置结构和利用其提供的各种功能,可以大大简化应用程序的配置管理工作。