Netflix Eureka Nedir? Ne İşe Yarar?

Yunus Emre Nalbant
4 min readJul 5, 2024

--

Netflix Eureka, mikroservislerin birbirlerini bulmasını ve keşfetmesini sağlayan bir servis keşif aracıdır diyebiliriz. Yani, bir mikroservis diğer bir mikroservisi çağırmak istediğinde Eureka sayesinde onun nerede olduğunu öğrenir. Ben kısaca mikroservislerin GPS’i diyorum 🙂

Eureka iki ana bileşenden oluşur:

  • Eureka Server (Eureka Sunucusu): Merkezi bir kayıt defteri görevi görür. Mikroservisler, kendilerini bu sunucuya kaydeder ve çalıştıkları IP adresleri ve port numaraları gibi bilgileri sağlarlar.
  • Eureka Client (Eureka İstemcisi): Mikroservisler, Eureka Server’a kayıt olmak ve diğer servislerin konumunu (network üzerindeki adresini) öğrenmek için Eureka Client’ı kullanır. Bir servis, Eureka Server’a kaydolduğunda, düzenli aralıklarla “ben hala buradayım” (heartbeat) sinyali gönderir. Eğer bir servis belirli bir süre boyunca bu sinyali göndermezse, Eureka Server bu servisin artık mevcut olmadığını varsayar ve kaydını siler.

Netflix Eureka Ne İçin Kullanılır?

Eureka, dinamik olarak değişen mikroservis adreslerinin yönetimini kolaylaştırmak için kullanılır. Bu, özellikle mikroservislerin dağıtık sistemlerde çalıştığı, ölçeklendirildiği ve sık sık güncellendiği ortamlarda çok yararlıdır.

Örneğin, bir mikroservis kapatılıp başka bir sunucuda yeniden başlatıldığında, IP adresi veya portu değişebilir. Bu durumda, diğer mikroservislerin bu yeni adresi (network üzerindeki yeri) bilmesi gerekir. Eureka, bu güncellemeleri otomatik olarak yönetir ve mikroservislerin birbirlerini bulmalarını sağlar.

Netflix Eureka Ne Zaman Kullanılır?

Eureka, özellikle aşağıdaki durumlarda kullanılabilir:

  • Mikroservis Mimarisi: Birden fazla mikroservisin birbiriyle iletişim kurduğu büyük projelerde.
  • Dinamik Ölçeklendirme: Mikroservislerin otomatik olarak başlatıldığı ve durdurulduğu ortamlarda.
  • Yüksek Erişilebilirlik: Servislerin sürekli olarak ulaşılabilir olmasının gerektiği durumlarda.

Bir e-ticaret platformu düşünün. Bu platform, kullanıcılar için ürünler, sepet yönetimi, ödeme işlemleri gibi birçok servisten oluşur. Her servis bağımsız olarak çalışır ve birbirleriyle iletişim kurmak zorundadır.

  1. Ürün Servisi: Kullanıcılara ürün bilgisi sağlar.
  2. Sepet Servisi: Kullanıcıların sepetlerine ürün eklemesine ve çıkarmasına izin verir.
  3. Ödeme Servisi: Kullanıcıların ödeme işlemlerini yönetir.

Bu servisler dinamik olarak ölçeklendirilebilir. Yani, trafik arttığında yeni servisler başlatılabilir, azaldığında ise bazı servisler kapatılabilir. İşte burada Eureka devreye girer.

  • Eureka Server: Tüm bu servislerin kayıt olduğu ve adreslerini bulundurduğu merkezi bir sunucudur.
  • Eureka Client: Her bir servis (örneğin, Ürün Servisi, Sepet Servisi) Eureka Server’a kaydolur ve diğer servislerin adreslerini buradan alır.

Bu sayede, Sepet Servisi ödeme işlemi yapması gerektiğinde, Eureka Server üzerinden Ödeme Servisi’nin adresini öğrenir ve onunla iletişime geçer. Eğer Ödeme Servisi’nin adresi değişmişse, Eureka Server bu güncellemeyi otomatik olarak sağlar ve Sepet Servisi doğru adresi kullanır.

Spring Boot İle Netflix Eureka Kullanımı

  1. Aşağıdaki gibi Eureka Server projesini oluşturuyorum:

2. Daha sonra ServiceRegistryApplication sınıfına gelip aşağıdaki gibi @EnableEurekaServer notasyonunu ekleyerek artık uygulamamıza sen bir service registry oldun diyoruz:

package com.yunusemrenalbant.service_registry;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class ServiceRegistryApplication {

public static void main(String[] args) {
SpringApplication.run(ServiceRegistryApplication.class, args);
}
}

3. Şimdi ise application.properties (daha kolay okunduğunu düşündüğümden dolayı uzantısını yaml olarak güncelledim) dosyasını düzenleyelim:

spring:
application:
name: service-registry
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

server.port: Uygulamamızın hangi port üzerinde çalışacağını belirtir. Burada, Eureka Server'ın 8761 numaralı port üzerinde çalışması sağlıyoruz. Genelliklede 8761 üzerinde çalışır.

eureka.client.register-with-eureka: Bu özellik, Eureka Client'ın kendisini Eureka Sunucusuna kaydetmesini (register) sağlar. Bu örnekte false olarak ayarlandığı için, Eureka Client kendisini Eureka Sunucusuna kaydetmeyecektir. Eureka Server üzerinde sadece diğer servislerin kayıtlı olmasını sağlayacak.

eureka.client.fetch-registry: Bu özellik, Eureka Client'ın Eureka Sunucusundan servis kayıtlarını almasını (fetch) sağlar. Bu örnekte false olarak ayarlandığı için, Eureka Client Eureka Sunucusundan servis kayıtlarını almaz.

eureka.client.service-url.defaultZone: Bu özellik, Eureka Client'ın Eureka Sunucusunun adresini belirtir. ${eureka.instance.hostname} ve ${server.port} değişkenleri, önceki ayarlarda belirtilen değerlerle değiştirilir. Bu durumda, http://localhost:8761/eureka olarak belirtilmiştir.

4. Eureka Server şu an hazır. Uygulamamızı başlattığımızda 8761 portunda bizi şöyle bir sayfa karşılayacak:

Gördüğümüz üzere No instances available yazısıyla karşılaşıyoruz. Bu aslında eureka server’da hiçbir kayıtlı servis yok demek. Gelin şimdi onları ekleyelim:

  1. Aşağıdaki gibi payment-service adında uygulamayı oluşturuyorum. Burada Eureka Discovery Client bağımlılığını eklediğimize dikkat edelim. Bu bir server değil, client olacak:

2. PaymentServiceApplication sınıfına gelelim ve @EnableDiscoveryClient notasyonunu ekleyerek ona bir Eureka server’a kaydolabileceğini söylüyoruz.

package com.yunusemrenalbant.payment_service;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentServiceApplication {

public static void main(String[] args) {
SpringApplication.run(PaymentServiceApplication.class, args);
}
}

3. application.yaml dosyasını aşağıdaki gibi güncelleyelim:

spring:
application:
name: payment-service
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka

server.port: Uygulamamızın hangi port üzerinde çalışacağını belirtir. Uygulamamız 8081 portunda çalışacaktır.

eureka.client.service-url.defaultZone: Eureka Client'ın Eureka Sunucusunun adresini belirtir. Bu özellik, Eureka Client'ın, Eureka Sunucusuna nasıl bağlanacağını ve servis kayıtlarını nereden alacağını belirler.

http://localhost:8761/eureka değeri, Eureka Sunucusunun URL'sini ifade eder. Burada yukarıda yaptığımız localhost üzerinde çalışan bir Eureka Server olduğunu söylüyoruz.

İki uygulamayıda ayağa kaldırdıktan sonra tekrar 8761 portuna gidip bir şeyler değişmiş mi bakalım.

Gördüğünüz üzere uygulamamızı Eureka Server’a başarıyla bağladık. Artık bu uygulama, diğer mikroservislerle iletişim kurmak için Eureka üzerinden adreslerini bulabilecek.

Kodun tamamını incelemek isterseniz github adresim üzerinden inceleyebilirsiniz.

--

--