Spring cloud 在使用Eureka时,是否可以使用ribbon(通过外文)定义静态服务器列表? 环境 弹簧护套1.5.13.1释放 Spring Cloud Edgware.SR3 爪哇8 配置 Eureka客户端已启用,工作正常。我已测试,一切正常。

Spring cloud 在使用Eureka时,是否可以使用ribbon(通过外文)定义静态服务器列表? 环境 弹簧护套1.5.13.1释放 Spring Cloud Edgware.SR3 爪哇8 配置 Eureka客户端已启用,工作正常。我已测试,一切正常。,spring-cloud,spring-cloud-netflix,spring-cloud-feign,netflix-ribbon,Spring Cloud,Spring Cloud Netflix,Spring Cloud Feign,Netflix Ribbon,我的配置中的一些相关属性: 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服务发现发现的。这些都很有效

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

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.listofserver=https://www.google.com 但是,在调用外部客户端时,在运行时会出现以下错误:

路径为[]的上下文中Servlet[dispatcherServlet]的Servlet.service引发了异常[请求处理失败;嵌套异常为com.netflix.hystrix.exception.hystrix RuntimeException:Service1ClientSet失败且没有可用的回退。]根本原因为 定价|1| 定价| com.netflix.client.ClientException:负载平衡器没有可用于客户端的服务器:service1 定价| 1 |在com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancerLoadBalancerContext.java:483~[ribbon-loadbalancer-2.2.5.jar!/:2.2.5]

我的客户端配置如下:

@FeignClient("service1")
public interface Service1Client {

    @GetMapping(value = "/")
    String test();

}
提前谢谢你的建议

考虑 因为我理解Ribbon的精神是充当客户端负载均衡器,在我的例子中,没有任何东西需要负载平衡,所以我有一个固定的静态主机名,它在DNS中返回单个a记录。Ribbon实际上感觉像是一个不必要的组件——我真正想要的是假客户端,因为我喜欢它抽象出较低级别的HTTP请求和对象序列化。因此,我想另一个后续问题是,我可以在没有ribbon的情况下使用Faign吗?似乎使用ribbon是一种很好的开箱即用的行为,甚至@FaignClient注释的Javadoc都会说:

如果ribbon可用,它将可用 用于负载平衡后端请求,可以配置负载平衡器 使用与外部客户端具有相同名称(即值)的@RibbonClient


这意味着,即使这两者的用途不同,它们也有着非常密切的关系。

正如您所提到的,有两种方法可以解决您的问题

使用不带丝带的伪装 如果在@FeignClient注释中指定url属性,它将在没有功能区的情况下工作,如下所示

@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
    @GetMapping(value = "/")
    String test();
}
在这种情况下,您的另外两个外国客户机仍将使用Ribbon和Eureka

使用带Ribbon和不带Eureka的伪装

配置中缺少的是NIWSServerListClassName。 其默认值为com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList,它将使用Eureka检索服务器列表。如果为功能区客户端外部客户端将NIWSServerListClassName设置为ConfigurationBasedServerList,则只有该客户端将使用listOfServers列表,而不会从Eureka检索服务器列表。其他外国客户仍将与尤里卡合作

service1:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    listOfServers: http://www.google.com

正如你提到的,有两种方法可以解决你的问题

使用不带丝带的伪装 如果在@FeignClient注释中指定url属性,它将在没有功能区的情况下工作,如下所示

@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
    @GetMapping(value = "/")
    String test();
}
在这种情况下,您的另外两个外国客户机仍将使用Ribbon和Eureka

使用带Ribbon和不带Eureka的伪装

配置中缺少的是NIWSServerListClassName。 其默认值为com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList,它将使用Eureka检索服务器列表。如果为功能区客户端外部客户端将NIWSServerListClassName设置为ConfigurationBasedServerList,则只有该客户端将使用listOfServers列表,而不会从Eureka检索服务器列表。其他外国客户仍将与尤里卡合作

service1:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    listOfServers: http://www.google.com

您知道如何使用SpringBoot2.2.x和SpringCloudLoadBalancer实现同样的功能吗?特别是如何为给定的外部客户机提供服务器的静态列表。您知道如何使用SpringBoot2.2.x和SpringCloudLoadBalancer来实现这一点吗?特别是如何为给定的外部客户机提供服务器的静态列表。