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

作者:dz45693 时间:2024-05-09 10:08:14 

新建yaml文件

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

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读取,

整改代码如下:

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配置文件详解

来源:https://www.cnblogs.com/majiang/p/14315879.html

标签:go,读取,consul,配置文件
0
投稿

猜你喜欢

  • mysql中的utf8与utf8mb4存储及区别

    2024-01-16 15:48:09
  • mysql jdbc连接步骤及常见参数

    2024-01-12 15:49:45
  • Python使用matplotlib 模块scatter方法画散点图示例

    2023-05-19 12:01:49
  • oracle常用函数汇总(分享)

    2024-01-12 17:03:56
  • python 使用pandas计算累积求和的方法

    2021-05-22 19:46:16
  • 基于pytorch中的Sequential用法说明

    2023-06-23 14:57:55
  • ASP.NET处理HTTP请求的流程:IHttpModule、IHttpHandler与管道事件

    2024-05-09 09:04:58
  • python Django模板的使用方法(图文)

    2022-03-30 04:23:52
  • 如何使用PHP计算上一个月的今天

    2023-11-15 14:16:25
  • Mysql实战练习之简单图书管理系统

    2024-01-17 14:09:32
  • SQL server 视图(view)介绍

    2024-01-19 17:52:06
  • Python获取时间戳代码实例

    2023-11-13 04:02:52
  • 一篇文章让你搞清楚JavaScript事件循环

    2024-04-19 09:53:02
  • 深入mysql基础知识的详解

    2024-01-21 06:04:45
  • python实现下载整个ftp目录的方法

    2023-01-31 01:45:17
  • python查询mysql中文乱码问题

    2021-09-28 07:05:42
  • 如何利用python在剪贴板上读取/写入数据

    2021-07-08 17:29:29
  • python简单实现最大似然估计&scipy库的使用详解

    2022-11-03 23:45:01
  • oracle数据库创建备份与恢复脚本整理

    2023-07-13 00:57:20
  • Vuex中actions的使用教程详解

    2024-04-30 08:45:29
  • asp之家 网络编程 m.aspxhome.com