使用Eureka时,是否可以通过功能区(通过伪装)定义静态服务器列表?

Dav*_*vid 0 spring-cloud spring-cloud-feign netflix-ribbon spring-cloud-netflix

环境

  • 春季靴 1.5.13.RELEASE
  • 春云 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
Run Code Online (Sandbox Code Playgroud)

语境

我有一个应用程序,可以使用伪装客户端与其他3种服务进行通信。其中的两个是通过Eureka服务发现而发现的。这些运作良好。最终服务是具有单个静态主机名的外部服务,我不希望通过Eureka解决此问题。由于我确实希望Eureka可以使用其中的两项服务,因此我希望启用Eureka。

对于最终服务,我尝试将添加service1.ribbon.listOfServers=https://www.google.com到中application.properties,但是在调用伪客户端时在运行时会遇到以下错误:

路径为[]的Servlet [dispatcherServlet]的Servlet.service()引发异常[请求处理失败;嵌套的异常是com.netflix.hystrix.exception.HystrixRuntimeException:Service1Client#test()失败,并且没有可用的备用。定价_1 | com.netflix.client.ClientException:负载均衡器没有可供客户端使用的服务器:service1Price_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();

}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的任何建议。

考虑

根据我所了解的功能区的精神,它是充当客户端负载平衡器,在我的情况下,没有任何负载平衡(我有一个固定的静态主机名,该主机名在DNS中返回单个A记录)。Ribbon实际上感觉像是一个不必要的组件-我真正想要的是Feign客户端,因为我喜欢这样一个事实,即它抽象了较低级别的HTTP请求和对象序列化。因此,我想一个替代的后续问题是,我可以在没有功能区的情况下使用伪装-似乎开箱即用的好行为是使用功能区-甚至@FeignClient注释的Javadoc 都说:

如果功能区可用,它将用于对后端请求进行负载均衡,并且可以使用@RibbonClient与假客户端相同名称(即值)的来配置负载均衡器。

这表明即使两者服务于不同的目的,两者也具有密切的联系。

yon*_*oon 5

如您所述,有两种方法可以解决您的问题。

使用功能区无功能区 如果url@FeignClient注释中指定属性,则如下所示,功能区将不使用功能区即可使用。

@FeignClient(name = "service1", url = http://www.google.com)
public interface Service1Client {
    @GetMapping(value = "/")
    String test();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的另外两个Feign客户仍然可以使用Ribbon和Eureka。

与丝带一起使用假装而没有尤里卡

您缺少的是配置NIWSServerListClassName。它的默认值为com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList,它将使用Eureka检索服务器列表。如果设置NIWSServerListClassNameConfigurationBasedServerList一个带状的客户端(客户端假死),只有该客户端将与listOfServers列表而不从尤里卡获取服务器列表。其他假冒客户仍将与Eureka合作。

service1:
  ribbon:
    NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
    listOfServers: http://www.google.com
Run Code Online (Sandbox Code Playgroud)

  • 知道如何使用 Spring Boot 2.2.x 和 Spring Cloud Loadbalancer 实现相同的效果吗?具体来说,如何为给定的假客户端提供静态服务器列表。 (3认同)