Golang基于viper的配置热加载或动态变更方法介绍

概述

  在写web server时,往往需要引入各种各样的配置信息,如依赖的其他中间件(redis、elasticsearch)等,一旦这些服务发生变更,我们需要重新启动web server,以使配置生效。在Golang中,基于viper的动态配置就可以省去这些繁琐的步骤了。接下来用一个示例来说明如何使用viper的配置热加载:

项目结构

  首先来看一下整个项目的目录结构:

- DynamicConfigDemo // 项目地址
	- conf   // 配置文件目录
		- base.yaml  // 采用yaml格式文件,viper同样支持toml、json等格式的配置文件
	- src // 代码文件夹
		- dynamic_config // 动态配置文件夹
			- dynamic_config.go // 配置加载脚本
	- go.mod // go package管理依赖的包文件
	- go.sum // go package管理打包产生的文件
	- main.go // web server的入口,主函数

代码细节

  接下来依次看一下各文件的主体内容:

# conf/base.yaml
service:
  redis:
    host: 127.0.0.1
    port: 6379

conf/base.yaml文件定义了配置项,包含redis的host及port信息。

# src/dynamic_config/dynamic_config.go
package dynamic_config

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

var GlobalConfig *viper.Viper

func init() {
	fmt.Printf("Loading configuration logics...\n")
	GlobalConfig = initConfig()
	go dynamicConfig()
}

func initConfig() *viper.Viper {
	GlobalConfig := viper.New()
	GlobalConfig.SetConfigName("base")
	GlobalConfig.AddConfigPath("conf/")
	GlobalConfig.SetConfigType("yaml")
	err := GlobalConfig.ReadInConfig()
	if err != nil {
		fmt.Printf("Failed to get the configuration.")
	}
	return GlobalConfig
}

func dynamicConfig() {
	GlobalConfig.WatchConfig()
	GlobalConfig.OnConfigChange(func(event fsnotify.Event) {
		fmt.Printf("Detect config change: %s \n", event.String())
	})
}

src/dynamic_config/dynamic_config.go定义了全局配置信息的加载及动态监控方法,init函数为初始化执行的脚本,initConfig为初始化当前配置,dynamicConfig为冬天监听,通过viper的内部方法WatchConfig实现。

# main.go
package main

import (
	"DynamicConfigDemo/src/dynamic_config"
	"fmt"
	"github.com/gin-gonic/gin"
)

func main() {
	gin.SetMode(gin.ReleaseMode)
	r := gin.Default()
	r.GET("/ping", func(context *gin.Context) {
		fmt.Println("Current redis host is: ", dynamic_config.GlobalConfig.GetString("service.redis.host"))
		context.JSON(
			200, gin.H{
				"message": "You are welcome!",
			})
	})
	r.Run(":9292")
}

main.go为主函数,调用gin包定义web server服务,实现了一个简单的http server服务器,每次请求发送时会打印配置的redis host信息。

调用示例

  1. 第一次调用,打印出当前redis host为127.0.0.1
  2. 随后我们将redis host修改为127.0.0.2
  3. src/dynamic_config/dynamic_config.go文件中的如下代码GlobalConfig.OnConfigChange(func(event fsnotify.Event) { fmt.Printf("Detect config change: %s \n", event.String()) })监控到配置文件变更时会输出变更通知,如图中红框所示;
  4. 第二次调用时,则打印出最新配置的redis host信息

在这里插入图片描述

参考

[1] viper github主页
[2] gin github主页

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值