Go语言实战 : API服务器 (4) 配置文件读取及连接数据库
生活随笔
收集整理的這篇文章主要介紹了
Go语言实战 : API服务器 (4) 配置文件读取及连接数据库
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
讀取配置文件
1. 主函數(shù)中增加配置初始化入口
完整代碼如下:
import (..."github.com/spf13/pflag""github.com/spf13/viper""log") var (cfg = pflag.StringP("config", "c", "", "apiserver config file path.") ) func main() {pflag.Parse()if err:=config.Init(*cfg) ;err != nil {panic(err)}// Create the Gin engine.g := gin.New()gin.SetMode(viper.GetString("runmode"))middlewares := []gin.HandlerFunc{}// Routes.router.Load(// Cores.g,// Middlwares.middlewares...,)// Ping the server to make sure the router is working.go func() {if err := pingServer(); err != nil {log.Fatal("The router has no response, or it might took too long to start up.", err)}log.Print("The router has been deployed successfully.")}()log.Printf("Start to listening the incoming requests on http address: %s", viper.GetString("addr"))log.Printf(http.ListenAndServe(viper.GetString("addr"), g).Error()) }2. 解析配置的函數(shù)
完整代碼如下:
package configimport ("log""strings""github.com/fsnotify/fsnotify""github.com/spf13/viper" )type Config struct {Name string }func Init(cfg string) error {c := Config {Name: cfg,}// 初始化配置文件if err := c.initConfig(); err != nil {return err}// 監(jiān)控配置文件變化并熱加載程序c.watchConfig()return nil }func (c *Config) initConfig() error {if c.Name != "" {viper.SetConfigFile(c.Name) // 如果指定了配置文件,則解析指定的配置文件} else {viper.AddConfigPath("conf") // 如果沒有指定配置文件,則解析默認(rèn)的配置文件viper.SetConfigName("config")}viper.SetConfigType("yaml") // 設(shè)置配置文件格式為YAMLviper.AutomaticEnv() // 讀取匹配的環(huán)境變量viper.SetEnvPrefix("APISERVER") // 讀取環(huán)境變量的前綴為APISERVERreplacer := strings.NewReplacer(".", "_") viper.SetEnvKeyReplacer(replacer)if err := viper.ReadInConfig(); err != nil { // viper解析配置文件return err}return nil }// 監(jiān)控配置文件變化并熱加載程序 func (c *Config) watchConfig() {viper.WatchConfig()viper.OnConfigChange(func(e fsnotify.Event) {log.Printf("Config file changed: %s", e.Name)}) }數(shù)據(jù)庫連接
1.ORM框架
apiserver 用的 ORM 是 GitHub 上 star 數(shù)最多的 gorm,相較于其他 ORM,它用起來更方便,更穩(wěn)定,社區(qū)也更活躍。 gorm有如下特性:
- 全功能 ORM (無限接近)
- 關(guān)聯(lián) (Has One, Has Many, Belongs To, Many To Many, 多態(tài))
- 鉤子 (在創(chuàng)建/保存/更新/刪除/查找之前或之后)
- 預(yù)加載
- 事務(wù)
- 復(fù)合主鍵
- SQL 生成器
- 數(shù)據(jù)庫自動遷移
- 自定義日志
- 可擴(kuò)展性, 可基于 GORM 回調(diào)編寫插件
- 所有功能都被測試覆蓋
- 開發(fā)者友好
2.建立數(shù)據(jù)連接
1.先配置文件中,配置數(shù)據(jù)庫相關(guān)參數(shù)
db:name: db_apiserveraddr: 127.0.0.1:3306username: rootpassword: root docker_db:name: db_apiserveraddr: 127.0.0.1:3306username: rootpassword: root3.根據(jù)用戶名密碼等參數(shù),打開連接
func openDB(username,password,addr,name string) *gorm.DB {config :=fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=%t&loc=%s",username,password,addr,name,true,//"Asia/Shanghai"),"Local")db, err := gorm.Open("mysql", config)if err!=nil{log.Printf("Database connection failed. Database name: %s", name)}setupDB(db)return db }總結(jié)
以上是生活随笔為你收集整理的Go语言实战 : API服务器 (4) 配置文件读取及连接数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到人鱼预示着什么
- 下一篇: 做梦梦到甲鱼是什么预兆