从零开发区块链应用(一)--golang配置文件管理工具viper

参考文件:https://github.com/spf13/viper

一、viper简介

viper是一个go 开发工具,主要是用于处理各种格式的配置文件,简化程序配置的读取问题,所以viper 是一个配置解决方案,它拥有丰富的特性:

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件;
  • 可以设置监听配置文件的修改,修改时自动加载新的配置;
  • 从环境变量、命令行选项和io.Reader中读取配置;
  • 从远程配置系统中读取和监听修改,如 etcd/Consul;
  • 代码逻辑中显示设置键值。

二、viper 的基本方法

2.1 安装

go get github.com/spf13/viper

2.2 读取配置文件

Viper需要最少知道在哪里查找配置文件的配置。Viper支持JSONTOMLYAMLHCLenvfileJava properties格式的配置文件。Viper可以搜索多个路径,但目前单个Viper实例只支持单个配置文件。Viper不默认任何配置搜索路径,将默认决策留给应用程序。

下面是一个如何使用Viper搜索和读取配置文件的示例。不需要任何特定的路径,但是至少应该提供一个配置文件预期出现的路径。

viper.SetConfigFile("./config.yaml") // 指定配置文件路径
viper.SetConfigName("config") //配置文件名称(无扩展名)
viper.SetConfigType("yaml") // 如果配置文件的名称中没有扩展名,则必须要配置此项
viper.AddConfigPath("/etc/appname/")   // 查找配置文件所在的路径
viper.AddConfigPath("$HOME/.appname")  // 多次调用以添加多个搜索路径
viper.AddConfigPath(".")               // 还可以在工作目录中查找配置
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理读取配置文件的错误
    panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

在加载配置文件出错时,你可以像下面这样处理找不到配置文件的特定情况:

if err := viper.ReadInConfig(); err != nil {
    if _, ok := err.(viper.ConfigFileNotFoundError); ok {
        // 配置文件未找到错误;如果需要可以忽略
    } else {
        // 配置文件被找到,但产生了另外的错误
    }
}

// 配置文件找到并成功解析

2.3 viper取值的函数

  • Get(key string) : interface{} //自动判断类型
  • GetBool(key string) : bool //获取bool类型
  • GetFloat64(key string) : float64 //获取浮点
  • GetInt(key string) : int //获取int类型
  • GetString(key string) : string //获取string类型
  • GetIntSlice(key string) : []int //获取slice类型(slice类型为int)
  • GetStringSlice(key string) : []string //获取slice类型(slice类型为string)
  • GetStringMap(key string) : map[string]interface{} // 获取map类型(map自动判断类型)
  • GetStringMapString(key string) : map[string]string //获取map类型(map类型为string类型)
  • GetTime(key string) : time.Time // 获取时间类型
  • GetDuration(key string) : time.Duration //获取持续时间
  • IsSet(key string) : bool //判断某个键值是否存在
  • AllSettings() : map[string]interface{} // 获取所有配置

三、 viper使用举例

3.1 yaml配置文件

# 程序配置
console:
  name: "token"
  version: "v1.0"
  port: ":9100"

# 日志配置
log: "yaml/log.json"

node:
  bsc:
    url: "https://data-seed-prebsc-1-s1.binance.org:8545/"
    chainID: 97
  heco:
    url: "https://http-testnet.huobichain.com"
    chainID: 256

mysql:
  user: root
  password: "123456"
  host: 127.0.0.1
  port: 3306
  database: token

3.2 本地配置文件读取方式

  • 将上述两个配置文件和下面的 main.go 放在统一目录之下,即可实现读取配置文件
package config

import (
    "github.com/token/pkg/go-logger"
    "github.com/spf13/viper"
)

var Conf *Config

// Initialize
func Initialize() {

    // 加载配置文件
    viper.SetConfigType("yaml")
    viper.SetConfigName("config")
    viper.AddConfigPath("./yaml/")
    if err := viper.ReadInConfig(); err != nil {
        logger.Fatal("ReadInConfig error:", err)
    }

    Conf = &Config{
        LogCfg: viper.GetString("log"),
        Console: &Console{
            Name:    viper.GetString("console.name"),
            Version: viper.GetString("console.version"),
            Port:    viper.GetString("console.port"),
        },
        Mysql: &Mysql{
            User:     viper.GetString("mysql.user"),
            Password: viper.GetString("mysql.password"),
            Host:     viper.GetString("mysql.host"),
            Port:     viper.GetString("mysql.port"),
            Database: viper.GetString("mysql.database"),
        },
        Node: &Node{
            BSC: &NodeUrl{
                Url:     viper.GetString("node.bsc.url"),
                ChainID: viper.GetInt64("node.bsc.chainID"),
            },
            HECO: &NodeUrl{
                Url:     viper.GetString("node.heco.url"),
                ChainID: viper.GetInt64("node.heco.chainID"),
            },
        },
    }

    // 初始化日志配置
    logger.SetLogger("./yaml/log.json")
    logger.Info("Successful configuration load")
}

3.3 将配置信息序列化为结构体对象

package config

// yaml配置结构体
type Config struct {
    LogCfg  string   `json:"log"`
    Console *Console `json:"console"`
    Mysql   *Mysql   `json:"mysql"`
    Node    *Node    `json:"node"`
}

// yaml配置结构体
type Console struct {
    Name    string `json:"name"`
    Version string `json:"version"`
    Port    string `json:"port"`
}

type Mysql struct {
    User     string `json:"user"`
    Password string `json:"password"`
    Host     string `json:"host"`
    Port     string `json:"port"`
    Database string `json:"database"`
}

type Node struct {
    BSC  *NodeUrl `json:"bsc"`
    HECO *NodeUrl `json:"heco"`
}

type NodeUrl struct {
    Url     string `json:"url"`
    ChainID int64  `json:"chainID"`
}

3.4 配置读取

  • 读取服务端口

    config.Conf.Console.Port
    
  • 读取BSC节点url

    config.Conf.Node.BSC.Url
    
  • 读取mysql主机IP

    config.Conf.Mysql.Host
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345