diff --git a/README.md b/README.md index 5f5fa6532..791779dba 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ In order to start entire infrastructure using Docker, you have to build images b from a project root. Once images are ready, you can start them with a single command `docker-compose up`. Containers startup order is coordinated with [`dockerize` script](https://github.com/jwilder/dockerize). After starting services it takes a while for API Gateway to be in sync with service registry, -so don't be scared of initial Zuul timeouts. You can track services availability using Eureka dashboard +so don't be scared of initial Spring Cloud Gateway timeouts. You can track services availability using Eureka dashboard available by default at http://localhost:8761. *NOTE: Under MacOSX or Windows, make sure that the Docker VM has enough memory to run the microservices. The default settings @@ -126,7 +126,7 @@ All those three REST controllers `OwnerResource`, `PetResource` and `VisitResour |---------------------------------|------------| | Configuration server | [Config server properties](spring-petclinic-config-server/src/main/resources/application.yml) and [Configuration repository] | | 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 | [Zuul reverse proxy](spring-petclinic-api-gateway/src/main/java/org/springframework/samples/petclinic/api/ApiGatewayApplication.java) and [Routing configuration](https://github.com/spring-petclinic/spring-petclinic-microservices-config/blob/master/api-gateway.yml) | +| 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) | | Grafana / Prometheus Monitoring | [Micrometer implementation](https://micrometer.io/), [Spring Boot Actuator Production Ready Metrics] | diff --git a/spring-petclinic-api-gateway/pom.xml b/spring-petclinic-api-gateway/pom.xml index b179c8c4e..55d6168d2 100644 --- a/spring-petclinic-api-gateway/pom.xml +++ b/spring-petclinic-api-gateway/pom.xml @@ -42,10 +42,6 @@ org.springframework.boot spring-boot-starter-actuator - - org.springframework.boot - spring-boot-starter-web - org.springframework.boot spring-boot-starter-test @@ -71,7 +67,7 @@ org.springframework.cloud - spring-cloud-starter-netflix-zuul + spring-cloud-starter-gateway org.springframework.cloud 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 b9e3e506d..b00c90ab1 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,19 +15,26 @@ */ package org.springframework.samples.petclinic.api; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.server.RequestPredicates; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; + /** * @author Maciej Szarlinski */ -@EnableZuulProxy @EnableDiscoveryClient @EnableCircuitBreaker @SpringBootApplication @@ -42,4 +49,19 @@ public static void main(String[] args) { RestTemplate loadBalancedRestTemplate() { return new RestTemplate(); } + + @Value("classpath:/static/index.html") + private Resource indexHtml; + + /** + * workaround solution for forwarding to index.html + * @see #9785 + */ + @Bean + RouterFunction routerFunction() { + RouterFunction router = RouterFunctions.resources("/**", new ClassPathResource("static/")) + .andRoute(RequestPredicates.GET("/"), + request -> ServerResponse.ok().contentType(MediaType.TEXT_HTML).syncBody(indexHtml)); + return router; + } } 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 9d9828c8c..84232606a 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 @@ -25,6 +25,7 @@ import org.springframework.samples.petclinic.api.dto.VisitDetails; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -35,6 +36,7 @@ */ @RestController @RequiredArgsConstructor +@RequestMapping("/api/gateway") public class ApiGatewayController { private final CustomersServiceClient customersServiceClient; diff --git a/spring-petclinic-api-gateway/src/main/resources/application.yml b/spring-petclinic-api-gateway/src/main/resources/application.yml index e7de112c9..44fb87003 100644 --- a/spring-petclinic-api-gateway/src/main/resources/application.yml +++ b/spring-petclinic-api-gateway/src/main/resources/application.yml @@ -1,8 +1,22 @@ -zuul: - prefix: /api - ignoredServices: '*' - routes: - vets-service: /vet/** - visits-service: /visit/** - customers-service: /customer/** - api-gateway: /gateway/** +spring: + cloud: + gateway: + routes: + - id: vets-service + uri: lb://vets-service + predicates: + - Path=/api/vet/** + filters: + - StripPrefix=2 + - id: visits-service + uri: lb://visits-service + predicates: + - Path=/api/visit/** + filters: + - StripPrefix=2 + - id: customers-service + uri: lb://customers-service + predicates: + - Path=/api/customer/** + filters: + - StripPrefix=2