go学习笔记读取consul配置文件详解
作者:dz45693 发布时间:2024-05-09 10:08:14
标签: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
来源:https://www.cnblogs.com/majiang/p/14315879.html
0
投稿
猜你喜欢
- 同事在准备新老系统的切换,清空一个表的时候往往发现这个表的主键被另一个表用做外键,而系统里有太多层次的引用.所以清起来相当麻烦用下面这个脚本
- 写在前面最近有几个有趣的小想法想实践一下,希望使用低功耗、低成本的硬件跑一些持续性的独立的服务。最初的想法是入手一个树莓派得了,开发板尺寸小
- 去除HTML代码中所有标签<% '****************************** '函数:RemoveH
- 可直接用这行命令!: pip install -U scikit-learn其他命令: (1)更新pippython -m pip inst
- 由于本人经常使用笔记本共享WiFi,但是又不想笔记本开机一夜(为了低碳环保嘛 ~_~!),所以每次都要用使用DOS命令关机,感觉好麻烦。正好
- 在收发快递填写地址的时候,我们会经常手动输入地址让程序智能识别,标准的地址比如,xx省xx市xx县/区xx路xx号,不过有时候也可以简单写:
- 为了方便例子讲解,现有数组和json对象如下var demoArr = ['Javascript', 'Gulp
- 1 前言之前已经介绍了基金的变动信息,但是这些基金都是属于场外的,今天我们要介绍的是一个带门槛的投资产品-ETF。只有开立证券账户的玩家才能
- 关于数据库性能的故事面试时多多少少会讲到数据库上的事情,“你对数据库的掌握如何?”,什么时候最考验数据库的性能,答应主要方面上讲就是大数据量
- 爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法。python提供了强大的url库,想做到这个并不难。这里以登录学校教务
- 朋友需要一个工具,将图片中的文字提取出来。我帮他在网上找了一些OCR的应用,都不好用。所以准备自己研究,写一个Web APP供他使用。OCR
- 一、v-if和v-show区别① v-show严格意义来说其实是条件隐藏,直接在页面初始化的时候将DOM(对象模型)元素也初始化,因为它就是
- webpack我自己还在摸索学习中,今天给大家分享个用webpack把我们的业务模块分开打包的方法,顺便留个笔记 如何用webpa
- 包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等 (一)挂起操作 在安装Sq
- 排序排序是指以特定格式排列数据。排序算法指定以特定顺序排列数据的方式。最常见的顺序是数字或字典顺序。在 Numpy 中,我们可以使用库中提供
- 由于自己疏忽,导致请求错误405,然后前端数据传输没错,百度大都说跟post提交方式有关,改成get还是报错,检查才知道,controlle
- 本文实例讲述了Python走楼梯问题解决方法。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!python3
- 我就废话不多说了,大家还是直接看代码吧~import re s = 'alibaba阿里巴巴' # 待分割字符串en_let
- template 概述最近在做脚手架相关的内容, 研究了一下 Go 的 text/template 包, 接下来跟大家分享下 templat
- 一、this1.什么是thisthis 关键字在大部分语言中都是一个重要的存在,JS中自然不例外,其表达的意义丰富多样甚至有些复杂,深刻理解