Home - mfmese/microservice GitHub Wiki
nedir?
- Bir tür mimari yazılım stilidir.
- Monolitik uygulamalara alternatif olarak tasarlanmıştır.
- Microservisler tek bir uygulama olarak geliştirilen sistemi bir biri ile iletişim halinde olan ve bağımsız olarak çalışabilen küçük servislere ayırmayı hedeflemektedr. Çalışma şekiller aşağıdaki gibidir;
-
- Bir uygulama oluşturmak için yazılan küçük servislerdir
-
- Her servis birbirinden bağımsız olarak çalışabilmektedir.
-
- Http / rest veya message yolu ile açılan protocoller sayesinde birbiri ile konuşabilmektedir
-
- Birbirinden bağımsız bir şekilde farklı dillerde de (java, .net) geliştirilebilir, deploy edilebilir veya maintain edilebilir.
-
- Business işlemlerini servisler kapsamaktadır. Monolitic de olduğu gibi class veya packageler kapsamaz.
-
- Servisler bağımsız bir şekilde upgrade edilebilir.
- Bütün sistem akışının tek bir hatadan tamamen etkilenmesini kısmen önlemek.
- Monolith uygulamalarda yaşanan hatalarda uygulamanın tamamen cevap vermemesi, network split'ler veya efektif olarak resourceların kullanılamaması sorunlarına çözüm olarak microservis mimarileri geliştirilmiştir.
- Uygulamaları daha dayanıklı ve esnek (Resilience) yapmaktadır.
ne değildir?
- SOA gibi değillerdir. SOA birçok enterprise application arasındaki entegrasyonu sağlarken. Microservisler tek bir uygulamanın ayrıştırılmasını sağlar.
- Microservisler risk ve sakıncalara sahip değildir.
current trend
- Twitter moved from Ruby/Ruils monolith to microservices
- Facebook moved from php to microservices
- Netflix moved from java to microservices
Monolithic avantajları?
- Kavraması kolaydır fakat hazmetmesi kolay değildir.
- Belirli bir ölçüye kadar test etmesi kolaydır
- Deploy etmesi kolaydır.
- Belirli bir ölçüye kadar manage etmesi kolaydır.
- Belirli bir ölçüde değişiklikleri yönetmek kolaydır.
- Complexity dil yapısı sayesinde yönetilebilir.
Monolithic dezavantajları?
- Language ve Framework bağımlı durumda bırakır. Gelişmekte olan teknolojileri kullanmaya fırsat tanımaz.
- Bir developer büyük bir kod bloğunu sindirmesi zordur.
- Tek bir takım çok büyük bir uygulamayı yönetmesi zordur.
- Tek bir yerde yapılan değişiklik için tüm uygulamayı deploy etmek zorunda bırakır.
- Yapılan değişiklikler diğer yapılan değişikliklerden dolayı "held-hostage" rehin bölgesinde tutulur.
Microservice
- Küçük servisler kullanılarak oluşturulur.
- Tek bir kod tabanından oluşmaz Monolith gibi değildir.
- Tek bir dil veya framework den oluşmak zorunda değildir.
- Modülleştirilmesi tek bir dil veya frameework'e bağımlı değildir.
- servisler lightweight protocoller kullanılarak iletişim sağlar
-
- HTTP, TCP, UDP, Messaging, etc.
-
- payloads: Json, Bson, xml, protocol buffers, etc.
-
- Net interface tasarımlarını zorunlu kılar.
- Servisleri business kabiliyetlerini kapsamaktadır.
- Yönetmesi kolaydır
-
- Anlaması, test etmesi version alması, deploy etmesi kolaydır.
- doğru araç, dil ve framework kullanımına olanak sağlar.
- farklı hız ve ihtiyaçlara göre servisler ayrılabilir.
- Servisler orkestra edilmez, karografi oluşturur (trafikteki araçlar gibi değildir, trafik ışıklarına göre hareket etmezler. Yol üzerindeki yayalar gibi hareket ederler)
- Genişletilmesi kolaydır.
Microservice dezavantajları
- operasyon tarafında karışıklık artar
- Servisler hata verip çalışmayabilirler. Circuit breakers ler kullanılır bunun için.
- Daha fazla monitor edilmeye ihtiyaç duyulur..
- Dışardan servis çağırmak process method çağırmaktan daha maliyetlidir.
Microservis kullanımında üstesinden gelinmesi gerekenler
- Transaction larda ACID (atomicity, consistency, isolation, durability) sağlanmak zorundadır.
- Özellikleri birden fazla servisten oluşabilir.
- Serviste değişiklik yapılması üstesinden gelinmesi gereken farklı durumları ortaya çıkartır.
-
- Servis ilişkileri dikkate alınması gerekmektedir.
-
- yönetim ve version bağımlılığı dikkate alınmalıdır.
- Module sınırları yeniden düzenlenmelidir.
Microservis yapısı nasıl olmalı
- Yazılımcı için özet olabilecek kadar küçük olmalıdır.
- Küçük bir takım için build edilebilecek ve yönetilebilecek kadar küçük olmalıdır. (Amazon two pizza rule)
- Dokümanlar okunabilecek ve anlaşılabilecek kadar küçük olmalı
- Sınırlı sayıda belirsiz secret key olmalıdır.
- Öngörülebilir ve deneyimlenebilir olmalıdır.
Monolith Microservis olarak nasıl ayrıştırılabilir
- Business fonksiyonlar dikkate alınmalıdır
-
- Noun-based (catalog, cart, customer)
-
- Verb-based (search, checkout, shipping)
-
- Single responsibility principle
-
- Bounded Context
Terimler?
Retry Mechanism:
- Uygulamada transient problemler olduğunda tekrar mekanizmasının kurulması ile 2 veya 3 kere işlem tekrarına sokarak başarılı sonuç alınmasını sağlamaktır.
- web kaynaklı bir transient hata meydana gelirse işlem 5'er saniye ile 3 kez tekrarlanır.
Circuit Breaker:
uygulamaların birbirleri ile veya remote servislerle iş birliğinde iken network splits, timeouts veya aşırı yüklenmesi gidi durumlardan kaynaklanan transient hatalarına bir süre sonra dur demek için kullanılır.
- Close: circuit breaker kapalıdır ve tüm requestler başarıyla gerçekleşmektedir.
- Open: circuit breaker açılmıştır ve başarısız gerçekleşen requestleri kendisine set edilen süre kadar kesmiştir.
- Half-Open: circuit breaker hatanın hala devam edip etmediğini anlayabilmek için bir kaç requestin gerçekleşmesine izin vermektedir. Eğer hata sona erdi ise modu'nu close, devam ediyor ise open moduna alır.
Fallback :
- Bir backup stratejisi diyebiliriz.
- Uygulamanın retry mekanizmalarına girmesine rağmen hala hata almaya devam ediyorsa Fallback mekanizması tanımlanması gerekmektedir.