是否可以在使用 Eureka 时使用 ribbon(通过 feign)定义静态服务器列表?
Is it possible to define a static server list with ribbon (via feign) when Eureka is in use?
环境
- Spring开机
1.5.13.RELEASE
- Spring云
Edgware.SR3
- Java 8
配置
- Eureka 客户端已启用并正常工作(我已经测试过,一切都按预期工作)。
我的配置中的一些相关属性:
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 来提供其中的 2 个服务,所以我想保持启用 Eureka。
问题
对于最后的服务,我尝试将 service1.ribbon.listOfServers=https://www.google.com
添加到 application.properties
,但是这会在调用假客户端时在运行时出现以下错误:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: Service1Client#test() failed and no fallback available.] with root cause
pricing_1 |
pricing_1 | com.netflix.client.ClientException: Load balancer does not have available server for client: service1
pricing_1 | at 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 的精神是充当客户端负载平衡器,在我的例子中没有什么负载平衡(我有一个固定的静态主机名 returns 一个单一的 A记录在 DNS 中)。 Ribbon 实际上感觉像是一个不必要的组件——我真正想要的是 Feign 客户端,因为我喜欢它抽象出较低级别的 HTTP 请求和对象序列化。所以我想另一个后续问题是,我可以在没有功能区的情况下使用 feign - 开箱即用的行为似乎是使用功能区 - 即使 @FeignClient
注释的 Javadoc 说:
If ribbon is available it will be
used to load balance the backend requests, and the load balancer can be configured
using a @RibbonClient
with the same name (i.e. value) as the feign client.
这表明即使它们服务于不同的目的,两者也非常密切相关。
如您所说,有两种方法可以解决您的问题。
在没有功能区的情况下使用 Feign
如果您在 @FeignClient
注释中指定 url
属性,它将在没有功能区的情况下工作,如下所示。
@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
@GetMapping(value = "/")
String test();
}
在这种情况下,您的另外两个 Feign 客户端仍将使用 Ribbon 和 Eureka。
在没有 Eureka 的情况下使用带有 Ribbon 的 Feign
您的配置中缺少的是 NIWSServerListClassName
。
它的默认值为 com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
并且它将使用 Eureka 来检索服务器列表。如果将功能区客户端(假客户端)的 NIWSServerListClassName
设置为 ConfigurationBasedServerList
,则只有该客户端可以使用 listOfServers
列表,而无需从 Eureka 检索服务器列表。其他 feign 客户端仍将与 Eureka 一起工作。
service1:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
listOfServers: http://www.google.com
环境
- Spring开机
1.5.13.RELEASE
- Spring云
Edgware.SR3
- Java 8
配置
- Eureka 客户端已启用并正常工作(我已经测试过,一切都按预期工作)。
我的配置中的一些相关属性:
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 来提供其中的 2 个服务,所以我想保持启用 Eureka。
问题
对于最后的服务,我尝试将 service1.ribbon.listOfServers=https://www.google.com
添加到 application.properties
,但是这会在调用假客户端时在运行时出现以下错误:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: Service1Client#test() failed and no fallback available.] with root cause pricing_1 | pricing_1 | com.netflix.client.ClientException: Load balancer does not have available server for client: service1 pricing_1 | at 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 的精神是充当客户端负载平衡器,在我的例子中没有什么负载平衡(我有一个固定的静态主机名 returns 一个单一的 A记录在 DNS 中)。 Ribbon 实际上感觉像是一个不必要的组件——我真正想要的是 Feign 客户端,因为我喜欢它抽象出较低级别的 HTTP 请求和对象序列化。所以我想另一个后续问题是,我可以在没有功能区的情况下使用 feign - 开箱即用的行为似乎是使用功能区 - 即使 @FeignClient
注释的 Javadoc 说:
If ribbon is available it will be used to load balance the backend requests, and the load balancer can be configured using a
@RibbonClient
with the same name (i.e. value) as the feign client.
这表明即使它们服务于不同的目的,两者也非常密切相关。
如您所说,有两种方法可以解决您的问题。
在没有功能区的情况下使用 Feign
如果您在 @FeignClient
注释中指定 url
属性,它将在没有功能区的情况下工作,如下所示。
@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
@GetMapping(value = "/")
String test();
}
在这种情况下,您的另外两个 Feign 客户端仍将使用 Ribbon 和 Eureka。
在没有 Eureka 的情况下使用带有 Ribbon 的 Feign
您的配置中缺少的是 NIWSServerListClassName
。
它的默认值为 com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
并且它将使用 Eureka 来检索服务器列表。如果将功能区客户端(假客户端)的 NIWSServerListClassName
设置为 ConfigurationBasedServerList
,则只有该客户端可以使用 listOfServers
列表,而无需从 Eureka 检索服务器列表。其他 feign 客户端仍将与 Eureka 一起工作。
service1:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
listOfServers: http://www.google.com