Mikroservis Mimarisi ve Serverless Hakkında

Alihan Koç
5 min readOct 9, 2020

--

Yakın zamanda bir whatsapp grubunda mikroservislerden falan konuşuyoruz. Bir arkadaşım dedi ki abi bırak bu işleri her gün yeni bir şey çıkıyor nasıl takip edeceğiz, işler çok karışmaya başladı dedi. Yukarıdaki görsel de tam da bu karışıklığa ithafen bulduğum bir görsel. 😆

Ben uzun zamandır web tarafında backend projelerimi Python, NodeJS veya PHP ile yazıyorum. Kimi zaman şöyle ihtiyaçlarım oluyor;

Bir tane bana ait resim boyutlandıran bir şey olsa da tüm projelerimde onu kullansam. Hangi platformda lazım olduğu fark etmesin. Resmi vereyim, boyutlandırıp geri versin.

Ne güzel değil mi? Size ait olacak, istediğiniz özellikleri ekleyip çıkarabileceksiniz, sizin işinizi halledecek. Mesela PHP tarafında Laravel framework kullanıyorum. Mesela bu işi yapan bir paket yazsam bir Laravel paketi haline getirsem nasıl olur? Çok güzel her Laravel projeme eklerim.

Aaa bir de Django kullandığım zamanlarda lazım, o zaman bir de Python paketi yazayım. NodeJs için de yazayım….

Yok bu yöntem olmadı.

Başka ne olabilir? Ben bu işi resim işlemede en iyi olan dilde yapayım. Bir sunucuya atayım. Oradan bir API endpointi açayım. Oraya resmi göndereyim. Bana boyutlandırıp geri göndersin ya da bir dosya sistemine kayıt edip dosya yolunu göndersin. Yaptığı işi de kendine ait bir veritabanına kayıt etsin sonra aynı resim gelirse hazırdaki dosya yolunu göndersin bir daha uğraşmasın.

İşte size mikroservis. Tek bir işi var. Görevli olduğu sadece bir iş var. Herhangi bir projenizde kullanabilirsiniz. Projenizi Python ile mi yazmışsınız, NodeJS ile mi yazmışsınız, Go ile mi yazmışsınız onu ilgilendirmez. HTTP ile haberleşiyor. Kendine ait bir veritabanı var.

Tamam güzel, bu mikroservis oldukça basit hafif bişey olmalı çünkü hepi topu 1 tane endpoint sunuyor bize. Mesela oturup bunun için Laravel kurmam saçma olur. Tek bir dosyadan oluşan bir şey olsa mesela. Ne güzel.

Photo by MIO ITO on Unsplash

Bir sorun var. 🛑

Benim bir projem haftanın belli günlerinde belli saatlerde dakikada 1000 tane resim atıyor boyutlandırmak için. Ancak ben tek dosyadan oluşan servisimi 5 dolarlık basit bir sunucuya koymuştum. Bu kadar resmi hızlı bir şekilde boyutlandıracak kapasite yok. Sunucuyu büyütsem diğer zamanlarda boş yatacak.

Öyle bir şey olsun ki işi yokken para yazmasın ama işi varken de para harcasın.

Yapacağı iş zaten onun yerine daha fazla para kazandırmıyorsa yapmasının anlamı yok değil mi ?😆

Ben bu tek dosyalık servisimi bir yere atsam, saniyede 10 bin istek de atsam 1 istek de atsam aynı performansı gösterse. Ben sunucu munucu bilmesem. Hatta kimlik doğrulama falan da uğraşmasam, sadece benim belirlediğim IP adreslerinden gelen isteklere cevap verse. Ben bu tür güvenlik falan konularını kontrol etmek için servisimin çalıştığı dosyayı büyütüp şişirmesem.

Serverless gibi bir şeyi tarif ettik mi? Ettik. İşte örnek olarak AWS Lambda bu işi yapıyor. Siz bir tane dosya veriyorsunuz. Bu dosya sizin bir endpointiniz oluyor. Bu endpoint dosyanın içindeki işi yapıyor. FaaS modeli de bu işte. Function As A Service. Yani hizmet olarak fonksiyon. Başka örnek olarak Lambda altyapısını kullanan Netlify.

Ne bir framework var, ne ortada bir sunucu var, ne authentication ile uğraşıyorsunuz. Fonksiyonunuzu yazdığınız dosyayı atıyorsunuz. Size bu fonksiyonu çalıştıran endpointi veriyor. Ne kadar istek yaparsanız yapın hep aynı performansı sağlıyor. Bunu garanti ediyor.

Hadi daha da ileri gidelim. Şimdi bu servis bir tane veritabanına veri kayıt edecekti ya. Eee bu veritabanı nerde. Buna bir sunucu lazım bu sefer de. Bu sunucudan kurtulamadık mı? Hehehee onu da düşünmüşler siz merak etmeyin sevgili okuyucu. 👌

Serverless uygulama yapacaksınız da MySQL mi kuracaksınız kullanması için. Tabii ki hayır. Veritabanı işlemleri için şöyle bir HTTP API olsa, ben istediğim tabloya, koleksiyona vs HTTP isteği atıp veri kaydetsem, okusam, silsem. Yani benim CRUD işlerimi yapacak başka bir API ile haberleşsem. Bunu kendim de yapabilirim. Aynı bu resim boyutlandırma servisi gibi onu da bir servise çevirebilirim. Uğraşmak isterseniz yine sunucu işleriyle uğraşacaksanız siz bilirsiniz.

Bunun da serverless ve daha kolay olanına örnek ise Amazondaki DynamoDB. Bu makale amazon reklamı gibi oldu ama öyle bir niyetim yoktu. 😆

Bu arkadaş bize bir HTTP Api ile veritabanı işlemlerimizi yapmamızı sağlıyor. Google karşılığı Firebase de aynı işi yapıyor. FaunaDB var yeni keşfettim. Özellikle NodeJS SDK’sı beni benden aldı. Böyle bir sürü örnek var.

Bunların özelliği ne biliyor musunuz? Saniyede 10 bin istek de atsanız 1 istek de atsanız size aynı hızda, aynı performansta cevap veriyor. Çünkü o bir sunucu kaynağına bağımlı değil. 4 CPU 16 GB RAM’ı olan bir sunucu gibi değil ki 100 bin isteğe çıkınca onu da büyütmeniz gereksin. Bize fonksiyonun ya da API ucunun her türlü çalışacağını garanti ediyor sana ne sunucudan diyor. Var mı daha ötesi.

Üstelik bu hizmetlerin büyük çoğunluğu kullanmadığınız zaman para harcamıyor (Bazıları sabit ücret alıyor aylık ya da yıllık).

Ben böyle 30 tane servis yaptım bunların hepsi için bana kullandığım serverless hizmeti kafasına göre okunurluğu düşük bir endpoint verdi. Ben kendi alan adımı kullanmak istiyorum derseniz kendi alan adınızı da bağlayabilirsiniz.

Ya da başka bir makalede örnek verdiğim Kong gibi bir API gateway kullanarak tüm mikroservis endpointlerini bir yere toplayabilir ve kafanıza göre yönetebilirsiniz.

Hem de bu işler için Amazon ile, Google ile, Netlify ile uğraşmazsınız. Kendi göbeğinizi kendiniz kesersiniz.

Şimdi bir de örnek yapsak güzel olurdu ama yazı çok uzardı. O yüzden bir sonraki yazımızda bir tane serverless çalışan örnek mikroservis yapalım da gözümüz gönlümüz şenlensin. 😄

Sorularınızı hello@alihankoc.com.tr eposta adresimden iletebilirsiniz.

Kendinize dikkat edin sayın okuyucu. 💌

--

--