最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go學(xué)習(xí)筆記讀取consul配置文件詳解

 更新時(shí)間:2022年05月19日 10:28:31   作者:dz45693  
這篇文章主要為大家介紹了go學(xué)習(xí)筆記讀取consul配置文件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

新建yaml文件

在上文我們的 go學(xué)習(xí)筆記:使用 consul 做服務(wù)發(fā)現(xiàn)和配置共享 這里我們單獨(dú)來用viper實(shí)現(xiàn)讀取consul的配置, 我習(xí)慣與用yaml格式, 所以 首先 新建yaml文件

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

讀取遠(yuǎn)程配置

可以直接調(diào)用viper.AddRemoteProvider讀取遠(yuǎn)程配置, 也可以用github.com/hashicorp/consul/api 來讀取consul的內(nèi)容, 然后在用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("監(jiān)聽consul錯(cuò)誤:", 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

這樣的錯(cuò)誤,可以在go.mod文件增加:

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

以上就是go學(xué)習(xí)筆記讀取consul配置文件詳解的詳細(xì)內(nèi)容,更多關(guān)于go讀取consul配置文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決Go中攔截HTTP流數(shù)據(jù)時(shí)字段丟失的問題

    解決Go中攔截HTTP流數(shù)據(jù)時(shí)字段丟失的問題

    在開發(fā)高并發(fā)的Web應(yīng)用時(shí),尤其是在處理HTTP代理和流數(shù)據(jù)攔截的場(chǎng)景下,遇到數(shù)據(jù)丟失的問題并不罕見,最近,在一個(gè)項(xiàng)目中,我遇到了一個(gè)棘手的問題:在攔截并轉(zhuǎn)發(fā)HTTP流數(shù)據(jù)的過程中,某些數(shù)據(jù)字段因?yàn)樘幚磉^快而被丟失,所以本文給大家介紹如何解決這個(gè)問題
    2024-08-08
  • golang使用DockerFile正確用法指南

    golang使用DockerFile正確用法指南

    docker在開發(fā)和運(yùn)維中使用的場(chǎng)景越來越多,作為開發(fā)人員非常有必要了解一些docker的基本知識(shí),而離我們工作中最近的也就是對(duì)應(yīng)用的docker部署編排了,這篇文章主要給大家介紹了關(guān)于golang使用DockerFile的正確用法指南,需要的朋友可以參考下
    2024-03-03
  • 初識(shí)Golang?Mutex互斥鎖的使用

    初識(shí)Golang?Mutex互斥鎖的使用

    在學(xué)習(xí)操作系統(tǒng)的時(shí)候,我們應(yīng)該都學(xué)習(xí)過臨界區(qū)、互斥鎖這些概念,用于在并發(fā)環(huán)境下保證狀態(tài)的正確性。在?Go語言?里面互斥鎖是?sync.Mutex?,我們本篇文章就來學(xué)習(xí)下為什么要使用互斥鎖、如何使用互斥鎖,以及使用時(shí)的常見問題
    2022-10-10
  • Go日志管理庫zap安裝及使用過程

    Go日志管理庫zap安裝及使用過程

    Zap是Go語言中一個(gè)高性能的日志記錄庫,它支持日志切割、多級(jí)別日志記錄等功能,zap還支持使用Lumberjack進(jìn)行日志文件的自動(dòng)切割和歸檔,適用于需要高效日志管理的Go項(xiàng)目開發(fā),本文介紹Go日志管理庫zap安裝及使用過程,感興趣的朋友一起看看吧
    2024-09-09
  • 一文帶你吃透Go語言中的原子操作

    一文帶你吃透Go語言中的原子操作

    原子操作是解決并發(fā)編程中共享數(shù)據(jù)訪問問題的一種常見機(jī)制,下面就來和大家深入介紹原子操作的原理、用法以及在解決并發(fā)問題中的應(yīng)用,需要的可以參考一下
    2023-06-06
  • Go ORM的封裝解決方式詳解

    Go ORM的封裝解決方式詳解

    這篇文章主要為大家介紹了Go ORM的封裝解決方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • go第三方庫sqlx操作MySQL及ORM原理

    go第三方庫sqlx操作MySQL及ORM原理

    這篇文章主要為大家介紹了go第三方庫sqlx操作MySQL及ORM實(shí)現(xiàn)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Golang設(shè)計(jì)模式之組合模式講解

    Golang設(shè)計(jì)模式之組合模式講解

    這篇文章主要介紹了Golang設(shè)計(jì)模式之組合模式,組合模式針對(duì)于特定場(chǎng)景,如文件管理、組織管理等,使用該模式能簡(jiǎn)化管理,使代碼變得非常簡(jiǎn)潔
    2023-01-01
  • 詳解Go語言如何對(duì)數(shù)據(jù)庫進(jìn)行CRUD操作

    詳解Go語言如何對(duì)數(shù)據(jù)庫進(jìn)行CRUD操作

    在這篇文章中,主要帶大家來學(xué)習(xí)一下在Go語言中如何對(duì)數(shù)據(jù)庫進(jìn)行CRUD操作,從而探討一下Go的接口編程,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • 使用systemd部署和守護(hù)golang應(yīng)用程序的操作方法

    使用systemd部署和守護(hù)golang應(yīng)用程序的操作方法

    systemd是一個(gè)流行的守護(hù)進(jìn)程管理器,可以輕松管理服務(wù)的啟動(dòng)、停止、重啟等操作,讓我們的應(yīng)用程序始終保持在線,本文介紹了如何使用systemd部署和守護(hù)golang應(yīng)用程序,感興趣的朋友一起看看吧
    2023-10-10

最新評(píng)論

临洮县| 易门县| 华阴市| 梧州市| 克山县| 栾川县| 湘阴县| 临漳县| 阳原县| 宝应县| 奈曼旗| 嘉荫县| 鄂伦春自治旗| 应用必备| 高淳县| 宁南县| 罗田县| 邹城市| 延津县| 威海市| 道真| 祁连县| 洱源县| 庄浪县| 台南市| 保靖县| 龙井市| 柞水县| 东兰县| 达拉特旗| 大渡口区| 利津县| 元阳县| 永嘉县| 德钦县| 兴国县| 古蔺县| 都安| 四平市| 万载县| 特克斯县|