当前位置: 首页 > news >正文

Viper远程配置踩坑记录

尝试etcd做配置中心,就用了Viper。没想到踩了一堆坑,记录一下。

一开始的代码是这么写的,想着先监听再读取:

func initViperRemote() {err := viper.AddRemoteProvider("etcd3","http://127.0.0.1:12379", "webook")if err != nil {panic(err)}viper.SetConfigType("yaml")// 先watcherr = viper.WatchRemoteConfig()if err != nil {panic(err)}// 再readerr = viper.ReadRemoteConfig()if err != nil {panic(err)}
}

直接panic。

第一个坑:invalid memory address or nil pointer dereference

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x9a8d6b]goroutine 1 [running]:
github.com/spf13/viper.(*Viper).watchRemoteConfig(0xc000162a80, {0xf653d0?, 0xc0000b5240?})
...

查了下,原来是顺序搞反了,必须先成功Read一次,才能Watch

func initViperRemote() {err := viper.AddRemoteProvider("etcd3","http://127.0.0.1:12379", "webook")if err != nil {panic(err)}viper.SetConfigType("yaml")// 先readerr = viper.ReadRemoteConfig()if err != nil {panic(err)}// 再watcherr = viper.WatchRemoteConfig()if err != nil {panic(err)}
}

又panic了。

第二个坑:Enable the remote features by doing a blank import

panic: Remote Configurations Error: Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'
...

这个错误信息倒是很直接,让干啥就干啥。要用远程功能得先匿名导入它的包。

import ("bytes""fmt""net/http""github.com/fsnotify/fsnotify""github.com/gin-gonic/gin""github.com/spf13/pflag""github.com/spf13/viper"_ "github.com/spf13/viper/remote" // 加上这行
)

再跑,还是panic。

第三个坑:No Files Found

panic: Remote Configurations Error: No Files Found
...

这就奇怪了,我明明用etcdctl把配置放进去了。

$ etcdctl --endpoints=127.0.0.1:12379 put /webook "$(<dev.yaml)"
OK
$ etcdctl --endpoints=127.0.0.1:12379 get /webook
/webook
db:dsn: "root:root@tcp(localhost:13316)/webook"
...

看了一下代码和命令,发现了问题。etcd里的key是/webook,代码里写的是webook。差一个斜杠。

改代码:

func initViperRemote() {err := viper.AddRemoteProvider("etcd3","http://127.0.0.1:12379", "/webook") // 这里加上斜杠// ...
}

再跑,总算成功了。

kbz@DESKTOP-PCAC9DA:~/BackendDEV/geektime-basic-go/webook$ go run .
[db.dsn redis.addr]
map[db:map[dsn:root:root@tcp(localhost:13316)/webook] redis:map[addr:localhost:6379]]
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
...
[GIN-debug] Listening and serving HTTP on :7070

感觉Viper的接口设计得有点恶心,用起来比较折腾。不过在要求灵活配置优先级的场景下确实,使用状态机模型会契合一点

http://www.rkmt.cn/news/11700.html

相关文章:

  • 国产智能体脂秤PCBA方案设计
  • 第21章 Day25 抖音最新ab
  • 【cv】cycleGAN代码解析:test.py
  • 第20章 Day24 原型链
  • redis实现定期关单
  • 详细介绍:5G nr频段_5g哪个信道信号强
  • trae 配置mysql_mcp
  • 【cv】cycleGAN代码解析:train.py
  • 深入解析:李宏毅2023机器学习作业 HW01实操
  • 自定义制作docker容器自动自愈容器镜像
  • 如何利用海外 NetNut 网络代理与 AICoding 实战获取 iPhone 17 新品用户评论数据?
  • 第一次编码器测试
  • 04-FreeRTOS的概述及编程规范
  • Linux安装Kafka(无Zookeeper模式)保姆级教程,云服务器安装部署,Windows内存不够允许看看
  • 实用指南:在 CentOS 中安装 MySQL
  • 卫星时间同步平台:助力分布式测控系统同步工作
  • C# Avalonia 15- Animation- Easing
  • CyberLink ColorDirector Ultra 2026 14.0.5712.0 视频后期调色
  • CF 1053 Div.2
  • haproxy负载均衡 - 详解
  • 豆油
  • linux shell awk 中括号 方括号 分割 []
  • 绩效面谈中的优质提问(一)
  • 从 “纸笔清单” 到全栈引擎:数据填报与类 Excel 控件如何重塑企业效率曲线 - 详解
  • 做题笔记总板
  • 嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门 - 教程
  • 做题笔记6
  • 第17章 Day20-Day21 逆向爬虫之瑞数6
  • Vona ORM分表全攻略
  • 深入解析:设计模式-状态模式详解