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: http://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