尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Viper远程配置踩坑记录

Viper远程配置踩坑记录
📅 发布时间:2026/6/18 19:44:53

尝试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的接口设计得有点恶心,用起来比较折腾。不过在要求灵活配置优先级的场景下确实,使用状态机模型会契合一点

相关新闻

  • 国产智能体脂秤PCBA方案设计
  • 第21章 Day25 抖音最新ab
  • 【cv】cycleGAN代码解析:test.py

最新新闻

  • 混淆矩阵实战指南:从医疗诊断看分类模型评估本质
  • AI Studio实战指南:从提示词到可交付产品的完整工作流
  • 30+种音视频格式全免费转!2026在线保姆级大合集,这一篇够了 - 时时资讯
  • BoTorch实战指南:PyTorch原生贝叶斯优化原理与工程落地
  • Microchip嵌入式开发资源地图:从官方支持到实战工具链全解析
  • 多维聚合实战:从pandas滚动窗口到业务可解释指标

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号