将 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 命名服务器来充分利用客户端负载平衡是最理想的。
我对 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 命名服务器来充分利用客户端负载平衡是最理想的。