viper读取etcd热更新

news2024/9/27 19:20:58

概述

项目启动肯定少不了配置文件,一般我们会放在单独的目录,例如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 in
	vp.Set("verbose", true) // 设置默认参数
	//读取文件
	if err = vp.ReadInConfig(); err != nil {
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			// Config file not found; ignore error if desired
			log.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)

	//watch
	go 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 error
	if 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 support
		err := 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 changes
		if 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.coloradmin.cn/o/695831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp app端常见坑

文章目录 uniapp app端常见坑页面内容出现在状态栏数据持久化问题项目初始化跳转登录页闪屏的问题 总结 uniapp app端常见坑 本文主要记录在uniapp-vite-vue3项目app端出现的常见问题 页面内容出现在状态栏 当在page.json设置 “navigationStyle”:“custom” 取消原生导航栏…

Spring进阶学习(附面试快速答法)

文章目录 1、Bean线程安全问题小总结面试快速答法 2、AOP小总结面试快速答法 3、bean的生命周期小总结面试快速答法 4、循环引用小总结面试快速答法 5、SpringMVC的执行流程小总结面试快速答法 6、Springboot自动配置原理小总结面试快速答法 7、Spring框架常见注解面…

初步学习使用Mybatis框架

mybatis框架是一款半自动的ORM持久层框架,具有较高的SQL灵活性 所谓半自动的ORM持久层框架,是因为用mybatis进行开发,需要手动编写。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。 对于mybatis,就…

五、云尚办公-菜单管理

云尚办公系统:菜单管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!&#x…

PLC选择指南:西门子还是三菱?

选择适合自己的PLC涉及多个因素,包括项目要求、技术要求、可用性、支持和个人偏好。西门子和三菱是两个知名的PLC制造商,它们都有自己的优势和特点。以下是一些考虑因素: 我这里刚好有plc、嵌入式、单片机的资料需要的可以私我或在评论区扣6…

tp使用layui友好显示修改状态功能

之前找了很多次,然后经过自己的总结,这里记录一下 html部分 <a href"{:url(admin/merchant/make_merchant_erweima,[id>$vo[id]])}" class"layui-btn layui-btn-normal layui-btn-sm ajax-change">二维码</a> 重点是添加上ajax-change的…

别再用查询count,判断数据是否存在了

目录 一、目前多数人的写法 二、优化方案 三、总结 大家在实际的开发过程中&#xff0c;会根据某些条件&#xff0c;从数据库表中查询出是否存在符合该条件的数据。无论是刚入行的程序员小白&#xff0c;还是久经沙场多年的程序员老白&#xff0c;都是一如既往的SELECT count(*…

Faster Segment Anything: Towards Lightweight SAM for Mobile Applications

Faster Segment Anything: Towards Lightweight SAM for Mobile Applications SAM代码&#xff1a;https://github.com/ChaoningZhang/MobileSAM SAM论文&#xff1a;https://arxiv.org/pdf/2306.14289.pdf 1 概述 Faster SAM的目标是通过用轻量级图像编码器取代笨重的图像编…

HTML点击显示、点击隐藏details 标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><details> <summary>Copyright 1999-2011.</summary> <p> - by Refsnes Da…

通过阿里云函数计算FC实现音视频转码

1.进入阿里云函数计算FC页面 2.创建音视频转码应用 可以看到代码&#xff0c;看到相关的传参 3.进行测试 编辑测试参数&#xff0c;使用账号的OSS中的资源 点击测试函数进行测试 可以在OSS中看到生成的mp4格式的视频了 测试后发现函数计算可以使用 4. 接下来就是在项目中通过代…

力姆泰克小型电动推杆LAM

小型电动推杆 高强度工程塑料的蜗轮或者粉末冶金齿轮 向下翻动查看更多 力姆泰克小型电动推杆LAM 系列大量采用铝合金壳体&#xff0c;伸缩管等零部件&#xff0c;和部分高强度工程塑料的蜗轮或者粉末冶金齿轮&#xff0c;设计开发出专门应用在医疗&#xff0c; 办公家具&am…

Linux操作系统通过实战理解CPU上下文切换

前言&#xff1a;Linux是一个多任务的操作系统&#xff0c;可以支持远大于CPU数量的任务同时运行&#xff0c;但是我们都知道这其实是一个错觉&#xff0c;真正是系统在很短的时间内将CPU轮流分配给各个进程&#xff0c;给用户造成多任务同时运行的错觉。所以这就是有一个问题&…

Redis实战案例3-缓存概念和添加Redis缓存

1. 缓存 缓存是数据交换的缓冲区&#xff0c;是贮存数据的临时地方&#xff0c;一般读写性能较高&#xff1b; 其中数据库缓存&#xff0c;例如&#xff1a;索引数据&#xff0c;MySQL会给id创建索引&#xff0c;从而查询时可以在内存中快速检索&#xff0c;提升速度&#xff1…

MDK指定.sct(分散加载描述文件)文件位置

文章目录 MDK指定.sct(分散加载描述文件)文件位置概述END MDK指定.sct(分散加载描述文件)文件位置 概述 用STM32CubeMX生成的工程, 默认的.sct位置在临时输出目录, 里面都是.o. 都是工程编译时生成的临时文件(中间文件) 当工程归档时, 这个临时目录肯定是要删除的(编译过程…

用ThinkJs框架快速搭建博客网站

ThinkJS是一个企业级的NodeJS应用框架&#xff0c;整合了各种常用SDK以及企业级常用的技术方案&#xff0c;为减少了开发人员的学习成本&#xff0c;提高团队的开发效率而生。框架底层基于Koa2实现&#xff0c;并且结合ThinkPHP的思想&#xff0c;使代码更加简洁实用。 ThinkVu…

Dependency ‘io.spring.platform:platform-bom:Cario-SR7‘ not found

刚看到这个错的时候&#xff0c;以为是maven中需要配置aliyun镜像的缘故&#xff0c;所以&#xff0c;在/conf/settings.xml中加入了aliyun镜像&#xff1a; <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al…

智能优化算法六种常见图—参数空间图、搜索历史图、第一维度轨迹图、多样性曲线、平均适应度曲线、收敛曲线图(以黏菌算法为例)

一、基本介绍&#xff1a; 智能优化算法六种常见图绘制—参数空间图、搜索历史图、第一维度轨迹图、多样性曲线、平均适应度曲线、收敛曲线图。一篇文章有几张高颜值的图片&#xff0c;能给审稿人留下良好的第一印象。以上这些图像均可用于仿真实验中。各图像功能如下&#xf…

五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别

Autowired注解是由Spring提供的&#xff0c;它可以用来对构造方法、成员变量及方法参数进行标注&#xff0c;它能够根据对象类型完成自动注入&#xff0c;代码如下&#xff1a; public class Service {// 构造方法注入Autowiredpublic Service(Service service) {this.service…

实现一个转盘随机选择器

实现效果 完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><…

Java的Stream流详细讲解

一.Stream 是什么 Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响。 ​ 同时stream不是一种数据结构&#xff0c;它只是某种数据源的一个视图&…