2018 Golang Update(五)Configuration
发布时间:2011-06-29 17:49:42 文章来源:www.iduyao.cn 采编人员:星星草
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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
ModernUI教程:定义一个Logo
ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...
-
Django忘记管理员账号和密码的解决办法
看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...
-
GO语言总结(1)——基本知识
1、注释(与C++一样)
行注释:// 块注释:/* ... */
2、标识符
可以这么说,除了数字开头...
-
golang 常用的文件读取方式
Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。
一次性读取
小文件推荐一...
-
查询深圳通相关信息
用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。
注意:获取的并不是实...
-
Go语言设计模式实践:组合(Composite)
关于本系列
这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...
-
列出目录和遍历目录
获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。
示例代码:
package ma...
-
io 包的常用接口速记
我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...
-
代理服务扩展
之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...
-
文件的创建与打开
文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...