viper读取etcd热更新

概述

项目启动肯定少不了配置文件,一般我们会放在单独的目录,例如config中,有yaml、ini、json等等格式,一般用开源的读取相应问的文件映射到结构体中。

但是当一个项目秒杀频繁控制库存和限流策略等、或者其他需要频繁的变更配置文件的时候,就需要频繁的更改代码,打包,上线。时间成本高,实效性也低。所以一般都做配置热更新。

做配置热更新的有很多consul、Firestore、etcd、也有redis等等KV存储,今天我们要讲的是viper和etcd的热更新操作

准备工作

我用的是mac m1

安装etcd

生产环境肯定就是集群,测试我们直接单机模式了

brew install etcd

启动

etcd

测试

$ etcdctl version
etcdctl version: 3.5.5
API version: 3.5

或者docker,k8s安装测试环境

viper

go get github.com/spf13/viper

使用配置文件

func configByFile(vp *viper.Viper){var err error//设置配置文件的名字vp.SetConfigName("config") // name of config file (without extension)//设置配置文件后缀vp.SetConfigType("json") // REQUIRED if the config file does not have the extension in the name//设置配置文件的路径vp.AddConfigPath("/Users/xxxx/Desktop/test/testCode/")   // path to look for the config file invp.Set("verbose", true) // 设置默认参数//读取文件if err = vp.ReadInConfig(); err != nil {if _, ok := err.(viper.ConfigFileNotFoundError); ok {// Config file not found; ignore error if desiredlog.Fatal("not found")} else {// Config file was found but another error was produced}}if err = vp.Unmarshal(&conf);nil != err{log.Fatal("Unmarshal ",err)}fmt.Println(conf)//watchgo func() {vp.OnConfigChange(func(e fsnotify.Event) {fmt.Println("Config file changed:", e.Name)fmt.Println(e.String())fmt.Println(e.Op.String())})vp.WatchConfig()}()}

配置文件发生修改等行为时候回接收到调用回调函数,做相应的处理

etcd做配置

func configByEtcd(vp *viper.Viper){var err errorif err = vp.AddRemoteProvider("etcd3", "http://127.0.0.1:2379", "/config/viper-test/config");err != nil {log.Fatal(err)}vp.SetConfigType("json")if err = vp.ReadRemoteConfig();err != nil {log.Fatal(err)}if err = vp.Unmarshal(conf);err != nil {log.Fatal(err)}fmt.Println("获取的配置信息 ",conf)//fmt.Println(vp.Get("addr"))//fmt.Println(vp.Get("port"))go watchRemoteConfig(vp)select {}
}func watchRemoteConfig(vp *viper.Viper) {for {time.Sleep(time.Second * 5) // delay after each request// currently, only tested with etcd supporterr := vp.WatchRemoteConfig()if err != nil {log.Printf("unable to read remote config: %v", err)continue}// unmarshal new config into our runtime config struct. you can also use channel// to implement a signal to notify the system of the changesif err = vp.Unmarshal(&conf); nil != err{log.Printf("unable to read remote config: %v", err)continue}fmt.Println("获取的配置信息 ",conf)}
}

修改 ertcdkeeper内容

查看结果

获取的配置信息  &{127.0.0.1 3307}
获取的配置信息  &{127.0.0.1 3307}
获取的配置信息  &{127.0.0.1 3307}
获取的配置信息  &{127.0.0.1 3306}
获取的配置信息  &{127.0.0.1 3306}
^Csignal: interrupt

可以看到改变了 就收到了

上边只是一个简单的使用,更具体的应用可以自己封装下 ,还是很实用的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5147.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 更简单的读取和存储对象

目录 前言 1、存储 Bean 对象 1.1、前置工作:配置扫描路径(重要) 1.2、简单的将 bean 存储到容器 1.2.1 使用 5 大类注解实现将 bean 存储到 容器 Controller 注解 思考一个问题 问题二:五大类注解之间有什么关系&#xf…

Spring Boot|启动图案修改ASCII字符画

效果图 实现 在项目目录的resources文件夹中新建一个banner.txt,将内容放入即可: // _ooOoo_ // // o8888888o // // …

RHEL8.2安装QEMU及KVM虚拟化

一、环境 操作系统:CentOS8.2CPU:4C内存:16G磁盘:250G,其中180G分配给/data,用于存储数据及kvm存储池。 二、安装步骤 dnf module install virt dnf install virt-install virt-viewer virt-manager -y三…

Jenkins与CI/CD

简介 CI(持续集成) Continuous Integration是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编…

监控摄像头的像素200万,400万,800万都是什么意思,200万像素、400万像素、800万像素是如何换算出来的?

一、像素 像素(Pixel)是用来表示图像分辨率的单位,数字越大,表示图像中的细节可以更精细地展现。当我们谈论监控摄像头的像素时,通常指的是摄像头图像传感器上的像素数量。像素的数量可以通过传感器上的横向像素数乘以…

【吴恩达deeplearning.ai】基于ChatGPT API打造应用系统(上)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) 一、大语言模型基础知识 本篇内容将围绕api接口的调用、token的介绍、定义角色场景 调用api接口 import os import openai import tiktoken from dote…

Java并发编程中的JMM、3个基本属性、synchronized和volatile

1、Java内存模型JMM (Java Meemory Model) JMM规定,所有变量均存储在主内存中每个线程都有自己的工作内存,保存了该线程中用到的变量的主内存副本拷贝线程对变量的所有操作,必须在自己的工作内存中,不可直接读写主内存不同线程无法…

【VsCode远程开发】Windows SSH远程连接Linux服务器 - 无公网IP内网穿透

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

PostgreSql 逻辑结构

Database Cluser: 数据库集簇,一套服务器上安装部署完成的一套PostgreSql。在其中可创建数据库(Database)、用户(User)。User: 数据库用户,用来连接访问数据库,可通过权限管理,控制其…

Visual studio(VS)运行障碍指北

文章目录 VS: ....Microsoft.CppCommon.targets: error MSB6006: “CL.exe”已退出-VS2017许可证过期VS下Visual Assist X番茄插件安装失败子工程引用(无法解析的外部符号)无法打开.ui文件(qt)VS中qt子工程无法加载 VS: …Microso…

UE5《Electric Dreams》项目PCG技术解析 之 理解Assembly(以SplineExample为例)

文章目录 1. 什么是Assembly2. PCG部分2.1 Assembly变换2.2 Point变换2.2.1. SG_CopyPointsWithHierachy2.2.2 过滤及点变换2.2.3. ApplyHierachy 3. 小结 1. 什么是Assembly UE5.2的PCG出了有一段时间了,大家玩得都很开心。很多朋友可能和老王一样,使用…

docker学习(一)docker概述

Docker 是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从 Apache2.0 协议开源。它可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 可用于…