2018 Golang Update(5)Configuration

本文介绍如何使用Viper库在Golang项目中进行配置管理。通过环境变量选择不同的配置文件(如config-prod.yaml),实现灵活的环境切换。文章还展示了如何从配置文件中读取数据库连接信息,并初始化数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018 Golang Update(5)Configuration

Add the Dependency to Dep
>dep ensure -add github.com/spf13/viper

All the Viper method
https://godoc.org/github.com/spf13/viper#pkg-variables

Here is How I use that, when I run the command, I can do as follow to pass the ENV
>ENVIRONMENT=PROD bin/restful_go_api

Add dependency to use Viper
>dep ensure -add github.com/spf13/viper

The Configuration style will be YAML style config-prod.yaml as follow
restful_go_api/conf/config-prod.yaml
restful_go_api/conf/config-dev.yaml
restful_go_api/conf/config-stage.yaml

http:
port: 8081
gin:
debug: false
database:
type: mysql
host: 192.168.1.109
user: watermonitor
password: xxxxxx
port: 3306
name: watermonitor

here is the config module for init the Viper
restful_go_api/src/sillycat.com/restful_go_api/config/vipconfig.go
package config

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

const appName = "config"

func InitViperConfig() {
log.Println("Start to init the config--------")
viper.SetDefault("http.port", "8080")

if os.Getenv("ENVIRONMENT") == "PROD" {
log.Println("system is running under PROD mode")
viper.SetConfigName(appName + "-prod") // name of config file (without extension)
} else if os.Getenv("ENVIRONMENT") == "STAGE" {
log.Println("system is running under STAGE mode")
viper.SetConfigName(appName + "-stage") // name of config file (without extension)
} else {
log.Println("system is running under DEV mode")
viper.SetConfigName(appName + "-dev") // name of config file (without extension)
}
viper.AddConfigPath("/etc/" + appName + "/") // path to look for the config file in
viper.AddConfigPath("./") // optionally look for config in the working directory
viper.AddConfigPath("./conf/")
viper.AutomaticEnv()
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
}

In the database init class, here is how I use that
restful_go_api/src/sillycat.com/restful_go_api/common/db.go
package common

import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"github.com/spf13/viper"
"sillycat.com/restful_go_api/config"
)

var engine = InitDatabase()

func InitDatabase() *xorm.Engine {

config.InitViperConfig()

var engine *xorm.Engine
var err error

dbType := viper.GetString("database.type")
dbUser := viper.GetString("database.user")
dbPwd := viper.GetString("database.password")
dbHost := viper.GetString("database.host")
dbPort := viper.GetString("database.port")
dbName := viper.GetString("database.name")

engine, err = xorm.NewEngine(dbType, dbUser+":"+dbPwd+"@tcp("+dbHost+":"+dbPort+")/"+dbName+"?charset=utf8")
if err != nil {
fmt.Println(err)
}
engine.Ping() //ping

engine.ShowSQL(true) //show SQL
engine.Logger().SetLevel(core.LOG_DEBUG)
return engine
}

func GetDatabase() *xorm.Engine {
return engine
}

In the main.go, here is how I use that configuration
restful_go_api/src/sillycat.com/restful_go_api/main.go

package main

import (
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
"log"
"sillycat.com/restful_go_api/waterrecord"
)

var DB = make(map[string]string)

func SetupRouter() *gin.Engine {

// Disable Console Color
// gin.DisableConsoleColor()
if viper.GetBool("gin.debug") {
log.Println("Gin is under debug mode")
} else {
log.Println("Gin is under prod mode")
gin.SetMode(gin.ReleaseMode)
}
router := gin.Default()

// Ping test
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})

v1 := router.Group("api/v1")
{
v1.GET("/waterrecords", waterrecord.GetWaterRecords)
v1.GET("/waterrecords/:id", waterrecord.GetWaterRecord)
v1.POST("/waterrecords", waterrecord.PostWaterRecord)
v1.PUT("/waterrecords/:id", waterrecord.UpdateWaterRecord)
v1.DELETE("/waterrecords/:id", waterrecord.DeleteWaterRecord)
}

return router
}

func main() {
router := SetupRouter()
// Listen and Server in 0.0.0.0:8080
port := viper.GetString("http.port")
router.Run(":" + port)
}


References:
https://medium.com/@felipedutratine/manage-config-in-golang-to-get-variables-from-file-and-env-variables-33d876887152
https://github.com/spf13/viper
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值