是否可以在使用 Eureka 时使用 ribbon(通过 feign)定义静态服务器列表?

Is it possible to define a static server list with ribbon (via feign) when Eureka is in use?

环境

配置

我的配置中的一些相关属性:

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