9

To jest moja konfiguracja:404 podczas korzystania Wiosna chmura FeignClients

Pierwszy serwis (FlightIntegrationApplication), które wywołać drugą usługę (BaggageServiceApplication) używając FeignClients API i Eureka.

projektu na github: https://github.com/IdanFridman/BootNetflixExample

Pierwsza usługa:

@SpringBootApplication 
@EnableCircuitBreaker 
@EnableDiscoveryClient 
@ComponentScan("com.bootnetflix") 
public class FlightIntegrationApplication { 

    public static void main(String[] args) { 
     new SpringApplicationBuilder(FlightIntegrationApplication.class).run(args); 
    } 

} 

w jednym z regulatorów:

@RequestMapping("/flights/baggage/list/{id}") 
    public String getBaggageListByFlightId(@PathVariable("id") String id) { 
     return flightIntegrationService.getBaggageListById(id); 
    } 

FlightIntegrationService:

public String getBaggageListById(String id) { 
     URI uri = registryService.getServiceUrl("baggage-service", "http://localhost:8081/baggage-service"); 
     String url = uri.toString() + "/baggage/list/" + id; 
     LOG.info("GetBaggageList from URL: {}", url); 

     ResponseEntity<String> resultStr = restTemplate.getForEntity(url, String.class); 
     LOG.info("GetProduct http-status: {}", resultStr.getStatusCode()); 
     LOG.info("GetProduct body: {}", resultStr.getBody()); 
     return resultStr.getBody(); 

    } 

RegistryService:

@Named 
public class RegistryService { 

    private static final Logger LOG = LoggerFactory.getLogger(RegistryService.class); 


    @Autowired 
    LoadBalancerClient loadBalancer; 

    public URI getServiceUrl(String serviceId, String fallbackUri) { 
     URI uri; 
     try { 
      ServiceInstance instance = loadBalancer.choose(serviceId); 
      uri = instance.getUri(); 
      LOG.debug("Resolved serviceId '{}' to URL '{}'.", serviceId, uri); 

     } catch (RuntimeException e) { 
      // Eureka not available, use fallback 
      uri = URI.create(fallbackUri); 
      LOG.error("Failed to resolve serviceId '{}'. Fallback to URL '{}'.", serviceId, uri); 
     } 

     return uri; 
    } 

} 

I to jest druga usługa (bagaż-service):

BaggageServiceApplication:

@Configuration 
@ComponentScan("com.bootnetflix") 
@EnableAutoConfiguration 
@EnableEurekaClient 
@EnableFeignClients 
public class BaggageServiceApplication { 


    public static void main(String[] args) { 
     new SpringApplicationBuilder(BaggageServiceApplication.class).run(args); 
    } 

} 

BaggageService:

@FeignClient("baggage-service") 
public interface BaggageService { 

    @RequestMapping(method = RequestMethod.GET, value = "/baggage/list/{flight_id}") 
    List<String> getBaggageListByFlightId(@PathVariable("flight_id") String flightId); 


} 

BaggageServiceImpl:

@Named 
public class BaggageServiceImpl implements BaggageService{ 

.... 

    @Override 
    public List<String> getBaggageListByFlightId(String flightId) { 
     return Arrays.asList("2,3,4"); 
    } 

} 

podczas wywoływania kontroler odpoczynek usług integracji lot uzyskać:

2015-07-22 17:25:40.682 INFO 11308 --- [ XNIO-2 task-3] c.b.f.service.FlightIntegrationService : GetBaggageList from URL: http://X230-Ext_IdanF:62007/baggage/list/4 
2015-07-22 17:25:43.953 ERROR 11308 --- [ XNIO-2 task-3] io.undertow.request      : UT005023: Exception handling request to /flights/baggage/list/4 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 404 Not Found 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 

Każdy pomysł?

Dzięki, promień.

Odpowiedz

3

Twój kod odwraca się do mnie.

Feign klient za usługę bagażowego powinny zostać uznane w służbie lotniczej oraz serwis bagażowy powinien mieć kontroler, który reaguje na adresie URL mapy w kliencie usług bagażu, należy nie implementować interfejs uwagami z @FeignClient .

Konfiguracja masz teraz, nie będzie miał żadnego kontrolera słuchania na /bagażu/listy/{flightId} w służbie bagażu i bez klienta udawać w służbie lotu - cały sens udawać jest wywołanie metody na interfejsie zamiast ręcznie obsługiwać adresy URL, Spring Cloud zajmuje się automatycznym tworzeniem implementacji interfejsu i użyje Eureka do wykrywania.

Spróbuj tego (lub zmodyfikować tak, aby pasował do prawdziwego świata aplikację):

Flight Service:

FlightIntegrationService.java:

@Component 
public class FlightIntegrationService { 

    @Autowired 
    BaggageService baggageService; 

    public String getBaggageListById(String id) { 
     return baggageService.getBaggageListByFlightId(id); 
    } 
} 

BaggageService.java:

@FeignClient("baggage-service") 
public interface BaggageService { 

    @RequestMapping(method = RequestMethod.GET, value = "/baggage/list/{flight_id}") 
    List<String> getBaggageListByFlightId(@PathVariable("flight_id") String flightId); 
} 

Bagaż usługi:

BaggageController.java:

@RestController 
public class BaggageController { 

    @RequestMapping("/baggage/list/{flightId}") 
    public List<String> getBaggageListByFlightId(@PathVariable String flightId) { 
     return Arrays.asList("2,3,4"); 
    } 
} 

Usuń BaggageService.java i BaggageServiceImpl.java z Serwisu bagażu

+0

Nie powinien "BaggageController" wdrożyć 'BaggageService'? – Spacemonkey

+0

Niekoniecznie - czasami trzeba uzyskać obiekty żądania lub odpowiedzi w kontrolerze lub obsługiwać wiele metod interfejsu za pomocą tej samej metody kontrolera. Dobrym przykładem są parametry zapytań, w których możesz mieć wartości domyślne dla brakujących parametrów w jednej metodzie sterownika, ale potrzebujesz wielu metod interfejsu, jeśli chcesz uniknąć wywoływania go z grupą 'null's. – Raniz

1

registryService.getServiceUrl ("bagaż-service", ... zastąpić registryService.getServiceUrl ("bagaż-service")

upewnić się, że pasuje do właściwej nazwy

usunąć część localhost

lub tylko użyć http://local part

to działało tylko dla nas, jeśli masz tylko nazwę usługi wymienione w Eureka desce rozdzielczej, nie oba

+1

ja nie rozumiem. napisałeś tę samą linię. – rayman

+0

Lokalnyhost wymienia tylko w faillback-url nie w głównym – rayman

Powiązane problemy