Spring Cloud Netflix ve Eureka Service Discovery
Merhabalar. Spring Cloud Netflix yazı serimizin 2.’ si olan Ekreuka Service Discovery yazısı ile tekrar karşınızdayım. Hatırlayacağınız üzere serinin ilk yazısı olan Spring Cloud Netflix’ e Giriş yazısında, Spring Cloud’ dan kısaca bahsettikten sonra, Spring Source’ un Spring Cloud ve Spring Cloud Netflix başlığı altında kendisi ile entegre bir şekilde kullanımımıza sunduğu Netflix OSS araçlarına yüzeysel olarak değinmiş ve bu araçların hangi problemlere nasıl çözüm sunduklarını görmüştük. Şimdi ise serinin 2. yazısına konu olan Eureka Service Discovery aracına, kullanım amacına değindikten sonra küçük bir örnek yapacapız.
Adından da anlaşılacağı üzere Eureka bir service discovery aracı, ancak Eureka sadece ön tanımlı bir ortama (kendisine) kaydedilmiş olan servisleri bulmakla kalmayıp, servislerimizi ilgili ortama kayıt etme sorumluluğunu da Eureka Client modülü ile üstlenebilmektedir.
Eurekanın işleyiş şeklini kısaca özetlemeye çalışırsak; biz servislerimizi (microservices) Eureka Client olarak tanımlıyoruz, bu tanımlama işlemi bir notasyon eklemek kadar basittir, ve clientlar properties,yml ya da java konfigürasyonu ile kendilerine tanımlanmış olan ‘Eureka Server’ dediğimiz ortama kendilerini kaydediyorlar, daha sonra bir servise ihtiyacı olan bir diğer servis ulaşmak istediği servisin bilgilerini Eureka Server’ dan alabiliyor ve servislerimizin IP, port vs gibi bilgilerini bir yerde tutmak zorunda kalmıyoruz.
Şimdi dilerseniz Eureka Server’ ı yazmaya başlayalım. Ide üzerinden Spring Boot projesi oluştutuyoruz ve proje bağımlılıklarını Web ve Eureka Server olarak seçiyoruz.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Projemizin bağımlılıkları yukarıdaki şekildeki gibi olup, projemizi ayağa kaldıracak olan ve içerisinde main fonksiyonu bulunan sınıfımıza aşağıdaki şekilde @EnableEurekaServer notasyonunu ekliyoruz.
package com.kodedu.springcloudnetflix.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Projemizin application.properties dosyası ise aşağıdaki şekilde olacaktır.
server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
Yukarıdaki tanımlamada, ilk satır embedded tomcat’ in yani servlet container’ ın hangi porttan hizmet vereceğini belirtir. Diğer iki satır ise, bu uygulama Eureka Server olacağı için, uygulamanın client gibi davraıp register olacak bir Eureka Server aramsını önlemek amacıyla tanımlanmıştır.
Uygulamamızı build edip, çalıştırıp ardından localhost:8761/ adresini tarayıcımızdan açtığımızda bizi aşağıdaki resimde de görülmekte olan Eureka ekranı karşılamaktadır.
Bu ekrandan, Eureka Server’ a kayıt olan servislerimizin yani Eureka Client’ ların listesini, replikaları ile birlikte görebilmekle beraber, Eureka Server’ ın yani uygulamanın kendisine ait, internal IP, uygulama durumu, bellek kullanımı, replikaları vs gibi birtakım bilgilere de ulaşabilmekteyiz.
Şimdi de Eurela Client olarak davranacak bir Spring Boot projesi daha oluşturalım.
Projemizin bağımlılıklarında bir değişiklik olmayacak yani Eureka Server projesinin bağımlılıklarını kullanabiliriz.
Uygulamamızı ayağa kaldıracak olan ve main metodu içeren sınıfımız aşağıdaki şekilde olacaktır.
package com.kodedu.springcloudnetflix.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
@EnableEurekaClient notasyonu, Spring context’ i ayağa kalkarken, application.properties dosyasında tanımlanan konfigürasyonların yüklenmesini sağlayacaktır.
Şimdi de application.properties dosyamıza bakalım.
server.port=4444
spring.application.name=demo-eureka-client
eureka.client.service-url.defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
Eureka, Zuul ile birlikte kullanıldığında uygulamalar arası yönlendirmeler için zuul spring.application.name bilgisini kullanarak, ilgili uygulamanın adresini Eureka Server’ dan alır, bu nedenle bu tanımlama önemlidir.
eureka.client.service-url.defaultZone tanımlaması, Eureka Client olarak davranacak olan uygulamamızın, kayıt olacağı Eureka Server’ ın adresidir. Yukarıdaki tanımlamada, uygulama çalıştırılırken EUREKA_URI parametresi geçilirse bu bilgiyi kullanmasını aksi takdirde, varsayılan olarak http://localhost:8761/eureka adresini kullanmasını uygulamamıza söylemiş oluyoruz.
Eureka Client’ı da ayağa kaldırdıktan sonra, http://localhost:8761/ adresini tekrar ziyaret edelim ve server’ a register olan instance’ ı görelim.
Yukarıdaki ekran görüntüsünde de görüleceği üzere DEMO-EUREKA-CLIENT adında, ip ve port bilgilerini görmekte olduğumuz bir Eureka Client instance vardır. IP:applicationName:port yazısının olduğu linke tıkladığımızda client uygulamamızın /info enpointine gidilir ve buradan Spring Actuator’ un bize sağlamış olduğu bilgilere (mapping, health, status vs.) ulaşılabilir.
2 Comments
Merhaba,
Paylaştığınız bilgiler için teşekkürler. Client’ın sunucudan diğer client’lara nasıl ulaştığını ve “single point of failure”‘ı önlemek için nasıl “cluster” yapıldığından da bahsetseniz bu konuda referans olacak Türkçe bir kaynak olur yazınız.
Yorum için teşekkür ederim. Dikkate alıp, güncelleyeceğim.