Spring Cloud Bus na przykładzie RabbitMQ


Spring Cloud Bus na przykładzie RabbitMQ

Konfiguracja mikroserwisów nie należy do łatwych zadań. Zarządzanie konfiguracją z użyciem Spring Cloud Config Server wymaga aby dla każdego mikroserwisu zostało wysłane żądanie POST np. pod adres http://localhost:8082/refresh. Dla wielu usług jest to dość problematyczne i żmudne rozwiązanie. Rozwiązaniem jest Spring Cloud Bus. Podejście to pozwala na połączenie mikroserwisów za pomocą systemu kolejkowania np. z użyciem RabbitMQ. Dzięki temu wysłanie żądania odświerzenia konfiguracji jednego mikroserwisu powoduje odświerzenie konfiguracji dla wszystkich mikroserwisów połączonych szyną – (z ang. BUS). Instalacja RabbitMQ w systemie Ubuntu opisana jest tutaj: https://www.rabbitmq.com/install-debian.html. Jeśli ktoś chciałby skorzystać z instalacja RabbitMQ dla JavaLeader.pl proszę o kontakt – https://javaleader.pl/kontakt. Można również skorzystać z Dockera:

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

RabbitMQ używa się przede wszystkim do zmniejszania obciążeń serwerów i minimalizacji czasów dostarczania danych do aplikacji webowych.Aby zasymulować opisany przypadek Spring Cloud  Bus utworzymy dwa mikroserwisy – employee oraz department:

Mikroserwis 1 – niezbędne zależności – employee:

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-config</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-actuator</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-bus-amqp</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>Camden.SR6</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

RestController:

@RefreshScope
@RestController
public class WelcomeController
{
    @Value("${message}")
    private String serviceName;

    @GetMapping("/service")
    public String getServiceName() {
        return "service name [" + this.serviceName + "]";
    }
}

Plik application properties:

spring.application.name                   = employee
spring.cloud.config.uri                   = http://localhost:8888
management.endpoints.web.exposure.include = *
server.port                               = 8094

#RabbitMQ connection details
spring.rabbitmq.host                  = hostname
spring.rabbitmq.port                  = 5673
spring.rabbitmq.username              = login
spring.rabbitmq.password              = password

nazwę hosta, login i password należy dostosować do swoich potrzeb.

Mikroserwis – 2 – zależności dla drugiego mikroserwisu są dokładnie takie same jak dla pierwszego – department:

RestController:

@RefreshScope
@RestController
public class WelcomeController
{
    @Value("${message}")
    private String serviceName;

    @GetMapping("/service")
    public String getServiceName() {
        return "service name [" + this.serviceName + "]";
    }
}

Plik application.properties:

spring.application.name                   = department
spring.cloud.config.uri                   = http://localhost:8888
management.endpoints.web.exposure.include = *
server.port                               = 8094

#RabbitMQ connection details
spring.rabbitmq.host                  = hostname
spring.rabbitmq.port                  = 5673
spring.rabbitmq.username              = login
spring.rabbitmq.password              = password

Po poprawnej instalacji RabbitMQ pod adresem:

http://localhost:15672/

pojawi się interfejs webowy RabbitMQ:

Po uruchomieniu dwóch mikroserwisów – department i employee zauważyć można że zostały one zarejestrowane w kolejce:

Aby odświerzyć konfigurację dla wszystkich mikroserwisów używając szyny – Spring Cloud Bus wystarczy wysłać za pomocą dowolnego klienta REST np. Advanced REST Client żądanie POST pod adres:

http://localhost:8094/bus/refresh

Nie ma znaczenia dla którego mikroserwisu powyższe żądanie zostanie wysłane. Aby odświeżyć z kolei konfigurację dla konkretnego mikroserwisu bez użycia szyny należy wysłać żądanie POST pod adres:

http://localhost:8094/refresh

dla mikroserwisu dla którego konfiguracja ma być odświeżona.


Leave a comment

Your email address will not be published.


*