运行阶段执行健康检查的目的是为了从Eureka服务器注册表中识别并删除不可访问的微服务,Eureka 服务器并不是向客户端发送心跳请求,而是反过来,Eureka 客户端将心跳发送到Eureka服务器,让服务器了解其状态。

    这些心跳机制就需要在微服务嵌入一个客户端,用来发送心跳,但是客户端本身必须确定其健康状态,而且Eureka服务器必须为客户端公开一些REST操作以让其发布心跳。

Eureka服务器向客户端公开下面资源以让其发送心跳:

PUT /eureka/apps/{app id}/{instance id}?status={status} 

{instance id}采用  hostname:app id:port,其中app id代表标识唯一的Eureka客户端实例,Eureka服务器会识别一些状态数值:UP; DOWN; STARTING; OUT_OF_SERVICE; UNKNOWN.

客户端发送心跳时的URL如下:

PUT /eureka/apps/ORDER-SERVICE/localhost:order-service:8886?status=UP 

Eureka服务器收到心跳请求后,会续订该实例的租约。如果是第一个心跳,则Eureka服务器以404响应,之后客户端必须首先发送注册请求。

此外 Eureka服务器公开以下操作以允许健康状态的修改和删除:

PUT /eureka/apps/{app id}/{instance id}/status?value={status}

DELETE /eureka/apps/{app id}/{instance id}/status

修改操作(即PUT上面的操作)是用于手动获取健康的实例OUT_OF_SERVICE时操作,或者使用Asgard等管理工具 (暂时禁止某些实例的流量)时操作。

这种修改操作对于“红/黑”部署非常有用,在这种情况下,你可以在一段时间内运行较旧版本的微服务(如果新版本不稳定,则可以轻松回滚到旧版本)。完成新版本的部署并且新版本开始为请求提供服务后,可以让旧版本OUT_OF_SERVICE(但不会让他们停止)暂停提供请求服务。即


PUT /eureka/apps/ORDER-SERVICE/localhost:order-service:8886/statusvalue=OUT_OF_SERVICE


上面修改的状态也可以被丢弃,我们可以指示让Eureka服务器开始遵守实例本身发布的状态,如下所示:

DELETE /eureka/apps/ORDER-SERVICE/localhost:order-service:8886/status 

当您发现微服务的新版本不稳定并且您希望获得旧版本(即已经被打上OUT_OF_SERVICE标记的版本)以开始提供请求时,上述办法非常有用。

 

Eureka客户端自我诊断

     Eureka客户端(或服务器)都是不调用/health端点来确定实例的健康状态,Eureka实例的运行状况由HealthCheckHandler实现确定,只要应用程序正在运行,默认情况下HealthCheckHandler始终会通知应用程序处于某种  UP 状态。

   Eureka允许通过EurekaClient#registerHealthCheck()API 插入自定义的HealthCheckHandlers,如果在Spring Cloud设置了以下属性,则会注册一个新的Spring自己的处理程序EurekaHealthCheckHandler: