18 Ağustos 2023 Cuma

Dotnet Tabanlı Mikroservis Projesine Go Servisi Eklemek

    S.A. Arkadaşlar,
    Yaklaşık 1 yıl önce başladığım ve uzun süredir de yazmayı düşündüğüm bir konuyu erteleye erteleye şu an ancak yazabiliyorum. Bildiğiniz gibi üzerinde çalıştığım bir mikroservis projem var. Orada 3 adet mikroservis vardı, buna ek olarak yeni bir mikroservis ekledim, fakat diğerlerinden farklı olarak bunu Golang ile kodladım. Bu nereden çıktı ve bu noktaya nasıl geldik diye bazı notlarımı paylaşmak istiyorum.

    Aslını söylemek gerekirse en başından beri dotnet dışında bir dil ile bir servis implemente etmek istiyordum. Bunun go ile olmasının çok özel bir sebebi yok, dotnet dünyasında Golang'e olan ilgi benim de dikkatimi çekiyordu. Bora Kaşmer'in bir sunumunda da görmüştüm, daha sonra Berkan Şaşmaz da birlikte çalıştığımız dönemde eShopOnAbp projesine Golang ile bir servis geliştirmeyi hedefliyordu, bu iki örnek Golang ile yeni bir servis geliştirmeme vesile oldu.

    İnsanın hedefleri olması güzel, ben de bu hedef doğrultusunda kodlamaya başlamalıydım, fakat Golang adına pek bir bilgim yoktu. Projeyi genel olarak incelediğinizde iş katmanı olarak oldukça sade, bunun sebebi benim bu projeyi öğrenme amacıyla kullanmam. Burada da Golang ile sadece 2 uç ve bir adet log atmıştım. İlk amacım yeni servisi, mikroservis projesi dahilinde ayağa kaldırmaktı. Projeyi çalıştırabilirsem sonraki aşamalara geçmeyi düşünüyordum. İyi ki böyle düşünmüşüm çünkü bu bile beni gerçek anlamda çok zorlamıştı. Özellikle docker konfigürasyonu (docker container içerisinde "curl" komutunu tanımlayamama gibi bir problem yaşarsanız buraya göz atabilirsiniz) ve bunu gateway ile birlikte ayağa kaldırmak zor olmuştu. Bu konuda kendisini daha önce tanımıyor olmama rağmen yardımcı olan Eren Alincak ve DevOps konularında bana birçok kez yardımı dokunan Akif Feyzioğlu'na teşekkürler.

    Projeyi development ortamında ayağa kaldırmak için Tye kullanıyorum. (Tye neden kullandığımı merak ediyorsanız buradaki yazıya bakabilirsiniz.) Tye maalesef Golang servisi ayağa kaldırmayı desteklemiyor. Onun için maalesef bazı yan yollara saparak .bat dosyaları oluşturarak Golang servisi local'de de tek bir yerden ayağa kaldırmayı başardık. Diğer taraftan zaten docker ile konfigürasyonu tamamladığımız için orayı zaten halletmiştik.

    Basit anlamda ayarlamaları tamamladıktan sonra servislerin birbiriyle nasıl konuşacağına sıra geldi. O dönemde Dapr ile haşir neşir olmuştum. Dapr'in hem dotnet hem golang hem de başka birçok dil desteği mevcut. (Ayrıntılı bakmak isteyenler bu yazıma göz atabilir). Ben de dotnet üzerinden atılan event'i go ile yakalamaya karar verdim. Bu vesileyle dotnet tarafına örnek bir uç ekledim, buradan gelen bilgiye göre golang servisi sms ve eposta gönderecek şekilde düzenledim. Yine o dönemlerde Twillio implementasyonu yapmıştım dotnet tarafında, bu sefer burada oluşan tecrübeyi go tarafına aktardım. (sistem değişkenlerine set etme ile ilgili bir hata alırsanız buraya göz atmanızı tavsiye ederim.) İsmi hala "example" olarak da kalsa yeni servisi, bildirim servisi olarak düşünebiliriz.

    Bu yazının gecikmesinin en büyük nedenlerinden biri aslında golang tarafına if ile yapılan sms mi eposta mi gönderimi için "builder pattern" kullanmayı düşünmemdi, aklımda olsa da maalesef hala başlayamadım. Diğer bir sebebi bu projeye unit test de eklemek istiyordum. Şu an bu taraftaki aklıma ilk gelen eksiklikler bu şekilde. Belki bunları da zamanla geliştirme fırsatı yakalarım. Ya da sizlerden PR gelebilir :)

    Burada çok önceden kapatılmış PR var. Bu ilk eklenen hali. İlk geliştirmeleri görmek isteyen olabilir diye paylaşmak istedim. Sadece son committe proje yapısını tamamen değiştirdiğim(eski yapı microservice klasörü altında servisler var iken yeni değişiklik ile Csharp ve Golang adında 2 klasör daha ekledim) değişiklikler fazla gözüküyor, son commit dışındakileri inceleyebilirsiniz. Son güncel halini incelemek isterseniz buraya göz atabilirisiniz.

    
Projenin yeni hali

    Genelini dotnet ile geliştirmiş olduğum projeye yeni bir golang servisi ekleme serüvenimi aklımda kaldığı kadarıyla paylaşmaya çalıştım. Bu konudaki geri dönüşlerinizi duymaktan mutluluk duyarım.

    Yazıyı bir hadis-i şerif ile bitirelim.

    "Arab’ın Acem’e, Acem’in Arab’a üstünlüğü olmadığı gibi, kırmızının karaya, karanın kırmızıya da üstünlüğü yoktur. Hiçbir milletin diğerine üstünlüğü yoktur. Üstünlük ancak takvâ iledir."

 [İbni Neccar] (Acem, Arap olmayan demektir.)

Hiç yorum yok:

Yorum Gönder