Design Principles
Mikroservis mimarisi, modern uygulama geliştirme için en popüler seçim haline geldi. Bazı sorunları çözse de sihirli değnek değildir. Dezavantajları vardır ve bu mimariyi kullanırken ele alınması gereken çok sayıda sorun vardır. Bu, bu problemlerdeki yaygın patternleri öğrenme ve reusable çözümlerle çözme ihtiyacını doğurur. Bu nedenle, mikrosevisler için design patternlerin tartışılması gerekir. Design patternlere dalmadan önce, mikroservis mimarisinin hangi prensipler üzerine inşa edildiğini anlamamız gerekir:
Decentralization (Merkeziyetsizlik)
Decentralization Türkçe’de merkezi olmama durumudur. Yazılım mimarisi dünyasında da aynı şekilde bir merkeze bağlı olmama, sorumluluğun dağıtılması anlamına gelir.
Sistem içindeki bütün işlerin tek bir merkez tarafından yönetilmeyeceği ve kontrol edilmeyeceği anlamına gelen bir sorumluluk dağılımıdır.
Bu prensibe göre mikroservis hangi teknolojiyi kullanıyor olursa olsun tek bir göreve sahip olmalıdır ve kendi bireysel yönetim planı olmalıdır.
Mikroservis tabanlı uygulamalarda veri yönetiminden iş akışlarının çalıştırılmasına kadar her yönden decentralization gerçekleşmelidir. Bu prensip mikroservislerin veri, geliştirme, operasyonel işler veya ekip çalışmalarında yüksek derecede bağımsızlık sergilemesi gerektiğini belirtir.
Loose Coupling (Serbest, Gevşek veya Zayıf Bağlantı)
Bu tasarım prensibi, SOA yazısında da belirtildiği gibi, hizmetlerin, hizmetler arasında en az bağımlılık olacak, ideal olarak hiçbir bağımlılık olmayacak şekilde uygulanması gerektiğini belirtir. Tight coupling yani sıkı bağlantının tersidir.
Örneğin nesne yönelimli programlama ile ilgili olarak; bir sınıfın objesinin oluşturulduğu başka bir sınıf düşünelim. Objesi oluşturulan sınıfta değişiklik yapıldığında diğer sınıfta da değişiklik yapılması gerekiyorsa arada tight coupling vardır.
Autonomy (Servislerin Özerk Olması)
Mikroservisler bir iş için gerekli tüm sorumluluğu alır ve bu iş için tamamen bağımsız bir şekilde çalışır. Yani sağlanacak hizmet için tam kontrole sahiptir ve bağımlılık olmadan ilgili hizmeti karşılaması gerekir. Otonom bir servis, kendi API/protokolünü yayınlayarak işini yapar.
Otonom veya özerk olma durumunun bir başka yönü de hata senaryolarını gidermek için tüm bilgilerin servis içinde mevcut olmasıdır ve ek iletişim ve koordinasyon ihtiyacını ortadan kaldırır.
Bu prensiple birlikte ekipler ortaya çıkardıkları yazılımın tüm yaşam döngüsü ve operasyonel yönleriyle de bağımlılıktan kurtulur.
Ayrıca yazılım geliştirmek için kullanılacak teknoloji ve kullanılacak altyapı konusunda da servisler bağımsızdır.
Isolation of Failures (Hataların İzolasyonu)
İzolasyon, birden fazla işlemin (transaction) müdahale etmeden aynı anda birbirinden ayrı bir şekilde çalışabilir olması anlamına gelir. İzolasyon bir işlem sırasında yapılan herhangi bir ara durum değişikliğinin diğer işlemler tarafından görülmemesi sağlanarak yapılır.
Mikroservis mimarisinin temel özelliklerinden biri bileşenlerin ve yeteneklerin birbirinden yalıtılmasıdır. Bir mikroservis çökerse geri kalanı bu servis çalışana kadar etkilenmeden çalışmasına devam etmelidir.
Bu prensip hataların ayrı olarak ele alınması gerektiğini belirtir. Bir servisteki başarısızlık uygulamanın diğer bölümlerini etkilememelidir.
Independent Deployability (Bağımsız Devreye Alma)
Mikroservis mimarinin önemli bir prensibi de independent deployability yani bağımsız yaygınlaştırmadır. Bu prensip bir uygulamayı oluşturan her bir mikroservisin ayrı olarak devreye alınabilmesi gerektiğini belirtir.
Bağımsız devreye alma servislerin zayıf, gevşek bağlantıyı da (loose coupled) sağlayarak başka hiçbir şeyi değiştirmek zorunda kalmadan bir serviste güncellemenin devreye alınabileceği anlamına gelir. Aslında görüleceği üzere prensipler de birbirleriyle sıkı bir ilişki içerisindedir.
Servisler için code base (kod tabanları) küçük, ayrı, bağımsız bir şekilde oluşturulur ve devreye alınır. Servislerdeki değişiklikler diğer devreye alım birimini de tetikleyebilir.
Scalability (Ölçeklenebilirlik)
Bu prensip mikroservis mimarinin kullanılıp kullanılmayacağına karar verilmesi için göz önünde bulundurulması gerekecek kadar önemi haiz prensiplerden biridir.
Scability (ölçeklenebilirlik) kısaca; bir sistemin performansına göre, aldığı yüke göre veya başka bir etmene göre kapasitesini ve kabiliyetini artırmaya / azaltmaya denir.
Bu prensip basitçe şunu der: her bir mikroservis ve bu mikroservislerin sahip olduğu görev ölçeklenebilir olmalıdır. Her görevin diğerinden bağımsız olması yalnızca gerekli bileşenleri ölçeklendirmeyi kolaylaştırır. Zamandan ve kaynaklardan tasarruf sağlar.
Monolitler ölçeklenebilirliği sınırlar. Gelen isteklerin artışlarını karşılayabilmek için olağan strateji uygulamanın tamamının başka numunelerini başka kaynaklar üzerinde ayağa kaldırmaktır. Bu şekilde gelen yük uygulamanın ayakta olan bu paketlerine dağıtılacaktır. Ancak artan yükün uygulamadaki sadece bir modülü zorlaması tüm uygulama için yeni kaynakların tahsisinin elverişsiz olmasına ve ortaya verimsiz bir ortam çıkmasına sebep olur.
Modularity (Modülerlik)
Bu prensip, bir mikroservisin yalnızca bir görevi yerine getirmesi ve bunu iyi yapması gerektiğini belirtir. Modülerlik farklı işlevin farklı modül tarafından üstlenilmesi ve bu modüllerin sistemi oluşturmasıdır.
Bir sistem, tam işlevsellik sunan tek bir pakete sahip olmak yerine her bir bileşenin genel sistem davranışına katkıda bulunduğu izole bileşenlerden oluşur.
Modülerlik prensibi ile herhangi bir modül (arabanın bir parçasının değiştirilmesi gibi) sistemin diğer bir parçası, bir mikroservis değiştirilebilir, güncellenebilir.
Bu prensip sorumlulukların ayrılması (separation of concerns) veya işlevsel ayrım (functional separation) prensibi olarak da düşünülebilir.