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