后端 Day9 | 轻松管理程序的设置档

yueliangdao0608 · August 12, 2021 · 3 hits

在开发系统的过程中,将 数据库连接环境设置 等参数抽离出来变成 设置档 是必须的事情,让我们开发的程序可以在不同的环境中只要修改设置档就可以运行。

今天就让我们来聊聊如何轻松的管理设置档吧!

设置档

设置档可能会有很多不同的类型,常见的有

  • json
  • yaml
  • ini
  • toml
  • properties

在开发时可以选择其中一种格式,我本人是偏好使用 yaml 格式,以下为范例

application:
  timeout:
    read: 1000
    write: 1000
  port: 8080
  uploadPath: "./upload"
  mode: "debug"
  appId: "go"
  apiBaseRoute: "/api"

那么,要怎么使用 golang 读取到这份 yaml 档呢,我推荐使用 viper 这个 open source 的 package

viper 是什么

viper 的网址:https://github.com/spf13/viper
首先我们先来看看 viper 可以帮我们做到哪些事

viper 是一种管理设置档的解决方案,它具有以下几种特性

  • 支持 JSON, TOML, YAML, HCL, envfile, properties 等格式的设置文档
  • 可以设置要 listen 哪份设置文档进行热加载
  • 可以从环境变量中读取参数
  • 支持从远程系统读取设置,例如 etcd 或是 consul

到这边我们大概理解了 viper 可以帮我们解决大多数在处理设置档上的问题后,就让我们开始使用它吧!

安装

可以通过 go get 的方式轻松的安装

go get github.com/spf13/viper

如何使用

设置要读取的设置档

首先我们先准备一份设置档并放到根目录底下的 config 文件夹,名称定为 app.yaml

application:
  timeout:
    read: 1000
    write: 1000
  port: 8080
  uploadPath: "./upload"
  mode: "debug"
  appId: "go"
  apiBaseRoute: "/api"

导入相依 package

通过 import 指令将 viper 进行导入

import "github.com/spf13/viper"

设置

要读取的文件名

刚才我们将设置档定为 app.yaml,所以我们可以通过 SetConfigName 的方法将 app 设置进去

viper.SetConfigName("config")

要读取的附文件名

由于我们要读取的是 yaml 格式的文件,因此通过 SetConfigTypeyaml 进行标示

viper.SetConfigType("yaml")

要读取的路径

接着我们就是设置设置档的位置,由于我们是放在 config 文件夹底下,因此可以通过 AddConfigPath./config 设置上去

viper.AddConfigPath("./config")

设置参数默认值

某些参数如果没有填写可能会造成程序运行出现错误,因此我们可以通过 SetDefault 将特定参数设置默认值

viper.SetDefault("application.port", 8080)

读取设置档

接着我们可以通过 ReadInConfigviper 利用上面的设置来读取我们要的设置档,他会回传 error,如果读取的时候出错,error 就不会为 nil,因此我们要加上错误判断

err := viper.ReadInConfig()
if err != nil {
    panic("读取设置档出现错误,原因为:" + err.Errror())
}

取得参数值

最后我们可以通过 Get 的方式读取我们要访问的参数,参数的阶层可以使用 . 来间隔,以 app.yaml 为例,我们想要读取 application 底下的 port 参数值,我们就可以把 key 写成 application.port 来读取

viper.Get("application.port")

总和程序

将以上程序综合起来如下

package main

import (
    "fmt"
    "github.com/spf13/viper"
)

func main() {
    viper.SetConfigName("app")
    viper.SetConfigType("yaml")
    viper.AddConfigPath("./config")
    viper.SetDefault("application.port", 8080)
    err := viper.ReadInConfig()
    if err != nil {
        panic("读取设置档出现错误,原因为:" + err.Error())
    }
    fmt.Println("application port = " + viper.GetString("application.port"))
}

运行完毕之后如果结果出现 application port = 8080 就代表成功读取设置档拉!

小结

以往在处理设置档真的是要花费很大量的时间在处理格式与结构,但在使用 viper 之后让我考试都考一百分!极度推荐给大家使用!

参考


No Reply at the moment.
You need to Sign in before reply, if you don't have an account, please Sign up first.