一旦您拥有@EnableDiscoveryClient(或@EnableEurekaClient)的应用程序,您就可使用它来从Eureka服务器发现服务实例。一种方法是使用本机com.netflix.discovery.EurekaClient(而不是Spring云DiscoveryClient),例如html
@Autowired private EurekaClient discoveryClient;spring
public String serviceUrl() { InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false); return instance.getHomePageUrl(); } 提示 不要使用@PostConstruct方法或@Scheduled方法(或ApplicationContext可能还没有启动的任何地方)EurekaClient。它被初始化为SmartLifecycle(带有phase=0),因此最先能够依靠它可用的是另外一个具备更高阶段的SmartLifecycle。 本机Netflix EurekaClient的替代方案 您没必要使用原始的Netflix EurekaClient,一般在某种包装器后面使用它更为方便。Spring Cloud支持Feign(REST客户端构建器),还支持Spring RestTemplate使用逻辑Eureka服务标识符(VIP)而不是物理URL。要使用固定的物理服务器列表配置Ribbon,您能够将.ribbon.listOfServers设置为逗号分隔的物理地址(或主机名)列表,其中是客户端的ID。缓存
您还可使用org.springframework.cloud.client.discovery.DiscoveryClient,它为Netflix不具体的发现客户端提供简单的API,例如服务器
@Autowired private DiscoveryClient discoveryClient;.net
public String serviceUrl() { List list = discoveryClient.getInstances("STORES"); if (list != null && list.size() > 0 ) { return list.get(0).getUri(); } return null; } 为何注册服务这么慢? 做为一个实例也包括按期心跳到注册表(经过客户端的serviceUrl),默认持续时间为30秒。在实例,服务器和客户端在其本地缓存中都具备相同的元数据(所以可能须要3个心跳)以前,客户端才能发现服务。您可使用eureka.instance.leaseRenewalIntervalInSeconds更改期限,这将加快客户端链接到其余服务的过程。在生产中,最好坚持使用默认值,由于服务器内部有一些计算能够对租赁更新期进行假设。cdn
区 若是您已将Eureka客户端部署到多个区域,您可能但愿这些客户端在使用另外一个区域中的服务以前,利用同一区域内的服务。为此,您须要正确配置您的Eureka客户端。htm
首先,您须要确保将Eureka服务器部署到每一个区域,而且它们是彼此的对等体。有关详细信息,请参阅区域和区域部分 。blog
接下来,您须要告知Eureka您的服务所在的区域。您可使用metadataMap属性来执行此操做。例如,若是service 1部署到zone 1和zone 2,则须要在service 1中设置如下Eureka属性部署
1区服务1get
eureka.instance.metadataMap.zone = zone1 eureka.client.preferSameZoneEureka = true 第2区的服务1
eureka.instance.metadataMap.zone = zone2 eureka.client.preferSameZoneEureka = true