2017-07-19 28 views
0

我有一个作为Eureka客户端的Spring Boot应用程序。该应用程序需要通过REST调用另一个微服务,并且我希望使用Feign进行此调用。我遇到的问题是,我的应用程序正试图在Eureka中查找服务名称,当它仅在我的应用程序yaml文件中定义时。Feign客户端通过Eureka在yaml中优先化URL

对于难以理解的解释,我表示歉意,希望下面的代码片段有助于澄清。

假死客户端:

@FeignClient("foo") 
@Component 
public interface FooServiceProxy{ 
    @RequestMapping(value = "/balance", method = RequestMethod.POST, produces = "application/json") 
    ServiceResponse execute(ServiceRequest serviceRequest); 
} 

在我的控制器谁调用这个假死客户端时,FooServiceProxy使用@Autowired定义:

@Autowired 
private FooServiceProxy fooServiceProxy; 

我YAML文件如下:

spring: 
    application: 
     name: app-name 

server: 
port: 8080 

foo: 
    ribbon: 
     listOfServers: http://hostname:8081/balance 

eureka: 
    client: 
    fetchRegistry: false 
    serviceUrl: 
     defaultZone: http://eurekasrver:8761/eureka/ 

我的问题是,在运行时,引发以下错误: java.lang.RuntimeException:com.netflix.client.ClientException:负载均衡器没有可用的客户端服务器:foo

有趣的是,如果我从应用程序中删除@EnableEurekaClient注释,则一切正常。我相信我理解这个问题,而不是在yaml文件中查找foo的服务器,因为应用程序是Eureka客户端,Feign直接找Eureka查找服务器ip,然后失败,因为找不到任何服务器。尽管似乎理解了这个问题,但我一直无法在网上找到解决方案或自己想一个解决方案。

任何帮助将不胜感激。 谢谢!

回答

0

关于这个问题,你应该考虑到,当尤里卡在你的类路径上时,所有功能区配置都由尤里卡收费,所以它会使用尤里卡服务器的列表。

Spring Cloud使用@RibbonClient配置功能区使用的类型,例如服务器列表。如果你在类路径中有尤里卡,默认情况下它使用尤里卡服务器列表(因此你需要使用该标志来禁用尤里卡)。 评论说spencergibb https://github.com/spring-cloud/spring-cloud-netflix/issues/564

您可以通过添加NIWSServerListClassName配置尝试之一:

`someservice.ribbon: 
    NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList 
    listOfServers: server1:80` 

或者尝试在这个问题提出的解决方案https://github.com/spring-cloud/spring-cloud-netflix/issues/564