【问题标题】:Struggling to get SpringCloud Feign to work with external services努力让 SpringCloud Feign 与外部服务一起工作
【发布时间】:2017-08-19 15:21:42
【问题描述】:

使用 Feign 访问我在 Eureka 上注册的服务是轻而易举的事。我正在尝试使用 Feign 访问外部服务并在基础知识方面苦苦挣扎。

我正在使用 Bluemix 上的一项服务,但是为了简化手头的问题,我正在使用一项简单的服务。

我的代理显示如下:

//@FeignClient(name = "country-service-client", url = "https://country.io")
@FeignClient(name = "another-country-service-client", url = "http://restcountries.eu/rest/v2/name/Australia")

public interface SimpleServiceProxy {

    //This one works
    @RequestMapping(method = RequestMethod.GET, value = "/names.json", produces = "application/json")
    String getCountries();

    //This one does not work... This is used in conjunction where the url in the Fiegn Client annotation reads as - http://restcountries.eu/rest/v2
    @RequestMapping(method = RequestMethod.GET, value = "/name/{country}", produces = "application/json")
    public String getCountryInfo(@PathVariable("country") String country);



     //This one doesn't work either
    //@RequestMapping(method = RequestMethod.GET, value = "/name/Australia", produces = "application/json")
    public String getCountryInfoHardcodedWithinMethod();
}

    //This works however I would want to pass parameters and path variables to the URL
    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
    public String getCountryInfoHardcodedAtFeignClientAnnotation();
}

我已经尝试了一些变体(参见上面的代码),最后一个在 Feign Client 注释中硬编码 URL 的变体有效。其他人抛出 TimeoutException。

java.util.concurrent.TimeoutException: null
    at com.netflix.hystrix.AbstractCommand.handleTimeoutViaFallback(AbstractCommand.java:958) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.AbstractCommand.access$400(AbstractCommand.java:59) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.AbstractCommand$11.call(AbstractCommand.java:573) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.AbstractCommand$11.call(AbstractCommand.java:565) ~[hystrix-core-1.5.3.jar:1.5.3]
    at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:139) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OperatorDoOnEach$1.onError(OperatorDoOnEach.java:71) ~[rxjava-1.1.5.jar:1.1.5]
    at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$1.run(AbstractCommand.java:1099) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:41) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable$1.call(HystrixContextRunnable.java:37) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator$2.tick(AbstractCommand.java:1116) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.util.HystrixTimer$1.run(HystrixTimer.java:99) ~[hystrix-core-1.5.3.jar:1.5.3]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_112]
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[na:1.8.0_112]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_112]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_112]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_112]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_112]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_112]

我很困惑,想弄清楚。在尝试找出 PathVariables 不起作用的原因之前,我想让硬编码的方法起作用。

我错过了什么? (或者这里做错了)?

【问题讨论】:

    标签: spring-cloud spring-cloud-netflix spring-cloud-feign feign


    【解决方案1】:

    我刚刚尝试了这个简单的应用程序,它对我来说很好用 Dalston.RC1

    @SpringBootApplication
    @EnableFeignClients
    @RestController
    public class DemoApplication {
    
        @Autowired
        SimpleServiceProxy proxy;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @RequestMapping("/")
        public String getCountry() {
            return proxy.getCountryInfo("Australia");
        }
    }
    
    @FeignClient(name = "another-country-service-client", url ="http://restcountries.eu/rest/v2")
    interface SimpleServiceProxy {
        @RequestMapping(method = RequestMethod.GET, value = "/name/{country}", produces = "application/json")
        public String getCountryInfo(@PathVariable("country") String country);
    }
    

    您问题中的异常是在发出请求时通过 Hystrix 指示超时。您可以尝试禁用 Hystrix 并使用 feign.hystrix.enabled=false 查看它是否会消失。

    【讨论】:

    • 瑞恩,谢谢。我使用 Brixton.SR6 和 1.4.5 版本的 spring boot。我相信 feign.hystrix.enabled 不可用(STS 不会在 code-assist 上显示这个)。
    • 将 1.4.5(或 1.5.1 或 1.5.2)与 Dalston.RC1 一起使用会引发许多 maven 错误 - 一个示例错误是:对于工件 {org.springframework.cloud:spring- cloud-starter-feign:null:jar}:版本不能为空。 (org.apache.maven.plugins:maven-resources-plugin:2.6:resources:default-resources:process-resources)
    • 仅仅因为 STS 在它的自动完成中没有这个监听并不意味着它是无效的。请参阅 Brixton 文档cloud.spring.io/spring-cloud-static/Brixton.SR7/…。如果不是最新的 Camden 版本,我建议您至少考虑升级到 Brixton.SR7。至于那些 Dalston 错误,请在 SO 上打开另一个问题/问题。
    • 你应该在使用 Dalston.RC1 时添加 spring 的里程碑 repo。
    • 瑞恩,谢谢。它现在已经开始工作了(仍然使用 Brixton.SR6 和 1.4.5)。我不知道为什么它昨天没有工作,而且今天完全没有任何变化。这当然是令人费解的。这当然不是网络问题,因为我昨天可以通过浏览器访问这些 URL。
    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 2019-04-24
    • 2015-12-31
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多