Microservice Mimarisi Nedir ? Microservice Mimarisine Giriş
Microservice tek başına tek sorumluluğu olan ve tek iş yapan sadece o işe ait işleri yürüten modüler projelerdir.
Günümüz yazılım dünyasında oldukça fazla konuşulan yapıların başında microserviceler gelmektedir. Microservice mimarisi ile geliştirilen iki farklı projede yer aldım, doğru ve yanlış uyguladığımız sonra tekrar düzelttiğimiz noktalar oldu. Bu tecrübeyi en başından başlayarak anlatmak için başta nedir, ne değildir olmak üzere, en iyi pratikleri, nerelerde kullanılması hatta kullanılmaması gerektiğini ve eksilerini yazacağım bu yazı dizisine başlıyorum.
Microservice Nedir ?
Adından da anlaşılacağı gibi,microserviceler temelde bir yazılım uygulamasında belirli özellik yada fonksiyonu sağlayan, tek bir amaca hizmet eden, birbirinden bağımsız yazılım servislerdir. Bu hizmetler bağımsız olarak bakımı yapılabilir, izlenebilir ve dağıtılabilir yapıya sahip olmalıdır..
Microservice tek başına tek sorumluluğu olan ve tek iş yapan sadece o işe ait işleri yürüten modüler projelerdir.
Microservice Mimarisi
Son yıllarda birçok projenin microservice mimarisi kullandığını gördük, duyuyoruz ve şu ana kadarki sonuçlar genelde olumlu olduğu aşikar, bu yüzden de kullanımı her geçen gün daha da artıyor. Durum öyle bir hal aldı ki artık bir proje geliştirilmek istendiğinde neden nasıl sorularını irdelemeden “microservice mimarisinde yapalım” cevapları veriliyor. Bunun cevabını vermeden önce microservice mimarisi nedir, avantajları nelerdir gibi soruların cevabını öğrenmekte fayda var.
Microservice mimarisinin başlangıç noktası SOA’dır. Microservice, SOA yani services oriented architecture üzerine kurulmuş bir mimaridir.
Service oriented architecture (SOA), uygulamaların birbirleriyle tek bir makine veya ağ üzerinden birden çok makineye dağıtıldığında, servislerin dağıtım sistemde iletişim kurmasını sağlayabilen bir mimaridir.
Microservice mimarisi, tek bir uygulama geliştirirken modüler bir yapıda her biri küçük servis olarak düşünülmesi gereken ve her bir servisinde kendi işini ve iletişimini yürütebilen, çok karmaşık olmayan ve başka servislere bağımlılığı az olan mekanizmalara sahip bir yaklaşımdır. Bu servisler kendilerinin sorumlu olduğu tek bir işe odaklı ve bağımsız çalışabilen, otomatize bir deployment mekanizmasına sahip bir yapıdadır. Merkezi yönetim mekanizmalarından oldukça arındırılmış olmalıdır. Farklı programlama dillerinde geliştirilebilir ve farklı veri tabanı teknolojileri kullanılabilir.
Her bir microservice diğer hizmetler ile (loosely coupled) oldukça az bağımlılığa sahip bir şekilde çalışmaktadır. Bu hizmetler kendi kendine yeten ve tek bir işlevsellik (veya bir grup ortak işlevsellik) sunmaktadır.
Microservice mimarisine uygun geliştirilen herhangi bir servis üzerinde, geliştirici bağımsız olarak çalışabilir, böylece geliştirme aşaması da kolaylaştırılmış olur.
Microservice Mimarisi Nasıl Olmalıdır ? Microservice Mimarisinin Avantajları Nelerdir ?
Her servis büyük bir uygulamanın, mini projeleri olarak düşünülebilir!
- Microserviceler farklı makinelerde çalışabilir ve tüm servisler birbirleriyle kendi başlarına iletişim kurabilir olmalıdır. Yeni bir servis diğer servislerde bir değişikliğe neden olmadan geliştirilebilir ve deploy edilebilir olmalıdır.
Bağımsız Deployment — Servisler birbirinden bağımsız olarak, herhangi bir platformda ayrı ayrı deploy edilebilir. - Microserviceler, otomatize bir biçimde gerekli aşamalardan geçerek (Unit Tests, Integration Tests, Sonarqube,Automation Tests) deploy edilmelidir. Bu mekanizma, projede kaliteyi artırır.
- Her bir servis bağımsız olarak geliştirilebilmeli, test edilebilmeli, deploy edilebilmelidir. Böylece uygulamanın kalitesi ve esnekliği artar.
- Bağımsız Geliştirme — Tüm microservice kendi işlevselliğine göre kolayca geliştirilebilir.
- Herhangi bir servisteki sorun, diğer servisleri etkilemez, böylece kullanıcılar diğer servisleri kullanabilir konumda olur.
- Hata İzolasyonu — Projenin herhangi bir servisinde oluşacak bir sorun, projenin diğer servislerini etkilemeyeceği için, sistem hala çalışmaya devam eder.
- Herhangi bir serviste oluşacak trafik tüm sistemin scale olmasını gerektirmeden, trafik altındaki servis çoklanarak sorun ortadan kaldırılabilir.
- Ölçeklenebilir — Her bir bileşen kendi ihtiyacına göre ölçeklenebilir, tüm bileşenleri ölçeklendirmeye gerek yoktur.
- Her geliştirici kendi ilgilendiği servis üzerinde bağımsız olarak geliştirme yapabilmelidir, yeni bir servisi kendi geliştirebilmeli ve diğer servisleri etkilenmeden bu hizmetler deploy edilebilir olmalıdır.
- Bir servis için geliştirme yapıldığında, o servisteki geliştirme projenin tümünü etkilememeli böylece diğer özellikler halen çalışır konumda olmalıdır.
- Gereksinimleri karşılamak için en son yada en uygun teknoloji kullanılabilir. Her bir servis farklı dil veya farklı database kullanabilir. Her farklı özellik, diğer özelliklerden bağımsız olarak farklı bir ekip tarafından farklı bir teknoloji kullanılarak gerçekleştirilebilir.
- Tüm servisler, alanlarına, görevlerine ve özelliklerine göre farklı microservice ayrılmalıdır.
Teknoloji Çeşitliliği — Aynı projenin farklı servislerini geliştirirken farklı diller ve teknolojiler kullanılabilir. - Bu microserviceler, fonksiyonlarını yerine getirmek için kendi yük dengeleyici(load balancing) ve uygulama ortamlarına sahiptir ve aynı zamanda kendi veritabanlarında veri saklamalıdır.
- Tüm microserviceler birbirleriyle REST veya Message Bus üzerinden haberleşmelidir. İkisi birden de kullanılabilir.
- Microserviceler tarafından gerçekleştirilen tüm işlevler API Gateeway üzerinden istemcilere iletilebilir olmalıdır. Tüm iç end-pointler API Gateway’e bağlanır. Böylece, API Gateway’e bağlanan herhangi biri otomatik olarak tüm sisteme bağlanabilmelidir.
Microservicelerin Temel Özellikleri Nelerdir ?
- Decoupling — Bir sistemdeki servisler büyük ölçüde birbirinden bağımsızdır.
- Componentization — Microserviceler, kolayca değiştirilebilen ve versiyonları artırılabilen bağımsız bileşenlerdir.
- Business Capabilities — Bir microservice basit bir yapıdadır ve tek bir göreve odaklanır.
- Autonomy — Geliştiriciler ve ekipler birbirlerinden bağımsız olarak çalışabilir, böylece hızlıca geliştirme ve test süreçleri yürütülebilir.
- Continuous Delivery — Yazılım geliştirme, test etme ve onaylama sistematik otomasyonu ile sık sık yazılım sürümlerini canlıya almaya otomatik bir biçimde izin verir. Servisler ayrı ayrı deploy edilebileceği için, deployment süresi kısalır ve maliyet zamanla azalır.
- Decentralized Governance — Odak, doğru iş için doğru aracı kullanmaktır. Bu, standart bir teknoloji veya yapıyı zorunlu kılmadığı anlamına gelir. Geliştiriciler, sorunlarını çözmek için en iyi teknolojiyi seçme özgürlüğüne sahiptir.
- Agility — Microserviceler çevikliği destekler. Herhangi bir yeni özellik hızla geliştirilip sisteme adapte edilebilir.
Microservicelerin eksiklikleri ve dikkat edilmesi gereken noktaları nelerdir ?
Eksik yönlerini çözümleriyle birlikte inceleyebiliriz.
- Her bir microservice için ayrı bir derleme, dağıtım ve sürüm iş akışı gerekir. Bu nedenle, kurulum iş akışının otomatik hale getirilmesini sağlamak önemlidir, aksi takdirde operasyon ekipleri için artan iş yükü demektir.
- Her bir servisi ayrı ayrı izlenebilir ve bakımı yapılabilir olmalıdır. Prometheus bunun için iyi bir araçtır.
- Microserviceler, yapılandırma sistemindeki iş yükünü arttırır. Harici servislerin yapılandırılması genellikle servisler arasında paylaşılır ve servis sayısı arttıkça zaman alıcı bir iş haline gelebilir.
- Servisler arasındaki REST trafiği performans açısından olumsuz bir yön alabilir. Bu sorunu çözmek amacıyla önbelleğe alma ve eşzamanlılık genellikle performansı artırılabilir.
- Microserviceler üzerinde güvenlik, parallellik karmaşıklığı artıran etmenlerdir. Bu karmaşıklığı iyi yönetmek gerekir.
- Yeni özelliklerin mevcut hizmetlerin işlevselliği bozulmadığından emin olmak için uygulama düzeyinde testler önem vermek gerekir.
- Her hizmetin kendi sürümleri, yayın planı ve yayın döngüleri olduğu için dokümantasyon çalışması daha fazladır.
- Uygulamaların ve kod tabanlarının sayısı arttığında, onu düzgün bir şekilde korumak ve yönetmek için çaba harcanır.
- Bağımlılığı azaltmak için kod tekrarı yaşanabilir, ancak performans göz önüne alındığında bu kod tekrarları göz ardı edilebilir.
Bağımsızlık microservicelerin temelini oluşturan en önemli etmen olarak göze çarpmaktadır. Bağımsız geliştirme, bağımsız programlama dili, bağımsız veritabanı, bağımsız teknoloji, bağımsız test edilebilme, bağımsız deploy edilebilmeli özellikleri microservice temelini oluşturmaktadır.
Tüm etmenler göz önüne alınarak geliştirmelere odaklanmalıdır. Her proje bu mimariye göre geliştirilmemelidir. Hangi projelerin bu mimariye uygun olduğu hangilerinin olmadığı ve nasıl bir sisteme uygulanabileceği, monolitik mimariden ayrılan yönlerini bu dizinin devamında aktarıyor olacağım.
Microserviceler hakkında biraz daha bilgi edinmeye ne dersiniz? Serinin devam yazısını aşağıdan okuyabilirsiniz.
Microservice mimarisini detaylı bir şekilde öğrenebilmek için Martin Fowler’ın makalesini incelemelisiniz;