2018 Golang Update(5)Configuration

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

猜你喜欢

转载自sillycat.iteye.com/blog/2411864