Arşivler

Spring Cloud Bus ile Runtime Konfigürasyon Yönetimi

Spring Cloud Bus ile Runtime Konfigürasyon Yönetimi
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

Spring Cloud Bus ile Runtime Konfigürasyon Yönetimi

Yapacağımız uygulamanın 4 aşaması olacak.

Uygulamamız dört ana bileşenden oluşuyor:

  1. Git Reposu – Konfigürasyon dosyalarının saklandığı yer
  2. RabbitMQ – Konfigürasyon güncellemeleri için mesaj aracısı
  3. Config Server – Merkezi konfigürasyon yönetimi
  4. 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:managementCode 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

Projenin Kaynak Kodlarına Ulaş

Sonraki Spring Cloud Dersleri’nde görüşmek üzere.


Önceki Ders: Spring Cloud @Retryable AnotasyonuSpring Cloud Dersleri Sonraki Ders: