Go dilini öğrenmek hızlı ve zevkli. İlk denemelerinizi yaptınız, dile kabaca aşina oldunuz hatta basit kodlarınızı yazdınız. Ancak canlıya kodu alacak kadar hazır hissediyor musunuz? Fonksiyonel olmayan ihtiyaçlarınızı da karşılayacak, kod ortamlara deploy olurken/olduğunda eliniz ayağınız olacak araçları detaylıca düşünüp projenize dahil ettiniz mi?
Bu yazımızda Go dilinin best practicelerini merkezimize koyarak ihtiyaç duyulan entegrasyonları basit bir projede gerçekleştirip kullanabileceğiniz şablon bir proje yapısı ortaya koymaya çalışacağız. Aşağıdaki tercihler yapılırken birçok POC ve testler yapılarak seçimler yapıldı. Ancak teknoloji sürekli gelişiyor, değişiyor. Tercihinize göre ekleme çıkarma yapabileceğiniz bir şablon oluşturmaya çalışacağız, sizin de katkılarınızla bu şablonu daha kullanışlı hale getirebiliriz. Birkaç yazıdan oluşan bu seride konuşacağımız başlıklar;
- Yazı: Golang ile Uçtan Uca Proje Yapımı Serisi - Go projelerinin dinamiği - Proje yapısı ve klasör ağacı (best-practices)
- Yazı: Golang Configuration Management
- Konfigürasyon yönetimi (Viper)
- Environment variables ile
- Merkezi konfigürasyon sunucusu ile (Spring Cloud Config Server)
- File (yaml)
- Konfigürasyon yönetimi (Viper)
- Yazı: Golang Central Logging Management
- Yazı: Golang DB Migration - RDBMS & ORM Integration
- Yazı: Golang API Management
- Monitoring (Prometheus & Go-kit)
- Http router (Echo)
- Http package (Fasthttp)
- Open-api/Swagger desteği (Swaggo)
- Yazı: Golang Message Broker — Object Mapping — Testing
Go Projelerinin Dinamiği
Yoğunlukla Flat veya Layered olarak 2 farklı pratik tercih edilmektedir. Flat, tüm dosyaların direk root dizine bırakıldığı yapı, daha ufak ve granüler projeleri ifade ederken Layered yapı ise router, handler, domain gibi katmanların net bir şekilde birbirinden ayrıldığı daha kompleks ve büyük projelerde tercih edilen yapıdır. İkisinin de kendilerine göre avantajları ve dezavantajları vardır. İnternette karşılaştırmaları ile ilgili çokça yazı bulunuyor, dilerseniz ufak bir Googling ile detaylı örneklerini inceleyebilirsiniz. Biz Robert C. Martin’in Clean Architecture’da bahsettiği aşağıdaki görsele uygun bir yapı oluşturacağız. Jeffrey Palermo’nun Onion Architecture olarak da bilinen aşağıdaki görsele yakın bir paketleme yapısı kullanacağız.
Paket Yapısı
IDE olarak ben Goland kullanıyorum ancak VSCode veya herhangi bir başka tool da kullanılabilir. Proje yaratarak işe başlıyoruz, ilk başlangıç noktamız klasör yapısı. Bunun Go geliştirim takımı tarafından tanımlanmış bir standardı olmasa da Go topluluğunun tercih ettiği bir yapı artık herkes tarafından benimsenmiş ve kullanılıyor. Detay için burayı inceleyebilirsiniz.
Main.go dosyasından başlayalım, cmd/demo/main.go altından incelenebilir. Main fonksiyonumuz main package’ında bulunması gerekiyor. Klasör olarak da Go’da farklı mainlerinizi cmd/[module]/main.go formatına uygun şekilde koyulmasına olanak sağlayan bir klasörleme yapısı mevcut ancak Twelve Factor Codebase maddesi açısından bir codebase tek bir deployable unitten oluşması bekleniyor. Burada aykırı görüntülere de izin verilse de 1 codebase 1 depoyable unit mantığından uzaklaşmamak Twelve Fact açısından en iyisi.
Aşağıdaki main fonksiyonundaki gibi uygulamamızı ve bağımlılıkları ilmek ilmek dokumamız gerekiyor.
Şimdilik comment-out’lu kısıma takılmayalım, onları Swagger başlığı altında inceleyeceğiz. Bağımlılıklarımızı, bunların nasıl yönetileceğini adım adım yaratarak başlıyoruz.
Serinin sonraki yazısı Konfigürasyon Yönetimi 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.