C.8. Advanced Configuration File (Viper)

Pada bab ini kita akan belajar cara mudah parsing file konfigurasi menggunakan Viper. Inti dari bab ini sebenarnya adalah sama dengan yang sudah dibahas pada bab B-22 - Configuration, hanya saja disini proses parsing di-handle oleh 3rd party dengan tidak menggunakan struct untuk pengaksesannya.

Kekurangan dari teknik menyimpan konfigurasi dalam object struct adalah, pada saat ada kebutuhan untuk menambah atau merubah isi konfigurasi file, maka mengharuskan developer juga mengubah skema struct penampung.

C.8.1. JSON Configuration

Mari langsung kita praktekan. Buat projek baru seperti biasa, buat file konfigurasi app.conf.json, isi dengan data berikut.

{
    "appName": "SimpleApp",

    "server": {
        "port": 9000
    }
}

Property appName berisi nama aplikasi, sedangkan server.port representasi dari port web server.

Selanjutnya buat main.go, lakukan parsing pada file konfigurasi.

package main

import (
    "fmt"
    "github.com/labstack/echo"
    "github.com/spf13/viper"
    "net/http"
)

func main() {
    e := echo.New()

    viper.SetConfigType("json")
    viper.AddConfigPath(".")
    viper.SetConfigName("app.config")

    err := viper.ReadInConfig()
    if err != nil {
        e.Logger.Fatal(err)
    }

    // ...
}

Kode di atas adalah contoh penggunaan dasar viper, untuk parsing file konfigurasi bertipe JSON. Fungsi viper.SetConfigType() digunakan untuk set jenis file konfigurasi.

Berikut merupakan list format yang didukung oleh viper.

  • json
  • toml
  • yaml
  • yml
  • properties
  • props
  • prop

Fungsi .AddConfigPath() digunakan untuk mendaftarkan path folder dimana file-file konfigurasi berada. Fungsi ini bisa dipanggil beberapa kali, jika memang ada banyak file konfigurasi tersimpan dalam path berbeda.

Statement .SetConfigName() dieksekusi dengan parameter berisi nama file konfigurasi secara eksplisit tanpa ekstensi. Misalkan nama file adalah app.config.json, maka parameter cukup ditulis app.config.

Fungsi .ReadInConfig() digunakan untuk memproses file-file konfigurasi sesuai dengan path dan nama yang sudah ditentukan.

OK, kembali ke bagian tulis-menulis kode. Tambahkan beberapa kode untuk print nama aplikasi, sebuah rute, dan start web server.

fmt.Println("Starting", viper.GetString("appName"))

e.GET("/index", func(c echo.Context) (err error) {
    return c.JSON(http.StatusOK, true)
})

e.Logger.Fatal(e.Start(":" + viper.GetString("server.port")))

Cara pengaksesan konfigurasi bisa dilihat pada kode di atas. Statement viper.GetString("appName") mengembalikan string "SimpleApp", sesuai dengan isi pada file konfigurasi.

Selain .GetString(), masih banyak lagi fungsi lain yang bisa digunakan, sesuaikan dengan tipe data property yang akan diambil.

FungsiReturn type
Get(string)interface{}
GetBool(string)bool
GetDuration(string)time.Duration
GetFloat64(string)float64
GetInt(string)int
GetInt32(string)int32
GetInt64(string)int64
GetSizeInBytes(string)uint
GetString(string)string
GetStringMap(string)map[string]interface{}
GetStringMapString(string)map[string]string
GetStringMapStringSlice(string)map[string][]string
GetStringSlice(string)[]string
GetTime(string)time.Time

Pengaksesan property nested seperti server.port juga mudah, tinggal tulis saja skema property yang ingin diambil nilainya dengan separator tanda titik (.).

Jalankan aplikasi untuk test hasilnya.

Sample output

C.8.2. YAML Configuration

Cara menggunakan viper pada file konfigurasi bertipe .yaml kurang lebih sama seperti pada file .json. Cukup ubah config type nya dan semua akan beres dengan sendirinya.

Mari kita langsung praktekan saja. Buat file konfigurasi baru app.config.yaml dengan isi berikut.

appName: SimpleApp
server:
  port: 9000

Pada bagian kode golang, cukup ubah argumen pemanggilan fungsi set config type.

viper.SetConfigType("yaml")

Jalankan aplikasi, dan hasilnya sama seperti sebelumnya.

C.8.3. Watcher Configuration

Viper memiliki banyak fitur, satu diantaranya adalah mengaktifkan watcher pada file konfigurasi. Dengan adanya watcher, maka kita bisa membuat callback yang akan dipanggil setiap kali ada perubahan konfigurasi.

viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("Config file changed:", e.Name)
})

Penggunaan fasilitas watcher memerlukan tambahan 3rd party library fsnotify.


  • Echo, by Vishal Rana (Lab Stack), MIT license
  • fsnotify, by fsnotify team, BSD-3-Clause license
  • Viper, by Steve Francia, MIT license

results matching ""

No results matching ""