9

verwenden ist mein Setup:404 während Federwolke FeignClients

erster Service (FlightIntegrationApplication), die zweite Dienst (BaggageServiceApplication) unter Verwendung von FeignClients API und Eureka aufzurufen.

Projekt auf Github: https://github.com/IdanFridman/BootNetflixExample

Erster Service:

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

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

} 

in einem der Controller:

@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; 
    } 

} 

Und das ist der zweite Service (Gepäck-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"); 
    } 

} 

Wenn der Rest Controller Flug Integration Service Aufruf erhalte ich:

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) 

Jede Idee?

Danke, Strahl.

Antwort

3

Ihr Code sieht für mich rückwärts.

Der feign Client für den Gepäckservice soll im Flugdienst und der Gepäckservice sollte einen Controller hat deklariert werden, die auf der URL reagieren Sie in Ihrem Gepäck-Service-Client Karte, sollen Sie nicht die Schnittstelle mit @FeignClient kommentierte implementieren .

Das Setup Sie jetzt haben, werden keine Controller auf /Gepäck/list/{FlightID} im Gepäckdienst und kein Feign Client im Flug Service Hören haben - der ganze Sinn der Feign ist Methoden auf einer Schnittstelle zu nennen Anstatt URLs manuell zu bearbeiten, kümmert sich Spring Cloud um die automatische Implementierung der Schnittstellenimplementierung und verwendet Eureka für die Erkennung.

Versuchen Sie, diese (oder zu ändern, so passt es Ihre realen Welt app):

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); 
} 

Baggage Service:

BaggageController.java:

@RestController 
public class BaggageController { 

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

entfernen BaggageService.java und BaggageServiceImpl.java vom Gepäckservice

+0

Sollte der 'BaggageController' nicht den' BaggageService' implementieren? – Spacemonkey

+0

Nicht unbedingt - manchmal möchten Sie die Request- oder Response-Objekte im Controller abrufen oder mehrere Schnittstellenmethoden mit derselben Controller-Methode behandeln. Ein gutes Beispiel sind Abfrageparameter, wo Sie Standardwerte für fehlende Parameter in einer Controller-Methode haben können, aber mehrere Interface-Methoden benötigen, wenn Sie vermeiden wollen, dass sie mit einer Menge 'null' aufgerufen werden. – Raniz

1

registryService.getServiceUrl ("Gepäck-Service", ... ersetzen mit registryService.getServiceUrl ("Gepäck-Service")

sicherstellen, dass der richtige Name passt

die localhost Teil entfernen

oder nur verwenden, um den http://local Teil

es nur für uns gearbeitet, wenn Sie nur den Namen des Dienstes aufgeführt in Heureka Armaturenbrett haben, nicht beide

+1

Ich verstehe nicht. Du hast dieselbe Zeile geschrieben. – rayman

+0

Der localhost erwähnt nur in der Faillback-URL nicht im Haupt – rayman

Verwandte Themen