“Golang ile Sıfırdan Proje Yapalım” serisinin 2. yazısında Go’da konfigürasyon yönetimi nasıl yapılır sorusunun cevabını arayacağız. Viper konfigürasyon yönetim toolunu 3 farklı yöntemle besleyerek birer örnek çıkarmaya çalışacağız. Kullanacağımız yöntemler aşağıdaki gibi olacak.
- Environment Variable
- Central Configuration Server (Spring Cloud Config Server)
- File (application.yml)
Uygulamamız hangi ortamda çalıştığını bilmeksizin ihtiyaç duyduğu konfigürasyonu uygulama paketi dışından alarak çalışabilmesi gerekir. Projenin ve ortamın ihtiyaçlarına göre bu konfigürasyon farklı şekillerde alınabilir. 3 farklı örnek inceleyeceğiz, önerim bu yöntemlerden size uygun birisini tercih edip kodunuzda sadece onu bulundurmanız. Örnek olması için ben 3ünü de aynı kodun içerisine koyacağım.
Environment Variable
Twelve Factor açısından minimal kompleksite için önerilen runtime argümanlarından bilgilerin alınması. Golang yapısında bulunan flagler de benzer şekilde kullanılabilir.
İhtiyaç duyduğumuz konfigürasyon sınıf yapısını oluşturarak başlıyoruz. Bir bakışta görülebilmesi için aynı dosyada tuttum, siz bunları ayrı dosyalara ayırabilirsiniz.
Kodun aşağılarına ilerlediğimizde reflection kullanarak oluşturduğumuz sınıf yapısında fieldlara verdiğimiz kullandığımız taglerin Viper’a key olarak geçildiğini görüyorsunuz. Sonrasında automaticEnv metodu sayesinde Viper iletilen keyleri toplayıp objelerimizin doldurulmasını sağlayacak.
Central Configuration Server (Spring Cloud Config Server)
İkinci yöntem eğer bir Config Server’a sahipseniz bu sunucuya bağlantı için gereken temel bilgileri env variable’dan alarak uygulamanızın yapılandırmasını uzak sunucudan okuyabilirsiniz. Aşağıdaki örnek Spring Cloud Config Server ile direk çalışabilen bir örnektir.
Burada FastHTTP kullanarak Basic Authetication’a sahip config sunucusuna bir istek atarak yaml dosyasına erişilmeye çalışılıyor. Erişilen byte stream direk Viper içerisine aktarılarak structların instancelarına set ediliyorlar.
File (application.yml)
3üncü örneğimiz ise file system üzerinde bulunan bir yaml dosyasından konfigürasyonun okunması. Aşağıdaki kodlarda kompleksiteyi artırmamak için statik bir klasör ve dosya ismini aratıyor olsam da bu bilgi environment variabledan okunacak şekilde de düzenlemesi yapılabilir.
Serinin sonraki yazısı Loglama hakkında, buradan erişebilirsiniz.
Serinin tüm yazılarına aşağıdaki linkler aracılığıyla erişebilirsiniz.
- Golang ile Uçtan Uca Proje Yapımı Serisi
- Golang Configuration Management
- Golang Central Logging Management
- Golang DB Migration - RDBMS & ORM Integration
- Golang API Management
- Golang Message Broker - Object Mapping - Testing
Yukarıda değindiğimiz bütün kodlara https://github.com/mehmetcemyucel/blog/tree/master/demo adresinden erişebilirsiniz.