Spring Cloud — Bus

Ahmet Cokgungordu
4 min readFeb 1, 2019

Spring Cloud Bus, distributed sistem Node’larını bağlamak mesaj kuyruğu sistemi kullanır. Birincil kullanım, yapılandırma değişikliklerini veya diğer yönetim bilgilerini yayınlamaktır. Bunu Actuator olarak düşünebiliriz.

Proje taşımada AMQP(Active Message Queueing Protocol) yani mesaj odaklı middleware uygulamalar için open standart uygulama katmanı kullanıyor. Ancak RabbitMQ yerine Apache Kafka veya Redis te kullanılabilir. Diğer taşımalar henüz desteklenmiyor.

Bu yazıda, RabbitMQ’yu kullanacağız.

Başlamadan önce, Spring Cloud Configuration yazıma göz atmış olmanızı öneririm. Mevcut bir cloud yapılandırma sunucusundan aldığımız parametreleri, Client’lar üzerinde uygulayacağız.

RabbitMQ

RabbitMQ ile başlangıcı yapalım. RabbitMQ’yu bu link üzerinden indirip kurabilirsiniz veya Docker Image olarak ta kullanabilirsiniz. Docker üzerinden ayarlamak basit olduğundan bu yönetimi anlatacağım. RabbitMQ’un local olarak çalıştırılmasını sağlamak için Docker’ı yüklememiz ve Docker’ın başarıyla yüklenmesinin ardından aşağıdaki komutları çalıştırmamız gerekiyor.

docker pull rabbitmq:3-management

Bu komut, RabbitMQ Docker Image’ı, varsayılan olarak yüklenen ve etkinleştirilen yönetim eklentisiyle birlikte çeker. Sonra RabbitMQ’yu çalıştırmak için aşağıdaki komutu çalıştırıyoruz.

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Yukarıdaki komutu çalıştırdıktan sonra, web tarayıcısına girip http://localhost:15672 üzerinden RabbitMQ’ya erişebiliriz. Yönetim konsolu giriş formuna default değerler olan kullanıcı adı ve şifre alanına “guest” yazıp giriş yapabilirsiniz. RabbitMQ 5672 portu üzerinden listen edecektir.

Cloud Config Client’a Actuator Ekleme

Her ikisi de çalışmakta olan Cloud Config Server ve Cloud Config Client olmalı. Yapılandırma değişikliklerini yenilemek için, istemcinin her seferinde yeniden başlatılması gerekir ve bu ideal olan değildir. Config Client’ı durduralım ve @RefreshScope ile Config Client controller sınıfını ekleyelim.

@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
// Kodlar...
}

Son olarak aşağıdaki Actuator kütüphanesini pom.xml’e ekleyelim.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>

Varsayılan olarak Actuator tarafından eklenen tüm endpointler secure’dür. Bu “/refresh” endpointini içeririr. Test için aşağıdaki parametreyi ekleyip bootstrap.properties dosyasını güncelleyerek güvenliği kapatacağız.

management.security.enabled=false

Artık başlayabiliriz. GitHub üzerinde bulunan properties dosyasınındaki bir değeri değiştiriyoruz. Örnek olarak bir kullanıcının rolünü “Programmer” dan “Developer” a güncelleyebiliriz. Config Server, güncellenmiş değerleri hemen gösterir. Ancak Client’ta bu değişikliği hemen göremezsiniz. Client’ın yeni dosyaları görmesini sağlamak için “/refresh” endpointine boş bir POST isteği göndermek gereklidir.

curl -X POST http://localhost:8080/refresh

“/refresh” endpointini çağırınca güncellenen özellikleri gösteren JSON dosyasının response unu göreceğiz.

[
"user.role"
]

Son olarak, kullanıcı rolünün güncellendiğini kod içerisinden test edebilirsiniz.

Client’ımızı yeniden başlatmadan yapılandırmasını güncellemiş olduk.

Spring Cloud Bus

Actuator kullanarak Client’larımızı güncelleyebiliriz. Ancak cloud ortamında her bir Client’a tek tek gitmemiz ve Actuator endpointine erişerek yapılandırmayı yeniden yüklememiz gerekir. Client’lar çoğaldıkça bu sorun olabilmektedir. Buna çözüm olarak Spring Cloud Bus kullanabiliriz.

Client

Cloud Config Client’ı, RabbitMQ’ya kayıt olabilmesi için aşağıdaki kütüphaneyi ekleyip güncellememiz gerekiyor.

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>

Config Client değişikliklerini tamamlamak için, bir application.yml dosyasına RabbitMQ bağlantı ayarlarını eklememiz gerekiyor.

---
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest

Bu kullanıcı adı ve şifre varsayılan kullanıcı adı ve şifredir. Bunun gerçek hayattaki production uygulamaları için güncellenmesi gerektiğini unutmayın.

Spring Cloud Bus eklendikten sonra, Clientlarımızın “/bus/refresh” adında farklı bir endpointi olacaktır.

Bu endpointi çağırdımızda;

  • Config Serverdan en son ayarlar alınacak ve @RefreshScope anotasyonu kullanılan konfigurasyonlar güncellenecektir.
  • RabbitMQ’ya değişim hakkında bilgi veren bir mesaj gönderecektir.
  • RabbitMQ’ya bağlantıda olan diğer tüm Node’lar da kendi konfigurasyonlarını günceller.

Bu yöntem sayesinde tek tek Node’lara gidip yapılandırma güncellemesini çağırmanıza gerek yoktur.

Server

Yapılandırma değişikliklerini tamamen otomatikleştirmek için Config Server’a iki bağımlılık ekleyelim.

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>

Yapılandırma değişikliklerini izlemek ve RabbitMQ kullanarak eventleri izlemek için spring-cloud-config-monitor’ü kullanacağız. Sadece application.properties dosyasını güncellememiz ve RabbitMQ bağlantı ayarlarını vermemiz yeterlidir.

GitHub Webhook

Config Server yapılandırma değişikliklerinden haberdar edildiğinde, bunu Config Server’a bildirecektir. Yapılandırma değişikliği eventi iletildiğinde Client mesajları dinler ve yapılandırmasını günceller. Şimdi bunun nasıl olacağını inceleyelim. Öncelikle GitHub Webhook’u yapılandırmamız gerekiyor. GitHub’a gidelim ve “Settings”e girelim ve “Webhook”u seçelim. “Webhook Ekle” butonuna basıyoruz.

Payload URL, Config Server’ımızın “/monitor” endpointinin URL’idir. Bu URL aşağıdaki gibi olacaktır.

http://<username>:<password>@<config_server_ip>:<config_server_port>/monitor

“Content Type” alanını “application/json” olarak değiştirmemiz gerekiyor. “Secret” alanını boş bırakıyoruz ve “Webhook Ekle” butonuna basıyoruz.

Önceden “/refresh” endpointi ile değişiklikleri görebiliyorduk. Şimdi GitHub üzerinden parametreyi güncelleyip hiç bir endpoint çalıştırmadan uygulama içerisinde konfigurasyonların değiştiğini görebiliriz.

Config Client’ı yeniden başlatmadan ve uygulama açıkken konfigurasyonlarını güncellemiş olduk.

--

--