假设客户优先使用尤里卡的yaml中的URL

时间:2017-07-19 21:06:33

标签: spring spring-boot netflix-eureka netflix-feign

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

我为难以理解的解释道歉,希望下面的代码片段有助于澄清。

Feign客户:

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

在我调用此Feign客户端的控制器中,使用@AutoWired定义了FooServiceProxy:

@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,然后失败,因为没有找到。尽管似乎已经理解了这个问题,但我一直无法在网上找到解决方案或者自己想一个解决方案。

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

1 个答案:

答案 0 :(得分:1)

关于这个问题,您应该考虑到当eureka在您的类路径上时,所有功能区配置都由eureka收费,因此它将使用eureka服务器列表。

  

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

您可以尝试添加NIWSServerListClassName配置:

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

或尝试本期{... 3}}

中提出的解决方案