Service Discovery and Service Registry

mustafacam

Mustafa Çam

Posted on June 6, 2024

Service Discovery and Service Registry

Image description

Image description

Service Discovery ve Service Registry, mikroservis mimarisinin önemli bileşenleridir. Her ikisi de mikroservislerin dinamik olarak keşfedilmesini ve birbirleriyle iletişim kurmasını sağlar. Ancak, bunlar farklı roller oynar ve birlikte çalışarak mikroservislerin yönetimini kolaylaştırır.

Service Registry (Servis Kayıt Defteri)

Service Registry, mikroservislerin ağ üzerindeki yerlerini (IP adresi ve port) kaydettikleri merkezi bir kayıt defteridir. Mikroservisler başlatıldığında kendilerini bu kayıt defterine kaydederler ve kapandıklarında veya kullanılamaz hale geldiklerinde bu kayıttan silinirler.

Özellikleri:

  1. Dinamik Kayıt ve Kaldırma: Servisler başlatıldığında kendilerini kaydeder ve kapandıklarında kayıttan kaldırırlar.
  2. Sağlık Kontrolleri: Service Registry, servislerin sağlık durumlarını izleyebilir ve yalnızca sağlıklı servislerin kullanılmasını sağlar.
  3. Merkezi Yönetim: Servislerin nerede çalıştığını merkezi bir şekilde yönetir.

Örnek: Netflix Eureka

Eureka, popüler bir Service Registry örneğidir. Mikroservisler Eureka'ya kendilerini kaydeder ve diğer servisler de ihtiyaç duyduklarında Eureka'dan bu servislerin yerini öğrenirler.

Service Discovery (Servis Keşfi)

Service Discovery, mikroservislerin birbirlerini dinamik olarak bulmasını sağlayan bir mekanizmadır. Service Discovery, iki ana yöntemle gerçekleştirilir: Client-Side Discovery ve Server-Side Discovery.

Client-Side Discovery

Bu yöntemde, istemci uygulaması doğrudan Service Registry'yi sorgular ve ihtiyaç duyduğu servisin yerini öğrenir. İstemci, aldığı bilgilerle servise doğrudan bağlantı kurar.

Server-Side Discovery

Bu yöntemde, istemci bir istek yapar ve bu istek bir yük dengeleyici veya API Gateway aracılığıyla yönlendirilir. Yük dengeleyici, Service Registry'yi sorgular ve servisin yerini bulur, ardından isteği doğru servise iletir.

Örnek Kullanım Senaryosu

Bir mikroservis mimarisinde, farklı servislerin birbirleriyle nasıl iletişim kurduğunu inceleyelim:

  1. Eureka Server Kurulumu

Eureka Server, merkezi bir kayıt defteri olarak çalışır. Mikroservisler bu server'a kendilerini kaydederler.

Bağımlılık Ekleyin:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
Enter fullscreen mode Exit fullscreen mode

Ana Sınıf:

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
Enter fullscreen mode Exit fullscreen mode

Konfigürasyon:

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  server:
    wait-time-in-ms-when-sync-empty: 0
Enter fullscreen mode Exit fullscreen mode
  1. Eureka Client Kurulumu (Mikroservis)

Her mikroservis, Eureka Server'a kendini kaydeder ve diğer servislerin yerlerini öğrenir.

Bağımlılık Ekleyin:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Enter fullscreen mode Exit fullscreen mode

Ana Sınıf:

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

@SpringBootApplication
@EnableEurekaClient
public class SomeServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(SomeServiceApplication.class, args);
    }
}
Enter fullscreen mode Exit fullscreen mode

Konfigürasyon:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
Enter fullscreen mode Exit fullscreen mode
  1. Feign Client Kullanımı

Mikroservisler arasında iletişim kurmak için Feign Client kullanılabilir.

Feign Client Arayüzü:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "other-service")
public interface OtherServiceClient {

    @GetMapping("/resource/{id}")
    Resource getResourceById(@PathVariable("id") Long id);
}
Enter fullscreen mode Exit fullscreen mode

Servis Kullanımı:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SomeService {

    private final OtherServiceClient otherServiceClient;

    @Autowired
    public SomeService(OtherServiceClient otherServiceClient) {
        this.otherServiceClient = otherServiceClient;
    }

    public Resource fetchResource(Long id) {
        return otherServiceClient.getResourceById(id);
    }
}
Enter fullscreen mode Exit fullscreen mode

Sonuç

Service Registry ve Service Discovery, mikroservislerin dinamik ve ölçeklenebilir bir şekilde yönetilmesini sağlayan kritik bileşenlerdir. Service Registry, mikroservislerin yerlerini kaydederken, Service Discovery bu kayıtları kullanarak mikroservislerin birbirlerini bulmasını ve iletişim kurmasını sağlar. Bu mekanizmalar, mikroservis mimarisinin esnekliğini ve yönetilebilirliğini artırır.

💖 💪 🙅 🚩
mustafacam
Mustafa Çam

Posted on June 6, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related