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


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

  • 相关阅读:
    开启power management功能有坑,ESP32串口频繁出现UART_BREAK中断
    ESP32音频开发板ESP32-Korvo V1.1踩坑
    驱动开发常用位运算
    ESP8266 RTOS 开发笔记(4)串口透传
    mosquitto服务状态监控(转载)
    ESP8266 RTOS 开发笔记(3)用户参数
    ESP8266 RTOS 开发笔记(2)TCP Client+Server
    ESP8266 RTOS 开发笔记(1)STA+AP模式(共存)
    C uint32 转 uint8
    python 简易计算器(只能计算加减乘除和括号)
  • 原文地址:https://www.cnblogs.com/excellencesy/p/12214059.html
Copyright © 2020-2023  润新知