From b501fdb20a764e7b4c64ec32befeaada797ebc89 Mon Sep 17 00:00:00 2001 From: Antoine Rey Date: Tue, 19 Nov 2019 18:19:41 +0100 Subject: [PATCH 1/4] Replace Hystrix by Spring Cloud Circuit Breaker and Resilience4j #117 --- README.md | 6 +- spring-petclinic-api-gateway/pom.xml | 8 ++ .../petclinic/api/ApiGatewayApplication.java | 18 ++++ .../api/application/VisitsServiceClient.java | 8 -- .../boundary/web/ApiGatewayController.java | 12 +++ .../petclinic/api/dto/VisitDetails.java | 4 +- .../samples/petclinic/api/dto/Visits.java | 4 +- .../VisitsServiceClientIntegrationTest.java | 14 --- .../web/ApiGatewayControllerTest.java | 101 ++++++++++++++++++ 9 files changed, 147 insertions(+), 28 deletions(-) create mode 100644 spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java diff --git a/README.md b/README.md index e2774f065..8596ba9c7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ [![Build Status](https://travis-ci.org/spring-petclinic/spring-petclinic-microservices.svg?branch=master)](https://travis-ci.org/spring-petclinic/spring-petclinic-microservices/) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) -This microservices branch was initially derived from [AngularJS version](https://github.com/spring-petclinic/spring-petclinic-angular1) to demonstrate how to split sample Spring application into [microservices](http://www.martinfowler.com/articles/microservices.html). To achieve that goal we used [Spring Cloud Netflix](https://github.com/spring-cloud/spring-cloud-netflix) technology stack. +This microservices branch was initially derived from [AngularJS version](https://github.com/spring-petclinic/spring-petclinic-angular1) to demonstrate how to split sample Spring application into [microservices](http://www.martinfowler.com/articles/microservices.html). +To achieve that goal we use Spring Cloud Gateway, Spring Cloud Circuit Breaker, Spring Cloud Config, Spring Cloud Sleuth, Resilience4j, Micrometer +and the Eureka Service Discovery from the [Spring Cloud Netflix](https://github.com/spring-cloud/spring-cloud-netflix) technology stack. ## Starting services locally without Docker @@ -131,7 +133,7 @@ All those three REST controllers `OwnerResource`, `PetResource` and `VisitResour | Service Discovery | [Eureka server](spring-petclinic-discovery-server) and [Service discovery client](spring-petclinic-vets-service/src/main/java/org/springframework/samples/petclinic/vets/VetsServiceApplication.java) | | API Gateway | [Spring Cloud Gateway starter](spring-petclinic-api-gateway/pom.xml) and [Routing configuration](/spring-petclinic-api-gateway/src/main/resources/application.yml) | | Docker Compose | [Spring Boot with Docker guide](https://spring.io/guides/gs/spring-boot-docker/) and [docker-compose file](docker-compose.yml) | -| Circuit Breaker | [Hystrix fallback method](spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/application/VisitsServiceClient.java) | +| Circuit Breaker | [Resilience4j fallback method](spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayController.java) | | Grafana / Prometheus Monitoring | [Micrometer implementation](https://micrometer.io/), [Spring Boot Actuator Production Ready Metrics] | Front-end module | Files | diff --git a/spring-petclinic-api-gateway/pom.xml b/spring-petclinic-api-gateway/pom.xml index 7b66f6c21..5d5f1f56f 100644 --- a/spring-petclinic-api-gateway/pom.xml +++ b/spring-petclinic-api-gateway/pom.xml @@ -53,6 +53,10 @@ org.springframework.cloud spring-cloud-sleuth-zipkin + + org.springframework.cloud + spring-cloud-starter-circuitbreaker-reactor-resilience4j + org.springframework.cloud spring-cloud-starter-config @@ -107,6 +111,10 @@ io.micrometer micrometer-registry-prometheus + + io.github.resilience4j + resilience4j-micrometer + diff --git a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java index 1add5f1d8..7f8972be3 100644 --- a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java +++ b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java @@ -15,9 +15,14 @@ */ package org.springframework.samples.petclinic.api; +import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; +import io.github.resilience4j.timelimiter.TimeLimiterConfig; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory; +import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder; +import org.springframework.cloud.client.circuitbreaker.Customizer; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; @@ -32,6 +37,8 @@ import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; +import java.time.Duration; + /** * @author Maciej Szarlinski @@ -71,4 +78,15 @@ RouterFunction routerFunction() { request -> ServerResponse.ok().contentType(MediaType.TEXT_HTML).bodyValue(indexHtml)); return router; } + + /** + * Default Resilience4j circuit breaker configuration + */ + @Bean + public Customizer defaultCustomizer() { + return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) + .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()) + .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()) + .build()); + } } diff --git a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/application/VisitsServiceClient.java b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/application/VisitsServiceClient.java index 8f9c392a9..ffb3d848a 100644 --- a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/application/VisitsServiceClient.java +++ b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/application/VisitsServiceClient.java @@ -16,15 +16,12 @@ package org.springframework.samples.petclinic.api.application; import lombok.RequiredArgsConstructor; -import org.springframework.samples.petclinic.api.dto.VisitDetails; import org.springframework.samples.petclinic.api.dto.Visits; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; -import java.util.Collections; import java.util.List; -import java.util.Map; import static java.util.stream.Collectors.joining; @@ -40,7 +37,6 @@ public class VisitsServiceClient { private final WebClient.Builder webClientBuilder; - // FIXME HYSTRIX @HystrixCommand(fallbackMethod = "emptyVisitsForPets") public Mono getVisitsForPets(final List petIds) { return webClientBuilder.build() .get() @@ -53,10 +49,6 @@ private String joinIds(List petIds) { return petIds.stream().map(Object::toString).collect(joining(",")); } - private Mono>> emptyVisitsForPets(Mono> petIds) { - return Mono.just(Collections.emptyMap()); - } - void setHostname(String hostname) { this.hostname = hostname; } diff --git a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayController.java b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayController.java index 6bc09a73b..3d7163e9c 100644 --- a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayController.java +++ b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayController.java @@ -16,6 +16,8 @@ package org.springframework.samples.petclinic.api.boundary.web; import lombok.RequiredArgsConstructor; +import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreaker; +import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory; import org.springframework.samples.petclinic.api.application.CustomersServiceClient; import org.springframework.samples.petclinic.api.application.VisitsServiceClient; import org.springframework.samples.petclinic.api.dto.OwnerDetails; @@ -41,11 +43,17 @@ public class ApiGatewayController { private final VisitsServiceClient visitsServiceClient; + private final ReactiveCircuitBreakerFactory cbFactory; + @GetMapping(value = "owners/{ownerId}") public Mono getOwnerDetails(final @PathVariable int ownerId) { return customersServiceClient.getOwner(ownerId) .flatMap(owner -> visitsServiceClient.getVisitsForPets(owner.getPetIds()) + .transform(it -> { + ReactiveCircuitBreaker cb = cbFactory.create("getOwnerDetails"); + return cb.run(it, throwable -> emptyVisitsForPets()); + }) .map(addVisitsToOwner(owner)) ); @@ -62,4 +70,8 @@ private Function addVisitsToOwner(OwnerDetails owner) { return owner; }; } + + private Mono emptyVisitsForPets() { + return Mono.just(new Visits()); + } } diff --git a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/VisitDetails.java b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/VisitDetails.java index 7c8a7827b..de3a40543 100644 --- a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/VisitDetails.java +++ b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/VisitDetails.java @@ -15,13 +15,13 @@ */ package org.springframework.samples.petclinic.api.dto; +import lombok.Data; import lombok.NoArgsConstructor; -import lombok.Value; /** * @author Maciej Szarlinski */ -@Value +@Data @NoArgsConstructor public class VisitDetails { diff --git a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/Visits.java b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/Visits.java index 25957cf42..90bd82bee 100644 --- a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/Visits.java +++ b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/dto/Visits.java @@ -15,6 +15,7 @@ */ package org.springframework.samples.petclinic.api.dto; +import java.util.ArrayList; import java.util.List; import lombok.NoArgsConstructor; @@ -24,9 +25,8 @@ * @author Maciej Szarlinski */ @Value -@NoArgsConstructor public class Visits { - private List items = null; + private List items = new ArrayList<>(); } diff --git a/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/application/VisitsServiceClientIntegrationTest.java b/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/application/VisitsServiceClientIntegrationTest.java index 63387243d..62e74c490 100644 --- a/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/application/VisitsServiceClientIntegrationTest.java +++ b/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/application/VisitsServiceClientIntegrationTest.java @@ -47,20 +47,6 @@ void getVisitsForPets_withAvailableVisitsService() { assertVisitDescriptionEquals(visits.block(), PET_ID,"test visit"); } - /** - * Test Hystrix fallback method - */ -// @Test -// public void getVisitsForPets_withServerError() { -// -// mockServer.expect(requestTo("http://visits-service/pets/visits?petId=1")) -// .andRespond(withServerError()); -// -// Map> visits = null; -// visitsServiceClient.getVisitsForPets(Mono.just(Collections.singletonList(1))); -// -// assertEquals(0, visits.size()); -// } private void assertVisitDescriptionEquals(Visits visits, int petId, String description) { assertEquals(1, visits.getItems().size()); diff --git a/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java b/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java new file mode 100644 index 000000000..c46fe3454 --- /dev/null +++ b/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java @@ -0,0 +1,101 @@ +package org.springframework.samples.petclinic.api.boundary.web; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JAutoConfiguration; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; +import org.springframework.context.annotation.Import; +import org.springframework.samples.petclinic.api.application.CustomersServiceClient; +import org.springframework.samples.petclinic.api.application.VisitsServiceClient; +import org.springframework.samples.petclinic.api.dto.OwnerDetails; +import org.springframework.samples.petclinic.api.dto.PetDetails; +import org.springframework.samples.petclinic.api.dto.VisitDetails; +import org.springframework.samples.petclinic.api.dto.Visits; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.reactive.server.WebTestClient; +import reactor.core.publisher.Mono; + +import java.net.ConnectException; +import java.util.Collections; + +@ExtendWith(SpringExtension.class) +@EnableCircuitBreaker +@WebFluxTest(controllers = ApiGatewayController.class) +@Import(ReactiveResilience4JAutoConfiguration.class) +class ApiGatewayControllerTest { + + @MockBean + private CustomersServiceClient customersServiceClient; + + @MockBean + private VisitsServiceClient visitsServiceClient; + + @Autowired + private WebTestClient client; + + + @Test + void getOwnerDetails_withAvailableVisitsService() { + OwnerDetails owner = new OwnerDetails(); + PetDetails cat = new PetDetails(); + cat.setId(20); + cat.setName("Garfield"); + owner.getPets().add(cat); + Mockito + .when(customersServiceClient.getOwner(1)) + .thenReturn(Mono.just(owner)); + + Visits visits = new Visits(); + VisitDetails visit = new VisitDetails(); + visit.setId(300); + visit.setDescription("First visit"); + visit.setPetId(cat.getId()); + visits.getItems().add(visit); + Mockito + .when(visitsServiceClient.getVisitsForPets(Collections.singletonList(cat.getId()))) + .thenReturn(Mono.just(visits)); + + client.get() + .uri("/api/gateway/owners/1") + .exchange() + .expectStatus().isOk() + //.expectBody(String.class) + //.consumeWith(response -> + // Assertions.assertThat(response.getResponseBody()).isEqualTo("Garfield")); + .expectBody() + .jsonPath("$.pets[0].name").isEqualTo("Garfield") + .jsonPath("$.pets[0].visits[0].description").isEqualTo("First visit"); + } + + /** + * Test Resilience4j fallback method + */ + @Test + void getOwnerDetails_withServiceError() { + OwnerDetails owner = new OwnerDetails(); + PetDetails cat = new PetDetails(); + cat.setId(20); + cat.setName("Garfield"); + owner.getPets().add(cat); + Mockito + .when(customersServiceClient.getOwner(1)) + .thenReturn(Mono.just(owner)); + + Mockito + .when(visitsServiceClient.getVisitsForPets(Collections.singletonList(cat.getId()))) + .thenReturn(Mono.error(new ConnectException("Simulate error"))); + + client.get() + .uri("/api/gateway/owners/1") + .exchange() + .expectStatus().isOk() + .expectBody() + .jsonPath("$.pets[0].name").isEqualTo("Garfield") + .jsonPath("$.pets[0].visits").isEmpty(); + } + +} From 1ba7c64aa5b15e1779c27838db6bba16c7aa457e Mon Sep 17 00:00:00 2001 From: Antoine Rey Date: Wed, 20 Nov 2019 08:35:40 +0100 Subject: [PATCH 2/4] Remove Hystrix Dashboard #117 --- README.md | 4 -- docker-compose.yml | 11 ---- pom.xml | 1 - spring-petclinic-hystrix-dashboard/pom.xml | 62 ------------------- .../HystrixDashboardApplication.java | 25 -------- .../src/main/resources/bootstrap.yml | 12 ---- .../src/main/resources/logback-spring.xml | 6 -- .../HystrixDashboardApplicationTests.java | 13 ---- 8 files changed, 134 deletions(-) delete mode 100644 spring-petclinic-hystrix-dashboard/pom.xml delete mode 100644 spring-petclinic-hystrix-dashboard/src/main/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplication.java delete mode 100644 spring-petclinic-hystrix-dashboard/src/main/resources/bootstrap.yml delete mode 100644 spring-petclinic-hystrix-dashboard/src/main/resources/logback-spring.xml delete mode 100644 spring-petclinic-hystrix-dashboard/src/test/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplicationTests.java diff --git a/README.md b/README.md index 8596ba9c7..7ae6f7c03 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,6 @@ If everything goes well, you can access the following services at given location * Admin Server (Spring Boot Admin) - http://localhost:9090 * Grafana Dashboards - http://localhost:3000 * Prometheus - http://localhost:9091 -* Hystrix Dashboard for Circuit Breaker pattern - http://localhost:7979 - On the home page is a form where you can enter -the URL for an event stream to monitor, for example the `api-gateway` service running locally: `http://localhost:8080/actuator/hystrix.stream` -or running into docker: `http://api-gateway:8080/actuator/hystrix.stream` - You can tell Config Server to use your local Git repository by using `native` Spring profile and setting `GIT_REPO` environment variable, for example: diff --git a/docker-compose.yml b/docker-compose.yml index da6b7b337..93c0a42d3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -82,17 +82,6 @@ services: ports: - 9090:9090 - hystrix-dashboard: - image: springcommunity/spring-petclinic-hystrix-dashboard - container_name: hystrix-dashboard - mem_limit: 512M - depends_on: - - config-server - - discovery-server - entrypoint: ["./dockerize","-wait=tcp://discovery-server:8761","-timeout=60s","--","java", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCGroupMemoryLimitForHeap", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] - ports: - - 7979:7979 - ## Grafana / Prometheus grafana-server: diff --git a/pom.xml b/pom.xml index cd85814de..33d6a39e3 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,6 @@ spring-petclinic-config-server spring-petclinic-discovery-server spring-petclinic-api-gateway - spring-petclinic-hystrix-dashboard diff --git a/spring-petclinic-hystrix-dashboard/pom.xml b/spring-petclinic-hystrix-dashboard/pom.xml deleted file mode 100644 index c6a4eb486..000000000 --- a/spring-petclinic-hystrix-dashboard/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - spring-petclinic-microservices - org.springframework.samples - 2.2.1 - - 4.0.0 - - spring-petclinic-hystrix-dashboard - Circuit breaker dashboard with with Spring Cloud Netflix Hystrix - - - 7979 - ${basedir}/../docker - - - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix-dashboard - - - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - - buildDocker - - - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - - - - - diff --git a/spring-petclinic-hystrix-dashboard/src/main/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplication.java b/spring-petclinic-hystrix-dashboard/src/main/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplication.java deleted file mode 100644 index 0ecd670fa..000000000 --- a/spring-petclinic-hystrix-dashboard/src/main/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.springframework.samples.petclinic.dashboard; - - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -@SpringBootApplication -@EnableDiscoveryClient -@EnableHystrixDashboard -@Controller -public class HystrixDashboardApplication { - - public static void main(String[] args) { - SpringApplication.run(HystrixDashboardApplication.class, args); - } - - @RequestMapping("/") - public String home() { - return "forward:/hystrix"; - } -} diff --git a/spring-petclinic-hystrix-dashboard/src/main/resources/bootstrap.yml b/spring-petclinic-hystrix-dashboard/src/main/resources/bootstrap.yml deleted file mode 100644 index 5e52f8d46..000000000 --- a/spring-petclinic-hystrix-dashboard/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,12 +0,0 @@ -spring: - cloud: - config: - uri: http://localhost:8888 - application: - name: hystrix-dashboard ---- -spring: - profiles: docker - cloud: - config: - uri: http://config-server:8888 diff --git a/spring-petclinic-hystrix-dashboard/src/main/resources/logback-spring.xml b/spring-petclinic-hystrix-dashboard/src/main/resources/logback-spring.xml deleted file mode 100644 index 5d03f7941..000000000 --- a/spring-petclinic-hystrix-dashboard/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/spring-petclinic-hystrix-dashboard/src/test/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplicationTests.java b/spring-petclinic-hystrix-dashboard/src/test/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplicationTests.java deleted file mode 100644 index 2049712ef..000000000 --- a/spring-petclinic-hystrix-dashboard/src/test/java/org/springframework/samples/petclinic/dashboard/HystrixDashboardApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springframework.samples.petclinic.dashboard; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class HystrixDashboardApplicationTests { - - @Test - void contextLoads() { - } - -} From ee8fc02e07ad7ef2aafda66b2fe0486e5e614601 Mon Sep 17 00:00:00 2001 From: Antoine Rey Date: Wed, 20 Nov 2019 20:23:19 +0100 Subject: [PATCH 3/4] Remove the @EnableCircuitBreaker annotation and Hystrix dependencies #117 --- spring-petclinic-api-gateway/pom.xml | 14 ++++---------- .../petclinic/api/ApiGatewayApplication.java | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/spring-petclinic-api-gateway/pom.xml b/spring-petclinic-api-gateway/pom.xml index 5d5f1f56f..98fc2fbb6 100644 --- a/spring-petclinic-api-gateway/pom.xml +++ b/spring-petclinic-api-gateway/pom.xml @@ -77,6 +77,10 @@ com.netflix.ribbon ribbon-eureka + + org.springframework.cloud + spring-cloud-netflix-hystrix + @@ -87,16 +91,6 @@ org.springframework.cloud spring-cloud-starter-gateway - - org.springframework.cloud - spring-cloud-starter-netflix-hystrix - - - org.springframework.cloud - spring-cloud-netflix-ribbon - - - diff --git a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java index 7f8972be3..fd13cc08d 100644 --- a/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java +++ b/spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java @@ -23,7 +23,6 @@ import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory; import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder; import org.springframework.cloud.client.circuitbreaker.Customizer; -import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; @@ -44,7 +43,6 @@ * @author Maciej Szarlinski */ @EnableDiscoveryClient -@EnableCircuitBreaker @SpringBootApplication public class ApiGatewayApplication { From 7b78138b69b99464f361ded43e85a8296e33bcfa Mon Sep 17 00:00:00 2001 From: Antoine Rey Date: Thu, 21 Nov 2019 11:29:34 +0100 Subject: [PATCH 4/4] Remove the @EnableCircuitBreaker annotation from test #117 --- .../petclinic/api/boundary/web/ApiGatewayControllerTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java b/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java index c46fe3454..9f5707e68 100644 --- a/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java +++ b/spring-petclinic-api-gateway/src/test/java/org/springframework/samples/petclinic/api/boundary/web/ApiGatewayControllerTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JAutoConfiguration; -import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.context.annotation.Import; import org.springframework.samples.petclinic.api.application.CustomersServiceClient; import org.springframework.samples.petclinic.api.application.VisitsServiceClient; @@ -23,7 +22,6 @@ import java.util.Collections; @ExtendWith(SpringExtension.class) -@EnableCircuitBreaker @WebFluxTest(controllers = ApiGatewayController.class) @Import(ReactiveResilience4JAutoConfiguration.class) class ApiGatewayControllerTest {