脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - go学习笔记读取consul配置文件详解

go学习笔记读取consul配置文件详解

2022-10-09 13:25dz45693 Golang

这篇文章主要为大家介绍了go学习笔记读取consul配置文件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

新建yaml文件

在上文我们的 go学习笔记:使用 consul 做服务发现和配置共享 这里我们单独来用viper实现读取consul的配置, 我习惯与用yaml格式, 所以 首先 新建yaml文件

?
1
2
3
4
5
6
7
8
9
store:
  book:
    - author: john
      price: 10
    - author: ken
      price: 12
  bicycle:
    color: red
    price: 19.95

go学习笔记读取consul配置文件详解

读取远程配置

可以直接调用viper.AddRemoteProvider读取远程配置, 也可以用github.com/hashicorp/consul/api 来读取consul的内容, 然后在用viper读取,

整改代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package main
import (
    "bytes"
    "fmt"
    "log"
    "time"
    consulapi "github.com/hashicorp/consul/api"
    "github.com/hashicorp/consul/api/watch"
    "github.com/spf13/viper"
    _ "github.com/spf13/viper/remote"
)
var (
    defaultConfig *viper.Viper
    consulAddress string
    consulPath    string
)
func initConfig() *viper.Viper {
    consulAddress = "http://192.168.100.19:8500"
    consulPath = "config/v1/local"
    defaultConfig = viper.New()
    defaultConfig.SetConfigType("yaml")
    consulClient, err := consulapi.NewClient(&consulapi.Config{Address: consulAddress})
    if err != nil {
        log.Fatalln("consul连接失败:", err)
    }
    kv, _, err := consulClient.KV().Get(consulPath, nil)
    if err != nil {
        log.Fatalln("consul获取配置失败:", err)
    }
    err = defaultConfig.ReadConfig(bytes.NewBuffer(kv.Value))
    if err != nil {
        log.Fatalln("Viper解析配置失败:", err)
    }
    go watchConfig()
    return defaultConfig
}
func watchConfig() {
    time.Sleep(time.Second * 10)
    params := make(map[string]interface{})
    params["type"] = "key"
    params["key"] = consulPath
    w, err := watch.Parse(params)
    if err != nil {
        log.Fatalln(err)
    }
    w.Handler = func(u uint64, i interface{}) {
        kv := i.(*consulapi.KVPair)
        hotconfig := viper.New()
        hotconfig.SetConfigType("yaml")
        err = hotconfig.ReadConfig(bytes.NewBuffer(kv.Value))
        if err != nil {
            log.Fatalln("Viper解析配置失败:", err)
        }
        defaultConfig = hotconfig
    }
    err = w.Run(consulAddress)
    if err != nil {
        log.Fatalln("监听consul错误:", err)
    }
}
func GetConfig() *viper.Viper {
    if defaultConfig == nil {
        defaultConfig = initConfig()
    }
    return defaultConfig
}
func main() {
    ReadOne()
    go func() {
        for {
            host := GetConfig().GetString("store.bicycle.color")
            fmt.Println("consul===", host)
            time.Sleep(time.Second * 10)
        }
    }()
    select {}
}
func ReadOne() {
    runtimeConfig := viper.New()
    runtimeConfig.AddRemoteProvider("consul", "http://192.168.100.19:8500", "config/v1/local")
    runtimeConfig.SetConfigType("yaml")
    err := runtimeConfig.ReadRemoteConfig()
    if err != nil {
        log.Fatalln("viper read:", err)
    }
    err = runtimeConfig.WatchRemoteConfigOnChannel()
    if err != nil {
        log.Fatalln("viper watch err:", err)
    }
    go func() {
        for {
            host := runtimeConfig.GetString("store.bicycle.color")
            fmt.Println("viper=====", host)
            time.Sleep(time.Second * 10)
        }
    }()
}

如果遇到 

google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.31.0), but does not contain package google.golang.org/grpc/naming

这样的错误,可以在go.mod文件增加:

replace google.golang.org/grpc => google.golang.org/grpc v1.21.1

go学习笔记读取consul配置文件详解

以上就是go学习笔记读取consul配置文件详解的详细内容,更多关于go读取consul配置文件的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/majiang/p/14315879.html

延伸 · 阅读

精彩推荐
  • GolangGo语言中Select语句用法实例

    Go语言中Select语句用法实例

    这篇文章主要介绍了Go语言中Select语句用法,实例分析了select语句的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    不是JS5342020-04-18
  • GolangGolang 如何解析和生成json

    Golang 如何解析和生成json

    这篇文章主要介绍了Golang 如何解析和生成json,帮助大家更好的理解和学习golang,感兴趣的朋友可以了解下 ...

    Dabelv5312020-09-05
  • GolangGo语言用map实现堆栈功能的方法

    Go语言用map实现堆栈功能的方法

    这篇文章主要介绍了Go语言用map实现堆栈功能的方法,实例分析了Go语言使用map操作堆栈的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    小萝莉5682020-04-19
  • Golang浅谈Go中数字转换字符串的正确姿势

    浅谈Go中数字转换字符串的正确姿势

    这篇文章主要介绍了浅谈Go中数字转换字符串的正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    KevinYan8452020-05-29
  • Golanggolang的串行处理和并行处理区别

    golang的串行处理和并行处理区别

    golang对比其它语言最大的优势就是并行计算(一个go就能实现并发),工作中经常遇到并发的场景, 本文主要介绍了golang的串行处理和并行处理,感兴趣的可...

    吴楚衡12902021-08-14
  • Golang浅谈Go Slice 高级实践

    浅谈Go Slice 高级实践

    这篇文章主要介绍了浅谈Go Slice 高级实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    sxssxs4052020-05-19
  • Golang使用Lumberjack+zap进行日志切割归档操作

    使用Lumberjack+zap进行日志切割归档操作

    这篇文章主要介绍了使用Lumberjack+zap进行日志切割归档操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    线条君10652021-03-01
  • Golang基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    基于go+vue实现的golang每日新闻数据浏览与检索平台(推荐)

    gonews是基于 go+vue 实现的golang每日新闻浏览与检索平台,本文通过实例代码给大家讲解,介绍的非常详细,具有参考借鉴价值,需要的朋友参考下吧 ...

    艾逗笔6012020-05-13