Microservice ile Spring Boot , Eureka ve Load Balancing

4 8,145

Merhaba arkadaşlar ,

Bu örneğimizde mikroservis mimarisi ile euroke server nasıl kurulur ve birden çok aynı servisi deploy edilmiş ise bunun yük dağılımını ayarlamak.

Bildiğiniz üzere mikroservisler ile proje geliştirdiğimizde en büyük sorunu birden çok mikroservisin kontrolü ve bilinirliğidir. Bazı zamanlar servisler o kadar çoğalıyorki bunların konumu hakkında belirsizlik oluşuyor. Bunun önüne geçmek için çözümümüz bütün mikroservislerin konumu ve bilgisini bir tane mikroservise devretmek. Bunu euroka server ile yapacağız.

Bu yazımızda 4 tane mikroservis yazacağız. Birisi euroka server olan “registration-service” sonrasında bu servisimize register olan “product-service” ve “customer service” , en son ise bu servisler arasında yük dağılımı yapan bir servis yazacağız ismi “router” olsun.

Şimdi ilk servisimiz (registration-service) ile başlayalım. Maven projesi açıyoruz ve proje bağımlılıklarımızı xml dosyamıza ekliyoruz. Kod içerisnde gerekli yerlerde yorum satırı eklenmiştir.

pom.xml

 

Servisimizi ayağa kaldırırken sunucu ve servisimiz için gerekli propertyleri ekliyeceğimiz dosyamızı “resources” dizinimize ekleyelim.

application.properties

Sonrasında ise sınıfımızı yazalım .

Application.java

Projemizi ayağa kaldırıp Eureka server ekranına bakalım. Eclipse için Run as > Run Configuration > Maven build > New diyerek çıkan ekranda Goals kısmına spring-boot:run yazarsanız proje sıkıntısız ayağa kalkacaktır veya klasik yöntem yazdıgımız servisi build ettikten sonra target dizinize çıkan jar dosyasına direk java -jar service-ismi.jar yazdığınızda servis ayağa kalkmış oalcaktır.
Servis ayağa kalktığında eureka sunucu ekranı çıktısı şöyle olacaktır.
http://localhost:8095/

Şimdi ise product-service ve customer-service bu iki servisimizi yazmaya başlayalım.

product-service

Bu servisimiz içinde bir tane end-point olan ve restful servisin bize String bir değer dönecek yük dağılımını test etmemiz için iki kere build alacağımız serviste birinde response olarak “Product Service 1” ikincisinde ise “Product Service 2” dönecektir. Bunun sonucunda servisimize router üzerinden her istek attığımızda yükü eureka server iki servisede eşit olarak dağıtıyormu onu gözlemleyeceğiz.
Maven projesi açıyoruz ve bağımlılıklarımızı ekliyoruz.

pom.xml

Sonrasında servisimizi ayağa kaldırırken sunucu ve servisimiz için gerekli propertyleri ekliyeceğimiz dosyamızı “resources” dizinimize ekleyelim.

application.properties

Şimdi ise restful servisimizin endpointi olan sınıfı yazıyoruz. gerekli açıklamalar yorum satırı olarak eklidir.

ProductController.java

Sonrasında ise projemiziin çalışması için gerekli main sınıfımızı yazıyoruz.

Application.java

Servisimizi ilk servisimiz gibi çalıştırabilirsiniz. Servisimizi çalıştırdığımızda eureka server ekranına register olmuşmu diye bakabiliriz. Servis ismi ile register olacağından ekranda product-service olarak görmemiz lazım.

Çıktısı:

Şimdi ise register olması için cutomer-service yazalım aynı şekilde maven projesi olacak.
pom.xml

servis ayağa kalabilmesi için property elrin olduğu dosyası ekleyelim resources dosyasına

application.properties

Servisimizin ayağa kalkması için main sınıfımızı yazalım.
Application.java

Servisi ayağa kaldırdığımızda eureka server ekranına baktığımızda servisin register olduğunu görmeliyiz.

Çıktısındada göründüğü gibi iki servisimizde register olmuş .

Şimdi ise bahsettiğimiz load balancing testimizi yapabilmemiz için router-service ‘imizi yazalım.
ilk önce maven projesi açıyoruz. Proje bağımlılıklarımızı ekliyoruz.

pom.xml

servis ayağa kalabilmesi için property ‘ lerin olduğu dosyası ekleyelim resources dosyasına
application.properties

daha sonra servisimizi çalıştıracagımız main sınıfımızı ekliyoruz.

Application.java

gerekli açıklamalar kod içersinde yorum satırı olarak eklenmiştir.

şimdi ise bu servisimizi çalıştıralım ve eureka server’e register olmuşmu bakalım.
çıktısı:

şimdi ise yük dağılımı yapılıyormu product-service üzerinden test edelim. Bunun için product-service’ten iki tane ayağa kaldırıyoruz. restful servisten response yukarda demiştik birinde olarak “Product Service 1” ikincisinde ise “Product Service 2” dönecektir.

Burada dikkat edilmesi gereken ikinci product-service ‘i ayağa kaldırırken porrunu farklı vermemiz gerekiyor. Aynı isimde register olacakları için bir servisten 2 tane ayağa kalkmış olacaktır. Çıktısı şöyle olacaktır servisi ayağa kaldırdığımızda

Testimize başlamadan önce router’ın çalışma mantığına deyinelim , router servisimizin portu 8000 olarak ayarlamıştık. router üzerinden customer servisimize gideceğiz. İşleyiş şöyledir router aslında sadece bir yönlendiricidir, gider register-service’e derki şu isimle sana register olmuş servis varmı var ise isteğimi ona ilet, mesela customer-service gidelim router üzerinden url şu şekilde olacaktır.

<router-service> : <servis-portu> / <gidilecek servis ismi>
http://localhost:8000/customer-service

yukardaki şekilde router üstünden servisimize ulaştık , şimdi ise product-service’ten iki tane ayağa kaldırmıştık. Yük dağılımı yapıyormu test edelim yani router üzerinden product-service’e gideceğiz ve register-service acaba bize iki serviside dönderiyormu bakalım. Rest servislerimiz bize iki değeride ( “Product Service 1” ve “Product Service 2” ) dönderir ise eğer iki servisede gidiyor demektir. Testi için iki chrome açarak şu linke istek atmanız yeterli
http://localhost:8000/prodcut-service/test

Çıktısı

Umarım yararlı olmuştur.

İyi Çalışmalar

4 Comments
  1. Fatih says

    İçeriği anlamadığım halde java olunca heyecanla okudum. İlgilenenler için faydalı gibi görünüyor

  2. TheCoder says

    Product Service controllerda return degeri olarak Product Service 1 olarak donduruluyor. Ne kadar istek atarsak atalim surekli olarak Product Service1 donecektir.

    1. Mehmet Kılıç says

      Merhaba TheCoder ,

      Sanırsam Product Service bir kere build alıyorsunuz. Açıklamalarda iki kere build almamız gerektiğini yazmışım gözünüzden kaçmış olabilir. Çözüm olarak aynı servisi ilk build ettiğinizde ProductController daki “test” endpoint’imizin response değerine (return “Product Service 1”;) ve ikinci build aldığınızda ise (return “Product Service 2”;) olarak set ederseniz doğru şekilde çalışacaktır. Sorun devam ederse eğer çekinmeden yazınız yardımcı olamaya çalışırım.

      İyi Çalılmalar

  3. Ahmet says

    Merhabalar Hocam

    Değerli bilgileriniz için teşekkürler acaba githubda kodu paylaştınızmı

Email adresiniz yayınlanmayacaktır.