Spring Cloud Netflix简介(二)

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>

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/88762170