1.5.13.RELEASE
Edgware.SR3
我的配置中的一些相关属性:
feign.hystrix.enabled=true
eureka.client.fetch-registry=true
spring.cloud.service-registry.auto-registration.enabled=true
service1.ribbon.listOfServers=https://www.google.com
我有一个使用假装客户端与其他3个服务对话的应用程序。其中两个是通过Eureka服务发现发现的。这些都运作良好。最终服务是一个具有单个静态主机名的外部服务,我不希望通过Eureka解决这个问题。由于我确实希望Eureka提供其中两项服务,所以我希望启用Eureka。
对于最终服务,我尝试将service1.ribbon.listOfServers=https://www.google.com
添加到application.properties
,但是这会在调用假装客户端时在运行时出现以下错误:
servlet [dispatcherServlet]的Servlet.service()与path []的上下文发生异常[请求处理失败;嵌套异常是com.netflix.hystrix.exception.HystrixRuntimeException:Service1Client#test()失败并且没有后备可用。 pricing_1 | pricing_1 | com.netflix.client.ClientException:负载均衡器没有客户端的可用服务器:service1 pricing_1 |在com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483)〜[ribbon-loadbalancer-2.2.5.jar!/:2.2.5]
我的客户端配置如下:
@FeignClient("service1")
public interface Service1Client {
@GetMapping(value = "/")
String test();
}
提前感谢任何建议。
由于我所理解的Ribbon的精神是充当客户端负载均衡器并在我的情况下给出没有任何负载平衡(我有一个固定的静态主机名,在DNS中返回单个A记录)。功能区实际上感觉像是一个不必要的组件 - 我真正想要的是Feign客户端,因为我喜欢它抽象出较低级别的HTTP请求和对象分类。所以我想一个替代的后续问题是,我可以使用假装没有功能区 - 看起来开箱即用的行为就是使用功能区 - 即使@FeignClient
注释的Javadoc说:
如果功能区可用,它将是 用于对后端请求进行负载均衡,可以配置负载均衡器 使用与{feign client>具有相同名称(即值)的
@RibbonClient
。
表明两者的关系非常密切,即使它们用于不同的目的。
答案 0 :(得分:4)
正如您所提到的,有两种方法可以解决您的问题。
使用不带功能的假设
如果您在url
注释中指定@FeignClient
属性,则无法使用Ribbon,如下所示。
@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
@GetMapping(value = "/")
String test();
}
在这种情况下,您的另外两个Feign客户端仍然可以使用Ribbon和Eureka。
使用Feign with Ribbon而不使用Eureka
您的配置中缺少的是NIWSServerListClassName
。
它的默认值是com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
,它将使用Eureka检索服务器列表。如果您为功能区客户端(假装客户端)将NIWSServerListClassName
设置为ConfigurationBasedServerList
,则只有该客户端才能使用listOfServers
列表,而无需从Eureka检索服务器列表。其他假装客户仍将与Eureka合作。
service1:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
listOfServers: http://www.google.com