配置文件的疑问

来源:2-5 如何管理项目中的配置

红尘二先生

2022-06-16

1、关于配置文件路径问题

在项目中将入口文件(main.go)放到cmd目录下,使用go run main.go 和 go build编译运行程序都会报找不到配置文件的错,错误如下:

panic: open config/config.yml: no such file or directory

goroutine 1 [running]:
train-search-api/config.LoadConfig()
        /Users/dutianqing/workspace/train-search-api/config/config.go:27 +0x18a
main.init.0()
        /Users/dutianqing/workspace/train-search-api/cmd/search-api/main.go:10 +0x25 

想问有没有万全的策略


2、关于动态修改配置文件生效问题

我在项目运行时尝试修改了访问端口号,能正常打印出修改文件的名称,但是修改的访问端口号没有生效,请问这个问题时操作不当,还是动态修改的局限性?

写回答

1回答

少林码僧

2022-06-18

第一个问题,对于配置文件的路径,因为配置文件在读取的时候使用的是相对路径
config/config.yml
所以执行go run main.go 的时候需要在config的同级目录下,也就是项目的根目录下执行,
这里,你需要在train-search-api目录下执行 go run cmd/main.go

项目在线上打包运行的时候会在dockerfile中设置为工作目录(WORKDIR),后面实战项目打包部署的时候这块也会有涉及到。

如果理解了这个路径的相对关系一般不会出错,如果想万无一失,有两种方式:
1. 使用绝对路径,但是项目迁移后需要改代码
2. 另一种方式是使用Go提供的os包获取项目的当前路径, os.Getwd() ,然后根据项目根目录的路径来拼接上配置文件路径

第二个问题:

动态修改配置文件只能保证当前通过配置文件解析后对象获取的端口号是新的,但由于服务启动后只会读取一次端口号,服务读取到这个端口号启动后不会主动去监听这个端口号的变更,它相当于读取后存到自己的结构体变量中了。
所以如果你希望服务实际使用的端口号也跟着变更,需要在监听到配置文件变更时,重启HTTP服务。
而这种级别的配置更新风险比较大,线上一般不会使用热更新,会重新走发版流程。


1
0

海量数据高并发场景,构建Go+ES8企业级搜索微服务

全新 ES8 配合技术组件,实现高性能搜索

267 学习 · 54 问题

查看课程