Eureka的健康检查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eureka的健康检查相关的知识,希望对你有一定的参考价值。

参考技术A application.yml

eureka:

  client:

    healthcheck:

      enabled: true

警告eureka.client.healthcheck.enabled=true只能在application.yml中设置。设置bootstrap.yml中的值将导致不期望的副作用,例如在具有UNKNOWN状态的eureka中注册。

如果您需要更多的控制健康检查,您可以考虑实施自己的com.netflix.appinfo.HealthCheckHandler。

Eureka实例和客户端的元数据

值得花点时间了解Eureka元数据的工作原理,以便您可以在平台上使用它。有主机名,IP地址,端口号,状态页和运行状况检查等标准元数据。这些发布在服务注册表中,由客户使用,以直接的方式联系服务。额外的元数据可以添加到eureka.instance.metadataMap中的实例注册中,并且这将在远程客户端中可访问,但一般不会更改客户端的行为,除非意识到元数据的含义。下面描述了几个特殊情况,其中Spring Cloud已经为元数据映射指定了含义。

在Cloudfoundry上使用Eureka

Cloudfoundry有一个全局路由器,所以同一个应用程序的所有实例都具有相同的主机名(在具有相似架构的其他PaaS解决方案中也是如此)。这不一定是使用Eureka的障碍,但如果您使用路由器(建议,甚至是强制性的,具体取决于您的平台的设置方式),则需要明确设置主机名和端口号(安全或非安全),以便他们使用路由器。您可能还需要使用实例元数据,以便您可以区分客户端上的实例(例如,在自定义负载平衡器中)。默认情况下,eureka.instance.instanceId为vcap.application.instance_id。例如:

application.yml

eureka:

  instance:

    hostname: $vcap.application.uris[0]

    nonSecurePort: 80

根据Cloudfoundry实例中安全规则的设置方式,您可以注册并使用主机VM的IP地址进行直接的服务到服务调用。此功能尚未在Pivotal Web Services( PWS )上提供。

在AWS上使用Eureka

如果应用程序计划将部署到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;



更改Eureka实例ID

香草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上部署的多个服务实例,随机值将在那里进行,以使实例是唯一的。在Cloudfoundry中,vcap.application.instance_id将在Spring Boot应用程序中自动填充,因此不需要随机值。

使用EurekaClient

一旦您拥有@EnableDiscoveryClient(或@EnableEurekaClient)的应用程序,您就可以使用它来从 Eureka服务器 发现服务实例。一种方法是使用本机com.netflix.discovery.EurekaClient(而不是Spring云DiscoveryClient),例如

@Autowired

private EurekaClient discoveryClient;

public String serviceUrl()

    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);

    return instance.getHomePageUrl();



提示不要使用@PostConstruct方法或@Scheduled方法(或ApplicationContext可能尚未启动的任何地方)EurekaClient。它被初始化为SmartLifecycle(带有phase=0),所以最早可以依靠它可用的是另一个具有更高阶段的SmartLifecycle。

本机Netflix EurekaClient的替代方案

您不必使用原始的NetflixEurekaClient,通常在某种包装器后面使用它更为方便。Spring Cloud支持 Feign (REST客户端构建器),还支持 SpringRestTemplate 使用逻辑Eureka服务标识符(VIP)而不是物理URL。要使用固定的物理服务器列表配置Ribbon,您可以将<client>.ribbon.listOfServers设置为逗号分隔的物理地址(或主机名)列表,其中<client>是客户端的ID。

您还可以使用org.springframework.cloud.client.discovery.DiscoveryClient,它为Netflix不具体的发现客户端提供简单的API,例如

@Autowired

private DiscoveryClient discoveryClient;

public String serviceUrl()

    List<ServiceInstance> list = discoveryClient.getInstances("STORES");

    if (list != null && list.size() > 0 )

        return list.get(0).getUri();

   

    return null;

Linux服务健康检查,自动启动(crontab)

1.编写健康检查脚本:third_health.sh (健康检查是eureka的healthCheckUrlPath)

#!/bin/bash
datestr=`date "+%Y-%m-%d %H:%M:%S"`
echo "$datestr : check start"
curl -s localhost:9004/actuator/health > /dev/null
 
[ $? -eq 0 ] && echo "$datestr : server is running"
[ $? -ne 0 ] && echo "$datestr : server is not running, restart" && sh /data/app.sh third-server restart

如果$?获取到curl执行状态不等于0,运行不成功,则执行&&后的重启服务命令

2.用crontab定时任务来执行上面的健康检查脚本,每15分钟检查一次,编辑crontab后两分钟会自动生效,不用重启crontab

Linux运行 crontab -e  然后输入i,进入编辑模式,加入如下配置:

*/15 * * * * nohup sh /data/security/health/third_health.sh 1>>"/data/security/health/third_health.log" 2>&1 </dev/null &

Ctrl+c退出编辑,:wq保存退出,等待crontab定时配置自动生效,日志会输出到指定的log文件里

以上是关于Eureka的健康检查的主要内容,如果未能解决你的问题,请参考以下文章

springCloud:Eureka的自我保护模式多网卡下的IP选择Eureka的健康检查

Linux服务健康检查,自动启动(crontab)

Linux服务健康检查,自动启动(crontab)

Linux服务健康检查,自动启动(crontab)

Consul坑坑一人行之从入门到放弃,记Consul的重复注册节点失效后无健康检查等坑。。。求解

ELB 健康检查行为 - 健康阈值