说明:这个服务状态是Eureka里面提供的,Eureka中提供了五种监听可供使用,分别是:
EurekaInstanceCanceledEvent 服务下线事件
EurekaInstanceRegisteredEvent 服务注册事件
EurekaInstanceRenewedEvent 服务续约事件
EurekaRegistryAvailableEvent Eureka注册中心启动事件
EurekaServerStartedEvent Eureka Server启动事件
(1)在Eureka的服务端:可以在监听到各种事件后将其存储到数据库中:
package com.googosoft.register.listener; import com.googosoft.register.info.ListenerType; import com.googosoft.register.pojo.InstanceLog; import com.googosoft.register.pojo.ServerLog; import com.googosoft.register.service.InstanceLogService; import com.googosoft.register.service.ServerLogService; import com.netflix.appinfo.InstanceInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent; import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRegisteredEvent; import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceRenewedEvent; import org.springframework.cloud.netflix.eureka.server.event.EurekaRegistryAvailableEvent; import org.springframework.cloud.netflix.eureka.server.event.EurekaServerStartedEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; /** * @author songyan * @version 2020年1月9日 下午3:20:39 * @desc */ @Component public class EurekaStateChangeListener { @Autowired private ServerLogService serverLogService; @Autowired private InstanceLogService instanceLogService; protected final Logger logger = LoggerFactory.getLogger(getClass()); /** * 监听:服务下线事件 * @param eurekaInstanceCanceledEvent */ @EventListener public void listen(EurekaInstanceCanceledEvent eurekaInstanceCanceledEvent) { try { logger.info("*************服务下线********"); String appName = eurekaInstanceCanceledEvent.getAppName(); String serverId = eurekaInstanceCanceledEvent.getServerId(); ServerLog log = new ServerLog(appName,serverId,ListenerType.Listener_Canceled); serverLogService.addLog(log); } catch (Exception e) { e.printStackTrace(); } } /** * 监听:服务注册事件 * @param eurekaInstanceCanceledEvent */ @EventListener(condition = "#event.replication==false") public void listen(EurekaInstanceRegisteredEvent event) { try { logger.info("*************服务注册事件********"); InstanceInfo instanceInfo = event.getInstanceInfo(); String appName = instanceInfo.getAppName(); String instanceId = instanceInfo.getInstanceId(); InstanceLog log = new InstanceLog(appName,instanceId,ListenerType.Listener_Registered); instanceLogService.addLog(log); } catch (Exception e) { e.printStackTrace(); } } /** * 监听:服务续约事件 * @param eurekaInstanceCanceledEvent */ @EventListener(condition = "#event.replication==false") public void listen(EurekaInstanceRenewedEvent event) { try { logger.info("*************服务续约事件********"); String appName = event.getAppName(); String serverId = event.getServerId(); //ServerLog log = new ServerLog(appName,serverId,ListenerType.Listener_Renewed); //serverLogService.addLog(log); } catch (Exception e) { e.printStackTrace(); } } /** * 监听:注册中心启动事件 * @param eurekaInstanceCanceledEvent */ @EventListener public void listen(EurekaRegistryAvailableEvent event) { logger.info("*************注册中心启动事件********"); try { ServerLog log = new ServerLog("服务注册中心","",ListenerType.Listener_RegistryAvailable); serverLogService.addLog(log); } catch (Exception e) { e.printStackTrace(); } } /** * 监听:Eureka Server启动事件 * @param eurekaInstanceCanceledEvent */ @EventListener public void listen(EurekaServerStartedEvent event) { logger.info("*************Eureka Server启动事件********"); try { ServerLog log = new ServerLog("Eureka Server","",ListenerType.Listener_ServerStarted); serverLogService.addLog(log); } catch (Exception e) { e.printStackTrace(); } } }
(2)在客户端:直接读取数据库中日志展现即可
**小插曲:
在这个项目中,我使用的sqllite的数据库,也是第一次使用,在存储时间的时候按照往常的习惯存储的时间戳,但是在java中的时间戳是毫秒级别的,但是在sqllite数据库中时间戳是秒级别的,所有在进行转换,比较的时候就会出现各种问题。本想着将两种时间戳进行级别的转换,但是,,未果,,哈哈,最后直接存储的字符串,在进行日期类的比较时在使用sqllite中的函数进行转换。