Eureka’s Health Checks
默认情况下,Eureka使用客户端心跳来确定客户端是否已启动。除非另有说明,否则Discovery Client不会根据Spring Boot Actuator传播应用程序的当前运行状况检查状态。因此,在成功注册后,Eureka始终宣布应用程序处于“UP”状态。通过启用Eureka运行状况检查可以更改此行为,从而将应用程序状态传播到Eureka。因此,每个其他应用程序都不会向“UP”以外的状态下的应用程序发送流量。以下示例显示如何为客户端启用运行状况检查:
application.yml
eureka:
client:
healthcheck:
enabled: true
如果您需要更多控制运行状况检查,请考虑实现自己的com.netflix.appinfo.HealthCheckHandler。
Eureka Metadata for Instances and Clients
值得花一点时间了解Eureka元数据的工作原理,因此您可以在平台中使用它。存在标准元数据,用于提供主机名,IP地址,端口号,状态页和运行状况检查等信息。这些发布在服务注册表中,客户端使用它们以直接的方式联系服务。可以将其他元数据添加到eureka.instance.metadataMap中的实例注册中,并且可以在远程客户端中访问此元数据。通常,除非客户端了解元数据的含义,否则其他元数据不会更改客户端的行为。本文稍后将介绍几种特殊情况,其中Spring Cloud已经为元数据映射赋予了意义。
Using Eureka on Cloud Foundry
Cloud Foundry有一个全局路由器,因此同一个应用程序的所有实例都具有相同的主机名(具有类似架构的其他PaaS解决方案具有相同的安排)。这不一定是使用Eureka的障碍。但是,如果您使用路由器(建议甚至强制使用,具体取决于您的平台的设置方式),您需要明确设置主机名和端口号(安全或非安全),以便他们使用路由器。您可能还希望使用实例元数据,以便区分客户端上的实例(例如,在自定义负载平衡器中)。默认情况下,eureka.instance.instanceId是vcap.application.instance_id,如以下示例所示:
application.yml
eureka:
instance:
hostname: ${vcap.application.uris[0]}
nonSecurePort: 80
根据在Cloud Foundry实例中设置安全规则的方式,您可以注册并使用主机VM的IP地址进行直接服务到服务调用。Pivotal Web Services(PWS)尚未提供此功能。
Using Eureka on AWS
如果计划将应用程序部署到AWS云,则必须将Eureka实例配置为支持AWS。您可以通过自定义EurekaInstanceConfigBean来执行此操作,如下所示:
@Bean
@Profile("!default")
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) {
EurekaInstanceConfigBean b = new EurekaInstanceConfigBean(inetUtils);
AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
b.setDataCenterInfo(info);
return b;
}
Changing the Eureka Instance ID
一个vanilla Netflix Eureka实例注册的ID等于其主机名(即每个主机只有一个服务)。
Spring Cloud Eureka提供合理的默认值,定义如下:$ {} spring.cloud.client.hostname:$ {} spring.application.name:$ {spring.application.instance_id:$ {server.port}}}
一个例子是myhost:myappname:8080。
通过使用Spring Cloud,您可以通过在eureka.instance.instanceId中提供唯一标识符来覆盖此值,如以下示例所示:
application.yml
eureka:
instance:
instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
使用前面示例中显示的元数据和部署在localhost上的多个服务实例,将随机值插入其中以使实例唯一。在Cloud Foundry中,vcap.application.instance_id会自动填充在Spring Boot应用程序中,因此不需要随机值。
Using the EurekaClient
一旦您拥有作为发现客户端的应用程序,就可以使用它从Eureka Server发现服务实例。一种方法是使用本机com.netflix.discovery.EurekaClient(而不是Spring Cloud DiscoveryClient),如以下示例所示:
@Autowired
private EurekaClient discoveryClient;
public String serviceUrl() {
InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
return instance.getHomePageUrl();
}
不要在@PostConstruct方法或@Scheduled方法中使用EurekaClient(或者可能尚未启动ApplicationContext的任何地方)。它在SmartLifecycle中初始化(阶段= 0),因此最早可以依赖它的是另一个具有更高阶段的SmartLifecycle。
EurekaClient without Jersey
默认情况下,EurekaClient使用Jersey进行HTTP通信。如果您希望避免来自Jersey的依赖项,则可以将其从依赖项中排除。Spring Cloud基于Spring RestTemplate自动配置传输客户端。
以下示例显示Jersey被排除在外:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-apache-client4</artifactId>
</exclusion>
</exclusions>
</dependency>