22- Java Microservices ve Spring Cloud

### Microservices Mimarisi


**Microservices** mimarisi, büyük ve karmaşık uygulamaları küçük, bağımsız, ve birbirinden ayrılmış servisler olarak tasarlamanın bir yoludur. Her mikroservis, belirli bir işlevi yerine getirir ve kendi veri yönetimi, iş mantığı ve bağımsız olarak deploy edilebilirliği ile karakterizedir.


#### Temel Özellikler


1. **Bağımsız Dağıtım**: Her mikroservis, bağımsız olarak dağıtılabilir ve güncellenebilir.

2. **Kapsülleme**: Her mikroservis, kendi veritabanını ve iş mantığını içerir.

3. **Küçük ve Yönetilebilir**: Mikroservisler, küçük ve belirli bir işlevi yerine getirecek şekilde tasarlanır.

4. **Takım Yönetimi**: Farklı takımlar, farklı mikroservislerin geliştirilmesini ve bakımını yapabilir.

5. **Teknoloji Bağımsızlığı**: Her mikroservis, farklı teknolojiler kullanarak geliştirilebilir.


#### Avantajlar


- **Esneklik**: Mikroservisler bağımsız olarak güncellenebilir ve dağıtılabilir.

- **Ölçeklenebilirlik**: Servisler, ihtiyaç duyulan bileşenler bazında ölçeklenebilir.

- **Teknoloji Çeşitliliği**: Farklı servisler, farklı teknolojiler ve veri tabanları kullanabilir.


#### Dezavantajlar


- **Kompleksite**: Dağıtılmış sistemlerdeki iletişim ve veri senkronizasyonu karmaşık olabilir.

- **Dağıtım Zorlukları**: Dağıtım ve yönetim daha karmaşık hale gelebilir.


---


### Spring Cloud Temelleri


Spring Cloud, microservices mimarisini uygulamak için kullanılan bir araç ve kütüphaneler setidir. Spring Cloud, mikroservislerin yönetimini, iletişimini ve yapılandırmasını kolaylaştıran birçok bileşen sunar.


#### Temel Bileşenler


1. **Spring Cloud Config**: Merkezi bir yapılandırma yönetimi sağlar.

2. **Eureka**: Servis keşfi sağlar ve mikroservislerin birbirini bulmasını sağlar.

3. **Spring Cloud Gateway**: API geçidi olarak işlev görür ve mikroservislere yönlendirme yapar.

4. **Spring Cloud Circuit Breaker**: Hata yönetimi ve toleransı sağlar.

5. **Spring Cloud Sleuth**: Dağıtılmış izleme ve loglama sağlar.


---


### Servis Keşfi ve Bağlantı Yönetimi


#### Servis Keşfi


**Servis keşfi**, mikroservislerin birbirini bulmasını ve iletişim kurmasını sağlayan bir mekanizmadır. Spring Cloud, Eureka gibi servis keşfi çözümleri sunar.


**Eureka**: Netflix tarafından geliştirilmiş bir servis keşfi sunucusudur.


**Eureka Sunucu Konfigürasyonu**


**`application.yml`**


```yaml

spring:

  application:

    name: eureka-server


server:

  port: 8761


eureka:

  client:

    registerWithEureka: false

    fetchRegistry: false

```


**Eureka Sunucusu Başlatma**


**`EurekaServerApplication.java`**


```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);

    }

}

```


#### Servis Kaydı ve İletişim


Mikroservislerin Eureka sunucusuna kaydolması ve diğer servisleri bulması gerekir.


**Servis Konfigürasyonu**


**`application.yml`**


```yaml

spring:

  application:

    name: my-service


eureka:

  client:

    service-url:

      defaultZone: http://localhost:8761/eureka/

```


**Servis Çağrısı**


**RestTemplate** veya **Feign Client** kullanarak diğer servislerle iletişim kurabilirsiniz.


**`RestTemplate` Kullanımı**


```java

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

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;


@RestController

@RequestMapping("/api")

public class MyController {


    @Autowired

    private RestTemplate restTemplate;


    @GetMapping("/call")

    public String callOtherService() {

        String url = "http://other-service/api/data";

        return restTemplate.getForObject(url, String.class);

    }

}

```


**`Feign Client` Kullanımı**


**`FeignClient.java`**


```java

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.web.bind.annotation.GetMapping;


@FeignClient(name = "other-service")

public interface OtherServiceClient {

    

    @GetMapping("/api/data")

    String getData();

}

```


**`MyController.java`**


```java

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

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

@RequestMapping("/api")

public class MyController {


    @Autowired

    private OtherServiceClient otherServiceClient;


    @GetMapping("/call")

    public String callOtherService() {

        return otherServiceClient.getData();

    }

}

```


#### Bağlantı Yönetimi


Bağlantı yönetimi, mikroservislerin birbirleriyle etkili ve güvenli bir şekilde iletişim kurmasını sağlar. Spring Cloud, bu bağlamda çeşitli araçlar ve teknikler sunar:


- **Yük Dengeleme**: **Ribbon** gibi araçlar, isteklerin mikroservisler arasında dengeli bir şekilde dağıtılmasını sağlar.

- **Yüksek Erişilebilirlik**: **Hystrix** veya **Resilience4j** gibi araçlar, sistemin hata durumlarında dayanıklı olmasını sağlar.

- **Güvenlik**: **Spring Security** kullanarak mikroservislerin güvenliğini sağlar.


---


### Özet


Microservices mimarisi, büyük uygulamaları daha yönetilebilir ve esnek parçalara böler. Spring Cloud, mikroservislerin yönetimini ve iletişimini kolaylaştıran birçok araç ve bileşen sunar. Servis keşfi ve bağlantı yönetimi, mikroservislerin birbirlerini bulmasını ve güvenli bir şekilde iletişim kurmasını sağlar. Bu teknolojiler, modern yazılım geliştirme süreçlerinde önemli bir rol oynar.