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
2018 Golang Update(5)Configuration
猜你喜欢
转载自sillycat.iteye.com/blog/2411864
今日推荐
周排行