users: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
当Eureka与Ribbon结合使用(即两者都在类路径上)时,ribbonServerList
将被扩展为DiscoveryEnabledNIWSServerList
,扩展名为Eureka的服务器列表。它还用NIWSDiscoveryPing
替换IPing
接口,代理到Eureka以确定服务器是否启动。默认情况下安装的ServerList
是一个DomainExtractingServerList
,其目的是使物理元数据可用于负载平衡器,而不使用AWS AMI元数据(这是Netflix依赖的)。默认情况下,服务器列表将使用实例元数据(如远程客户端集合eureka.instance.metadataMap.zone
)中提供的“区域”信息构建,如果缺少,则可以使用服务器主机名中的域名作为代理用于区域(如果设置了标志approximateZoneFromHostname
)。一旦区域信息可用,它可以在ServerListFilter
中使用。默认情况下,它将用于定位与客户端相同区域的服务器,因为默认值为ZonePreferenceServerListFilter
。默认情况下,客户端的区域与远程实例的方式相同,即通过eureka.instance.metadataMap.zone
。
Eureka是一种方便的方式来抽象远程服务器的发现,因此您不必在客户端中对其URL进行硬编码,但如果您不想使用它,Ribbon和Feign仍然是适用的。假设您已经为“商店”申请了@RibbonClient
,并且Eureka未被使用(甚至不在类路径上)。Ribbon客户端默认为已配置的服务器列表,您可以提供这样的配置
stores: ribbon: listOfServers: example.com,google.com
设置属性ribbon.eureka.enabled = false
将明确禁用在Ribbon中使用Eureka。
ribbon: eureka: enabled: false
直接使用Ribbon API
您也可以直接使用LoadBalancerClient
。例:
public class MyClass {
@Autowired
private LoadBalancerClient loadBalancer;
public void doStuff() {
ServiceInstance instance = loadBalancer.choose("stores");
URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
// ... do something with the URI
}
}