Eğitim Portalı/Spring Boot/Eureka'ya Servis Kaydı ve Servisler Arası Çağrı
Spring Boot03-spring-boot/24-eureka-servis-kayit

Eureka'ya Servis Kaydı ve Servisler Arası Çağrı

> ⚠️ Bu konuda çalıştırılabilir örnek yoktur. Spring Cloud + Eureka + birden çok servis > gerektirir; portalda çalışmaz. Kod tanıtım amaçlıdır.

Eureka'ya Servis Kaydı ve Servisler Arası Çağrı

⚠️ Bu konuda çalıştırılabilir örnek yoktur. Spring Cloud + Eureka + birden çok servis gerektirir; portalda çalışmaz. Kod tanıtım amaçlıdır.

Önceki konuda Eureka Server'ı (kayıt defteri) kurduk. Şimdi servisleri bu deftere kaydetmeyi ve bir servisin başka bir servisi adıyla (IP yazmadan) çağırmasını ele alıyoruz.

Servisi Eureka'ya kaydetmek (Eureka Client)

Her mikroservise Eureka istemcisi eklenir:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
# odeme-servisi'nin application.yml'i
spring:
  application:
    name: odeme-servisi          # bu ADLA kaydolur (önemli!)
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/   # Eureka Server adresi

Servis açılınca otomatik olarak Eureka'ya ODEME-SERVISI adıyla kaydolur ve düzenli heartbeat gönderir. (Modern Spring Cloud'da @EnableEurekaClient artık gerekmez; bağımlılık yeter.)

Başka servisi adıyla çağırmak

Artık IP/port değil, servis adı kullanılır. İki yaygın yol:

1) Load-balanced RestClient/RestTemplate

@Bean
@LoadBalanced                        // servis adını Eureka'dan çözer + yük dengeler
RestClient.Builder restClientBuilder() { return RestClient.builder(); }

// Kullanım: host yerine SERVİS ADI
Odeme o = restClient.get()
    .uri("http://odeme-servisi/api/odeme/{id}", id)   // "odeme-servisi" -> Eureka çözer
    .retrieve().body(Odeme.class);

@LoadBalanced sayesinde odeme-servisi adı, Eureka'daki güncel örneklerden birine (yük dengelenerek) yönlendirilir.

2) OpenFeign (bildirimsel istemci — çok yaygın)

implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
@FeignClient(name = "odeme-servisi")           // Eureka'daki servis adı
public interface OdemeIstemci {
    @GetMapping("/api/odeme/{id}")
    Odeme getir(@PathVariable Long id);          // sadece arayüz — gövde Feign tarafından üretilir
}

// Kullanım: normal bir bean gibi enjekte et ve çağır
odemeIstemci.getir(42);   // arka planda HTTP + Eureka çözümleme + yük dengeleme

OpenFeign, servisler arası çağrıyı bir arayüz kadar basit yapar (HTTP detayını gizler).

Akış (uçtan uca)

1. Ödeme Servisi açılır -> Eureka'ya "ODEME-SERVISI @ 10.0.0.5:8082" diye kaydolur
2. Sipariş Servisi de kaydolur ve Eureka registry'sini önbelleğe alır
3. Sipariş Servisi "http://odeme-servisi/api/odeme/42" çağırır
4. @LoadBalanced/Feign, "odeme-servisi"ni Eureka'dan çözer -> 10.0.0.5:8082
5. İstek gider; birden çok örnek varsa aralarında yük dengelenir

Dayanıklılık (resilience)

Servisler arası çağrılar ağ üzerindedir → başarısız olabilir. Üretimde:

  • Zaman aşımı + yeniden deneme (retry).
  • Devre kesici (circuit breaker) — Resilience4j: sürekli hata veren servise çağrıyı keser, yedek (fallback) döner (eski Hystrix'in yerine — ayrı konu).
  • Yük dengeleme: Spring Cloud LoadBalancer (istemci tarafı).

Özet

Bir servisi Eureka'ya spring.application.name ile kaydetmeyi ve başka servisi adıyla çağırmayı öğrendik: @LoadBalanced RestClient ve bildirimsel OpenFeign (@FeignClient) ile — ikisi de Eureka'dan adres çözüp yük dengeler; uçtan uca akış ve dayanıklılık (retry/circuit breaker) pratikleri. Sırada, tüm bu servislerin önündeki tek giriş kapısı: API Gateway.