Harvester 是一个强大的 Go 语言动态配置库,它允许应用程序在运行时动态更新配置而无需重启。以下是如何使用 Harvester 的基本指南,包括示例代码。
1. 安装 Harvester
首先,使用 Go 模块安装 Harvester:
go get github.com/beatlabs/harvester
2. 基本用法示例
Harvester 支持从多个来源(如环境变量、Consul)加载配置。以下是一个简单示例,展示如何定义配置结构并使用 Harvester 初始化。
package main
import (
"fmt"
"log"
"time"
"github.com/beatlabs/harvester"
"github.com/beatlabs/harvester/sync"
)
// 定义配置结构,使用标签指定来源
type Config struct {
Name sync.String `seed:"DefaultApp" env:"APP_NAME"`
Port sync.Int `seed:"8080" env:"APP_PORT"`
DebugMode sync.Bool `seed:"true" env:"DEBUG_MODE"`
}
func main() {
// 初始化配置实例
cfg := &Config{}
// 创建 Harvester 实例,指定配置来源(这里使用环境变量)
h, err := harvester.New(cfg).
WithEnv().
Create()
if err != nil {
log.Fatalf("Failed to create harvester: %v", err)
}
// 启动 Harvester 监控配置变化
if err = h.Start(); err != nil {
log.Fatalf("Failed to start harvester: %v", err)
}
// 在循环中打印当前配置值,观察动态更新
for {
fmt.Printf("Name: %s, Port: %d, DebugMode: %t\n", cfg.Name.Get(), cfg.Port.Get(), cfg.DebugMode.Get())
time.Sleep(5 * time.Second)
}
}
3. 集成 Consul 进行动态配置
Harvester 支持从 Consul 获取动态配置。以下示例展示如何设置 Consul 作为配置源。
首先,确保您有运行的 Consul 实例。然后,修改代码以包含 Consul 配置:
package main
import (
"fmt"
"log"
"time"
"github.com/beatlabs/harvester"
"github.com/beatlabs/harvester/sync"
)
type Config struct {
Name sync.String `seed:"DefaultApp" env:"APP_NAME" consul:"/config/app/name"`
Port sync.Int `seed:"8080" env:"APP_PORT" consul:"/config/app/port"`
}
func main() {
cfg := &Config{}
// 创建 Harvester,同时使用环境变量和 Consul
h, err := harvester.New(cfg).
WithEnv().
WithConsul("127.0.0.1:8500", "", 0). // Consul 地址、令牌和等待时间
Create()
if err != nil {
log.Fatalf("Failed to create harvester: %v", err)
}
if err = h.Start(); err != nil {
log.Fatalf("Failed to start harvester: %v", err)
}
for {
fmt.Printf("Name: %s, Port: %d\n", cfg.Name.Get(), cfg.Port.Get())
time.Sleep(5 * time.Second)
}
}
4. 处理配置变更通知
Harvester 允许注册变更处理器,以便在配置更新时执行自定义逻辑。以下示例添加一个变更监听器:
// 在 main 函数中添加变更监听
h, err := harvester.New(cfg).
WithEnv().
WithChangeListener(func(data interface{}) {
fmt.Println("Configuration updated:", data)
}).
Create()
if err != nil {
log.Fatalf("Failed to create harvester: %v", err)
}
5. 扩展接口
Harvester 设计为可扩展,您可以通过实现 harvester.ChangeNotifier 接口添加自定义配置源。参考官方文档了解高级用法。
通过以上示例,您可以快速集成 Harvester 到您的 Go 应用程序中,实现动态配置管理。如果有具体问题,请提供更多细节。