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

 更新时间:2022年05月19日 10:28:31   作者:dz45693  
这篇文章主要为大家介绍了go学习笔记读取consul配置文件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

新建yaml文件

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

store:
  book:
    - author: john
      price: 10
    - author: ken
      price: 12
  bicycle:
    color: red
    price: 19.95

读取远程配置

可以直接调用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配置文件详解的详细内容,更多关于go读取consul配置文件的资料请关注脚本之家其它相关文章!

相关文章

  • golang中两个协程交替打印数字和字母的实现

    golang中两个协程交替打印数字和字母的实现

    这篇文章给大家介绍了golang中两个协程交替打印数字和字母的实现,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Windows下在CMD下执行Go出现中文乱码的解决方法

    Windows下在CMD下执行Go出现中文乱码的解决方法

    在cmd下运行go程序或者是GOLAND的Terminal下运行go程序会出现中文乱码的情况。本文就详细的介绍下解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Go框架自动化工具Beego使用详解

    Go框架自动化工具Beego使用详解

    这篇文章主要为大家介绍了Go框架自动化工具Beego使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 如何go语言比较两个对象是否深度相同

    如何go语言比较两个对象是否深度相同

    这篇文章主要介绍了如何go语言比较两个对象是否深度相同,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • GoLang基础学习之go test测试

    GoLang基础学习之go test测试

    相信每位编程开发者们应该都知道,Golang作为一门标榜工程化的语言,提供了非常简便、实用的编写单元测试的能力,下面这篇文章主要给大家介绍了关于GoLang基础学习之go test测试的相关资料,需要的朋友可以参考下
    2022-08-08
  • golang中定时器cpu使用率高的现象详析

    golang中定时器cpu使用率高的现象详析

    这篇文章主要给大家介绍了关于golang中定时器cpu使用率高的现象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Golang中的信号(Signal)机制详解

    Golang中的信号(Signal)机制详解

    Signal 是一种操作系统级别的事件通知机制,进程可以响应特定的系统信号,这些信号用于指示进程执行特定的操作,如程序终止、挂起、恢复等,Golang 的标准库 os/signal 提供了对信号处理的支持,本文将详细讲解 Golang 是如何处理和响应系统信号的,需要的朋友可以参考下
    2024-01-01
  • Golang中的panic之避免和处理程序中的异常情况

    Golang中的panic之避免和处理程序中的异常情况

    Golang中的panic是一种异常处理机制,可以在程序出现异常情况时终止程序并打印错误信息。为了避免panic对程序的影响,开发者可以采用一系列技巧,如defer+recover、编写可重入的代码、使用错误返回值等。这些技巧可以帮助开发者优雅地处理程序中的异常情况
    2023-04-04
  • go sync Once实现原理示例解析

    go sync Once实现原理示例解析

    这篇文章主要为大家介绍了go sync Once实现原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 简单对比一下 C语言 与 Go语言

    简单对比一下 C语言 与 Go语言

    这篇文章主要介绍了简单对比一下 C语言 与 Go语言的相关资料,需要的朋友可以参考下
    2023-08-08

最新评论