package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.Output; import org.springframework.hateoas.Resources; import org.springframework.integration.annotation.Gateway; import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.annotation.MessagingGateway; import org.springframework.messaging.MessageChannel; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.web.bind.annotation.*; import java.util.Collection; import java.util.stream.Collectors; @EnableResourceServer @EnableDiscoveryClient @SpringBootApplication @EnableFeignClients @EnableBinding(ReservationChannels.class) @IntegrationComponentScan public class ReservationClientApplication { public static void main(String[] args) { SpringApplication.run(ReservationClientApplication.class, args); } } interface ReservationChannels { @Output MessageChannel output(); } class Reservation { private String reservationName; public String getReservationName() { return reservationName; } public void setReservationName(String reservationName) { this.reservationName = reservationName; } } @FeignClient("reservation-service") interface ReservationReader { @RequestMapping(method = RequestMethod.GET, value = "/reservations") Resources<Reservation> read(); } @MessagingGateway interface ReservationWriter { @Gateway(requestChannel = "output") void write(String rn); } @RestController @RequestMapping("/reservations") class ReservationApiGatewayRestController { private final ReservationReader reservationReader; private final ReservationWriter reservationWriter; @GetMapping("/names") public Collection<String> names() { return reservationReader.read() .getContent() .stream() .map(Reservation::getReservationName) .collect(Collectors.toList()); } @PostMapping public void write(@RequestBody Reservation r) { this.reservationWriter.write(r.getReservationName()); } ReservationApiGatewayRestController( ReservationReader reservationReader, ReservationWriter reservationWriter) { this.reservationReader = reservationReader; this.reservationWriter = reservationWriter; } }