Spring Cloud Bus ile Runtime Konfigürasyon Yönetimi
Spring Cloud Dersleri‘ne devam ediyorum.
Bu yazıda, Spring Cloud Bus kullanarak uygulamalarda runtime konfigürasyon yönetiminin nasıl yapılacağını ele alacağız. RabbitMQ kullanarak değişikliklerin nasıl yayınlanacağını ve ilgili servislerin bu değişiklikleri nasıl alacağım.
Daha önceki yazımda Config Server ve Client Service arasında propertylerinin nasıl çalıştığından bahsetmiştim. Bu yazıda runtime da bu değerler nasıl değiştirilebileceğinden bahsedeceğim.
Spring Cloud Bus Nedir?
Spring Cloud Bus, mikroservis mimarisinde iletişim kütühanedir. Dağıtık sistemlerdeki servisler arasında gerçek zamanlı olarak ilgili değerlerin alınmasını sağlar.
Spring Cloud Bus Uygulama Örneği
Yapacağımız uygulamanın 4 aşaması olacak.
Uygulamamız dört ana bileşenden oluşuyor:
- Git Reposu – Konfigürasyon dosyalarının saklandığı yer
- RabbitMQ – Konfigürasyon güncellemeleri için mesaj aracısı
- Config Server – Merkezi konfigürasyon yönetimi
- Student Service – Konfigürasyonları kullanan örnek mikroservis
Senaryo
Github reposundaki konfigürasyon değerleri değiştireceğiz. Config Server projemize bir istek atarak rabbitmq ile birlikte ilgili servis bu bilgiyi runtime üzerinden alacaktır.
example:
message: "Yeni Mesaj!"
Code language: JavaScript (javascript)
Github repositorysine buradan ulaş.
Servis Config Repo
Student Servisimizin ayarlarını runtime’da değiştirmek istediğimiz için ilgili servisimizin student-service.yaml
dosyasını github üzerinde tutacağız. Bu dosyanın içerisinde aşağıdaki bilgi tutulmakta.
RabbitMQ Kurulumu
Docker ayağa kaldırmak yeterli. Aşağıdaki kodu alarak RabbitMQ başlatalım.
docker run -d --hostname my-rabbitmq --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
Code language: CSS (css)
Config Server Uygulaması
Bu projemiz ilgili servis dosyalarını yapılandırma servisidir. Bağımlıklarımız aşağıdaki gibi olacak
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
Code language: HTML, XML (xml)
ConfigServerApplication
‘ a da EnableConfigServer
anotasyonunu ekleyerek bu projenin yapılandırma servisi olduğunu söylemiş oluyoruz.
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
Code language: Java (java)
application.yaml
dosyamızı oluşturacağız. Bu dosyada projenin hangi repodaki configleri okuması gerektiğini belirtiyoruz. Ayrıca bu okunan değerleri ilgil servise iletmek için RabbitMQ
ye bağlanmak için gerekli propertyleri ekliyoruz.
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/BrkSe/spring-cloud-configuration
default-label: main
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
Code language: YAML (yaml)
Config Server’da yapmamız gerekenler bu kadar.
Student Server Uygulaması
Bağımlılıklarımız şu şekilde olacak.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
Code language: HTML, XML (xml)
application.yaml
dosyamız aşağıdaki gibi olacak
server:
port: 8080
spring:
application:
name: student-service
config:
import: "optional:configserver:http://localhost:8888"
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
management:
endpoints:
web:
exposure:
include: "*"
Code language: YAML (yaml)
Config serverden gelecek değerleri almasını sağladık. Controller oluşturalım ve gelen değerin yansıyıp yansımadığı görmek için api yaptık.
@RestController
@RefreshScope
public class ConfigController {
@Value("${example.message:Varsayılan Mesaj}")
private String message;
@GetMapping("/config")
public String getMessage() {
return message;
}
}
Code language: Java (java)
RefreshScope
@RefreshScope anotasyonu, Spring Cloud’da kullanılan ve çalışma zamanında bean’in yapılandırma özelliklerini yeniden yüklemeye yarayan bir anotasyondur.
Test
Uygulamalarımızı çalıştıralım ve student-service
deki http://localhost:8080/config
urline gidelim sonuç olarak Varsayılan Mesaj
yazmaktadır. Github reposundaki configin okunabilmesi için ise config-server
deki curl -X POST http://localhost:8080/actuator/busrefresh
e istek atalım ve tekrar http://localhost:8080/config
istek attığımızda sonuç Yeni Mesaj
olarak geldiğini görebildik.
Projeyi İndir
Sonraki Spring Cloud Dersleri’nde görüşmek üzere.
No Comment! Be the first one.