Microservice Mimarilerinde Service Discovery
Merhaba.Bu yazıda microservice mimarilerinin temel konularından biri olduğunu düşündüğüm Service Discovery konusundan bahsetmek istiyorum.
Microservice mimarisi,birbirinden bağımsız olarak deploy edilebilen,ayrı ekipler tarafından geliştirilebilir ve kullanılan teknolojiler bakımından birbirine bağlı olmayan servislerin oluşturduğu bir mimari.Bir monolithic uygulama microservicelere business domain’e göre ayrılabilir.Bu servisler birbirleri ile bir network üzerinden haberleşir.Genelde bu haberleşme Rest API aracılığı ile olur.
Bu haberleşmenin yapılabilmesi için de aslında her bir microservice’in onu tanımlayan bir ip adresine ihtiyacı vardır ki bu adres üzerinden request alabilsin.
Fakat burada şöyle bir sorunla karşılaşmaktayız.Microservice mimarisinde servisleriniz çok dinamik bir yapıya sahiptir.Mesela uygulamaya gelen isteklerin yoğunluğuna göre bazı microservislerinizi scale out etmeniz yani var olan instance sayısını artırmanız gerekebilir.Ya da microservice’lerinizden bazıları zamanla fail olabilir.Bunun yerine yenisi oluşturulabilir ve isteğinizi karşılayacak ip adresi zaman içerisinde değişebilir.Bu yüzden daha ayrıntılı bir yapıya ihtiyacımız var.Bu yapıya Service Discovery diyoruz.
Peki microservicelerin adresleri nasıl takip edilecek ve isteklerin hangi adrese gideceğini nasıl ve nereden öğreneceğiz?
Burada aslında işin en önemli parçası Service Registry.Bunu ayakta olan instanceların kaydını tutan bir veritabanı olarak düşünebiliriz.Dolasıyısıyla her an ulaşılabilir olmak durumundadır.Ayağa kaldırılan her instance buraya kaydolur ve belli aralıklarla bu instance’ın ayakta olup olmadığı kontrol edilir.Çünkü bu veritabanı olabildiğince güncel tutulmalıdır.Bir instance kapatılacağı zaman da unregister olarak kaydı silinir.Netflix’e ait Eureka bir service registry ürünüdür.Rest API’lar aracılığı ile yeni bir instance’ın register edilmesini veya kayıtlı olan instanceların sorgulanmasını sağlar.
2 tür service discovery patterni bulunmakta.Client-Side Service Discovery ve Server-Side Service Discovery.
Client-Side Service Discovery
Bu yapıda client service registry ile iletişime geçer ve istediği domainin adresini sorar.Service registry üzerinde kayıtlı olan yani ulaşılabilir durumdaki microservice instance’larının ip adreslerini verir.Daha sonra client bir load-balancing algoritmasına göre bu microservicelerden en uygun olanı seçer ve microservice ile iletişim kurar.Gördüğünüz gibi burada client,ip adresini elde ederek microservice ile kendisi iletişim kurmaktadır.
Server-Side Service Discovery
Burada ise client bir Load Balancer(Yük Dengeleyici) ile iletişim kurar.İsteğini buraya iletir.Load Balancer ise Service Registry ile konuşarak avaliable durumdaki instance’ların listesini alır.Daha sonra da arasından kendi algoritmasına göre en uygun gördüğü instance’a client’tan aldığı isteği yönlendirir.
İkisinin arasındaki fark Client-Side Service Discovery yapısında client,instance ile kendisi iletişim kurmaktadır.Çünkü o instance’ın ip adres bilgisini service registry’e sorarak öğrenmektedir.Server-Side Service Discovery örneğinde ise request load balancer aracılığı ile instancelara iletilmektedir.
Microservice Architecture ve Service Discovery konularında daha fazla ve detaylı bilgi almak isterseniz Tarik Guney’ e ait aşağıdaki videoları izleyebilirsiniz.