W poprzednim wpisie pokazywałem jak wykorzystać Hystrix’a jako jeden ze sposób realizacji wzorca Circuit Breaker. Pojawił się także wpis dotyczący dashboard’u, na którym wyświetlane były informacje dla danego Circuit Breaker’a. Niestety wadą tego rozwiązania było to, iż mieliśmy jeden dashboard per aplikacja, więc jeśli chcielibyśmy sprawdzać stan kilku Circuit Breaker’ów musielibyśmy przełączać się pomiędzy dashboardami. Rozwiązaniem tego problemu jest stworzenie jednego strumienia przy wykorzystaniu biblioteki Turbine.
Discovery serwis
Turbine, aby móc połączyć się z innymi usługami, używa mechanizmu Service Discovery. Zaczynamy od uruchomienia usługi:
@SpringBootApplication @EnableEurekaServer public class DiscoveryServiceApplication { public static void main(String[] args) { SpringApplication.run(DiscoveryServiceApplication.class, args); } }
Następnie konfigurujemy application.properties
:
server.port=8761 spring.application.name=discovery-service eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
Wszystkie serwisy zarejestrowane w naszej usłudze widoczne są pod http://localhost:8761/
. Więcej informacji o Service Discovery można przeczytać w tym artykule.
Pierwszy serwis
Pierwszy serwis będzie nazywał się first-service
:
@SpringBootApplication @EnableCircuitBreaker @EnableHystrixDashboard @EnableEurekaClient public class FirstServiceApplication { public static void main(String[] args) { SpringApplication.run(FirstServiceApplication.class, args); } }
Po uruchomieniu Hystrixa, musimy dodać klasę, która będzie przez niego obsługiwana:
@RestController @RequestMapping("/") public class HystrixController { @HystrixCommand(fallbackMethod = "fallback") @GetMapping String hystrixMethod(){ if (RandomUtils.nextInt(10) > 5) { return "Bingo!"; } throw new RuntimeException(); } String fallback(){ return "Fallback"; } }
Musimy także dodać kilka wpisów do application.properties
:
server.port=8080 spring.application.name=first-service eureka.client.service-url.defaultZone=http://localhost:8761/eureka
Aby sprawdzić czy Hystrix działa, odświeżamy nasz endpoint http://localhost:8080/
kilka razy i oglądamy wynik na dashboardzie http://localhost:8080/hystrix
, gdzie jako adres podajemy http://localhost:8080/hystrix.stream
. W wyniku powinniśmy zobaczyć:
Drugi serwis
Dla drugiego serwisu musimy wykonać te same kroki co dla pierwszego. Jedyna różnica to application.properties
:
server.port=8081 spring.application.name=second-service eureka.client.service-url.defaultZone=http://localhost:8761/eureka
Turbine
Na początek dodajemy zależność do Maven’a:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-turbine</artifactId> </dependency>
Aby uruchomić Turbine musimy użyć adnotacji @EnableTurbine
, następnie musimy dodać dashboard @EnableHystrixDashboard
.
@SpringBootApplication @EnableTurbine @EnableEurekaClient @EnableHystrixDashboard public class TurbineServiceApplication { public static void main(String[] args) { SpringApplication.run(TurbineServiceApplication.class, args); } }
W pliku application.properties
musimy wskazać aplikacje, z których chcemy agregować nasze strumienie:
server.port=8989 spring.application.name=turbine-dashboard eureka.client.service-url.defaultZone=http://localhost:8761/eureka turbine.app-config=first-service,second-service turbine.cluster-name-expression=new String("default")
Następnie udajemy się pod adres naszego dashboardu http://localhost:8989/hystrix/
jako strumień podajemy http://localhost:8989/turbine.stream
GitHub
Całość jak zawsze na GitHubie.