Viper for Nacos v0.4.0 发布
v0.4.0更新:
添加新的配置变更函数:
WatchRemoteConfigOnChannel(remoteViper *viper.Viper) <-chan bool
v0.3.0更新:
升级依赖: viper v1.8.1
此版本解决了 viper老版本中依赖etcd的问题,由于etcd v3.5.0 解决了模块化的问题;
这一版中我们可以同时集成grpc 、etcd 的最新版本。
Viper remote#
在Viper中启用远程支持,需要在代码中匿名导入viper/remote这个包。
import _ "github.com/spf13/viper/remote"
通过remote,Viper将支持读取从Key/Value存储( 例如etcd或Consul或本文中的Nacos ).
Viper加载配置值的优先级#
磁盘上的配置文件 > 命令行标志位 > 环境变量 > 远程Key/Value存储 > 默认值 。
Nacos 支持#
引用我们的开源库 https://github.com/yoyofxteam/nacos-viper-remote
import (
"github.com/spf13/viper"
remote "github.com/yoyofxteam/nacos-viper-remote"
)
在项目中使用:
config_viper := viper.New()
remote.SetOptions(&remote.Option{
Url: "localhost",
Port: 80,
NamespaceId: "public",
GroupName: "DEFAULT_GROUP",
Config: remote.Config{ DataId: "config_dev" },
Auth: nil,
})
remote_viper := viper.New()
err := remote_viper.AddRemoteProvider("nacos", "localhost", "")
remote_viper.SetConfigType("yaml")
err = remote_viper.ReadRemoteConfig() //sync get remote configs to remote_viper instance memory . for example , remote_viper.GetString(key)
if err == nil {
config_viper = remote_viper
fmt.Println("used remote viper")
provider := remote.NewRemoteProvider("yaml")
respChan := provider.WatchRemoteConfigOnChannel(config_viper)
go func(rc <-chan bool) {
for {
<-rc
fmt.Printf("remote async: %s", config_viper.GetString("yoyogo.application.name"))
}
}(respChan)
}
go func() {
for {
time.Sleep(time.Second * 30) // delay after each request
appName = config_viper.GetString("yoyogo.application.name")
fmt.Println("sync:" + appName)
}
}()
此项目已集成到 yoyogo
https://gitee.com/yoyofx/yoyogo
🦄🌈 YoyoGo 一个简单、轻量、快速、基于依赖注入的微服务框架( web 、grpc、xxl-job、console ),支持的注册中心 Nacos/Consoul/Etcd/Eureka/k8s 等。