将 Feign 与 Spring 引导一起使用时将 URL 加倍

Double the URL when using Feign with Spring boot

我对 Spring 引导有点陌生,我正在使用 Feign Rest 客户端与我的 Web 服务对话。但是我的 URL 加倍了,无法调用预期的服务。

@FeignClient(name= "exchange-service", url="localhost:8000")

public 接口 ExchangeServiceProxy {

@GetMapping
@RequestMapping(value = "/exchange/from/{from}/to/{to}")
public ExchangeBean retrieveExchangeValue(@PathVariable("from") String from,
        @PathVariable("to") String to);

}

 status 404 reading 
ExchangeServiceProxy#retrieveExchangeValue(String,String); content:
{"timestamp":"2018-11-22T05:50:45.822+0000","status":404,"error":"Not 
Found","message":"No message 
available","path":"/exchange/from/USD/to/XYZ/exchange/from/USD/to/XYZ"}

你需要在 @SpringBootApplication 之后的 main class 中添加 @EnableFeignClients 像这样:

@SpringBootApplication
@ComponentScan
@EnableScheduling
@EnableAsync
@EnableZuulProxy
@EnableFeignClients
public class ExampleApplication extends SpringBootServletInitializer{
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }


}

然后像这样为 FeignClient 创建接口:

@FeignClient(name = "service_name", url = "http://localhost:port_to_the_another_application")
public interface ExampleFeignClient {

    @RequestMapping(value = "/mapping", method = RequestMethod.POST)
    String createUserWallet(@RequestHeader("Authorization") String jwtToken);
}

希望对您有所帮助。

您还没有将 Spring Starter Class 放入您的问题中。如果您使用 Feign 进行客户端负载平衡,@EnableFeignClients 足以放入您的 Spring 启动器 class。我认为您已将 @GetMapping 和 @RequestMapping 都放在您的 ExchangeServiceProxy 中,这是不必要的。请删除@GetMapping,因为您在@RequestMapping 中提供了url 模式。这可能会导致 url 加倍。

@FeignClient(name= "exchange-service", url="localhost:8000")
public interface ExchangeServiceProxy {

@RequestMapping(value = "/exchange/from/{from}/to/{to}")
public ExchangeBean retrieveExchangeValue(@PathVariable("from") String 
from,
        @PathVariable("to") String to);
}

如果你有像url="localhost:8000"这样的硬编码那么它只会命中端口下运行的实例8000. 如果你的意图是我提到的,那么使用 Ribbon 和 Eureka 命名服务器来充分利用客户端负载平衡是最理想的。