微服务-服务状态变更日志获取与展现

说明:这个服务状态是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中的函数进行转换。

原文地址:https://www.cnblogs.com/excellencesy/p/12214059.html