Spring cloud 努力让SpringCloud假装与外部服务合作

Spring cloud 努力让SpringCloud假装与外部服务合作,spring-cloud,spring-cloud-netflix,spring-cloud-feign,feign,Spring Cloud,Spring Cloud Netflix,Spring Cloud Feign,Feign,使用Faign访问我在Eureka上注册的服务是轻而易举的事。我正试图用“外号”来获取外部服务,并努力解决基本问题 我正在Bluemix上使用一个服务,但是为了简化手头的问题,我使用了一个简单的服务 我的代理如下所示: //@FeignClient(name = "country-service-client", url = "https://country.io") @FeignClient(name = "another-country-service-client", url = "htt

使用Faign访问我在Eureka上注册的服务是轻而易举的事。我正试图用“外号”来获取外部服务,并努力解决基本问题

我正在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();
}
我尝试了几个变体(参见上面的代码),最后一个变体是在外部客户端注释中硬编码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不起作用的原因之前,我想让硬编码的方法起作用


我错过了什么?(或者在这里做得不正确)?

我刚刚尝试了这个简单的应用程序,它使用
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查看它是否消失

Ryan,谢谢。我使用的是Brixton.SR6和1.4.5版本的spring boot。我认为feign.hystrix.enabled不可用(STS在代码帮助中没有显示)。将1.4.5(或1.5.1或1.5.2)与Dalston.RC1一起使用会引发许多maven错误-例如错误是:对于工件{org.springframework.cloud:springcloudstarter feign:null:jar}:版本不能为空。(org.apache.maven.plugins:maven资源插件:2.6:resources:default resources:process resources)仅仅因为STS的自动完成中没有此侦听,并不意味着它无效。请参阅Brixton文档。我建议您至少考虑升级到 Brxton。SR7<代码>,如果不是最新的卡姆登版本。至于Dalston的错误,请打开另一个问题。在使用Dalston.RC1.Ryan时,您应该添加spring的里程碑回购,谢谢。它现在已经开始工作(仍然使用Brixton.SR6和1.4.5)。我不知道为什么它昨天不起作用,今天却毫无变化。这确实是令人费解的,现在也是令人费解的。这当然不是网络问题,因为我昨天可以通过浏览器访问URL。