package demo; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.DiscoveryClient; 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.ParameterizedTypeReference; import org.springframework.hateoas.Resources; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.Collection; import java.util.Collections; import java.util.stream.Collectors; @EnableZuulProxy @EnableCircuitBreaker @EnableDiscoveryClient @SpringBootApplication public class DemoApplication { @Bean CommandLineRunner runner(DiscoveryClient dc) { return args -> dc.getInstances("reservation-service") .forEach(si -> System.out.println(String.format( "%s %s:%s", si.getServiceId(), si.getHost(), si.getPort()))); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } @RestController @RequestMapping("/reservations") class ReservationApiGatewayRestController { @Autowired @LoadBalanced private RestTemplate rt; public Collection<String> getReservationNamesFallback() { return Collections.emptyList(); } @RequestMapping("/names") @HystrixCommand(fallbackMethod = "getReservationNamesFallback") public Collection<String> getReservationNames() { ParameterizedTypeReference<Resources<Reservation>> parameterizedTypeReference = new ParameterizedTypeReference<Resources<Reservation>>() { }; ResponseEntity<Resources<Reservation>> exchange = rt.exchange( "http://reservation-service/reservations", HttpMethod.GET, null, parameterizedTypeReference); return exchange .getBody() .getContent() .stream() .map(Reservation::getReservationName) .collect(Collectors.toList()); } } class Reservation { private Long id; private String reservationName; public Long getId() { return id; } public String getReservationName() { return reservationName; } }