Golang : Config Management Using Viper

Apa itu Viper ?
Viper merupakan config management tools yang mencakup 12-factor Apps. Merupakan sebuah package yang dapat menghandle beberapa format configuration, yaitu :
- setting defaults
- reading from JSON, TOML, YAML, HCL, envfile and Java properties config files
- live watching and re-reading of config files (optional)
- reading from environment variables
- reading from remote config systems (etcd or Consul), and watching changes
- reading from command line flags
- reading from buffer
- setting explicit values
Mengapa Saya merekomendasikan Viper ?
Karena dengan support beberapa extension file serta cara implementasi yang mudah, menjadikan viper lebih reliable dan mudah diimplementasikan.
Untuk membaca dokumentasi viper bisa di https://github.com/spf13/viper
Penerapan dalam Golang
- Install viper package
go get github.com/spf13/viper
2. Siapkan file env untuk menyimpan config aplikasi kita, disini saya memakai .env.yml
server:
port: 8080 mqServer:
dial: "amqp://guest:guest@localhost:5672/"
pada .env.yml
saya menambahkan 2 config yaitu server dan mqServer, dimana server berisi port yang nantinya untuk configurasi running server di port berapa, sedangkan mqServer digunakan untuk konfigurasi rabbitMQ. Disini kalian bisa menambahkan konfigurasi yang lain seperti database atau redis config.
3. Siapkan folder config
dalam golang project anda, Di dalam folder tersebut saya menyiapkan 3 file yaitu configuration.go
sebagai object dari config kita, server.go
sbg object configurasi server kita dan mq.go
sbg object dari config rabbitMQ.
- configuration.go
package config
import (
"log"
"github.com/spf13/viper"
)
type Configuration struct {
Server ServerConfiguration
MQServer MQConfiguration
}
func InitConfig() Configuration {
viper.SetConfigName(".env")
viper.AddConfigPath(".")
var configuration Configuration
if err := viper.ReadInConfig(); err != nil {
log.Fatalf("Error reading config file, %s", err)
}
err := viper.Unmarshal(&configuration)
if err != nil {
log.Fatalf("unable to decode into struct, %v", err)
}
return configuration
}
Dalam code diatas pertama kita set config name disni saya set .env
kemudian path dari file tersebut. Selanjutnya kita akan membaca semua config yang ada di file .env.yml
dan jika berhasil kita akan mapping kedalam sebuah struct bernama configuration.
- server.go
package config
type ServerConfiguration struct {
Port int
}
- mq.go
package config
type MQConfiguration struct {
Dial string
}
4. Setelah selesai menyiapkan semua konfigurasi, saatnya untuk inisialisasi konfigurasi kita pada package main, caranya sebagai berikut.
package main
import (
configs "go-rabbitmq/config"
)
func main() {
// initial config
config := configs.InitConfig() // will return amqp://guest:guest@localhost:5672/
fmt.Println(config.MQServer.Dial) // will return 8080
fmt.Println(config.Server.Port)}
Nah selesai sudah membuat config management dengan viper di bahasa pemograman golang, dengan hanya memanggil InitConfig()
kita sudah menginisalisasi semua config yang ada di file .env.yml
.
Semoga dengan pembahasan ini bisa membantu untuk semua developer yang sedang memulai belajar Golang.
Referensi :