当前位置: 首页 > 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.hskmm.com/?act=detail&tid=17121

相关文章:

  • 国产智能体脂秤PCBA方案设计
  • 第15章 day18 Ast系列篇
  • 微波雷达模块在智能家居中的具体应用案例有哪些?
  • Ubuntu 桌面快捷方式创建增加记录
  • 队列
  • arm64中的内存屏障指令
  • 三分
  • 完整教程:微服务基础2-网关路由
  • nginx ipv6 proxy配置
  • (三)数仓人必看!ODS 到 DWS 各层设计规范全解析,含同步/存储/质量核心要点
  • 【shell】系统资源不足fork: retry: Resource temporarily unavailable
  • 【语文训练】女乃龙?田力乃龙?
  • 抖动分为3个方面
  • 第20章 Day24 原型链
  • python自动化操作邮件
  • zabbix配置mysql监控
  • redis实现定期关单
  • 第18章 Day22 高阶混淆ast进阶
  • 关于ubuntu 用户切换的细节 su - user 和su user
  • 用 SeaTunnel 同步 MySQL 到 Doris:全量增量 + SQL 过滤
  • 在CodeBolcks下wxSmith的C++编程教程——使用自定义绘制和鼠标处理创建项目
  • trae 配置mysql_mcp
  • Apache NiFi 1.28.1 集群 + Kerberos 认证 + 多租户模式部署
  • 基于Java+SpringBoot+SSM,Flask福聚苑社区团购体系(源码+LW+调试文档+讲解等)/福聚苑社区/团购系统/社区团购/福聚苑/团购/社区/环境/福聚苑小区/在线团购/社区购物
  • 按需引入echarts
  • 软件构造的用户交互设计 4章
  • 自定义制作docker容器自动自愈容器镜像
  • 如何利用海外 NetNut 网络代理与 AICoding 实战获取 iPhone 17 新品用户评论数据?
  • 第一次编码器测试
  • 04-FreeRTOS的概述及编程规范