我有一个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,然后失败,因为没有找到。尽管似乎已经理解了这个问题,但我一直无法在网上找到解决方案或者自己想一个解决方案。
任何帮助将不胜感激。 谢谢!
答案 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}}
中提出的解决方案