1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package main
- import (
- "context"
- "fmt"
- "github.com/spf13/viper"
- _ "github.com/spf13/viper/remote"
- clientv3 "go.etcd.io/etcd/client/v3"
- "time"
- )
- func main() {
- var (
- client *clientv3.Client
- config clientv3.Config
- err error
- )
- config = clientv3.Config{
- // 这里的 Endpoints 是一个字符串数组切片,支持配合多个节点
- Endpoints: []string{"106.54.33.152:2379"},
- // DialTimeout 连接超时设置
- DialTimeout: time.Duration(5) * time.Millisecond,
- }
- if client, err = clientv3.New(config); err != nil {
- return
- }
- // 设置 Viper 读取 etcd 配置
- err = viper.AddRemoteProvider("etcd3", "106.54.33.152:2379", "/config/app")
- if err != nil {
- return
- }
- viper.SetConfigType("json") // etcd 中存储的配置类型
- //读取配置
- err = viper.ReadRemoteConfig()
- if err != nil {
- fmt.Printf("Error reading remote config: %v\n", err)
- return
- }
- // 打印初始配置
- fmt.Println("Initial config:", viper.AllSettings())
- // 设置监听
- go ViperWatcher(client)
- time.Sleep(time.Second * 50)
- }
- func ViperWatcher(client *clientv3.Client) {
- ctx := context.Background()
- watch := client.Watch(ctx, "/config/app")
- for {
- select {
- case <-watch:
- err := viper.ReadRemoteConfig()
- if err != nil {
- fmt.Printf("Error reading remote config: %v\n", err)
- continue
- }
- fmt.Println("Updated config:", viper.AllSettings())
- }
- }
- }
|