Service Discovery and Service Registry
Published: 2024-06-06 10:59:08


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fxzvyyn44rgurp024kra.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zvpf19bit0fvsxigmjex.png)




**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:
```xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
```

#### Ana Sınıf:
```java
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);
    }
}
```

#### Konfigürasyon:
```yaml
server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
  server:
    wait-time-in-ms-when-sync-empty: 0
```

2. **Eureka Client Kurulumu (Mikroservis)**

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

#### Bağımlılık Ekleyin:
```xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```

#### Ana Sınıf:
```java
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);
    }
}
```

#### Konfigürasyon:
```yaml
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
```

3. **Feign Client Kullanımı**

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

#### Feign Client Arayüzü:
```java
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);
}
```

#### Servis Kullanımı:
```java
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);
    }
}
```

### 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.