SpringCloud Eureka设置服务下线上线事件通知

/ Java / 没有评论 / 2007浏览

最近由于微服务会莫名其妙挂掉,导致一些服务宕机;固所以寻找解决办法,莫名宕机暂时还未查明原因,先人肉解决办法.Eureka的server端会发出5个事件通知,分别是:

由于Eureka拥有自我保护机制,当其注册表里服务因为网络或其他原因出现故障而关停时,Eureka不会剔除服务注册,而是等待其修复。这是AP的一种实现。我们可以采取关闭此功能,让其剔除不健康节点,从而导致执行EurekaInstanceCanceledEvent事件.

服务端

eureka:
    server:
        #设为false,关闭自我保护
        enableSelfPreservation: false
        #检测间隔(单位毫秒,默认是1分钟)
        evictionIntervalTimerInMs: 4000

客户端

eureka:
    instance:
        #租期更新时间间隔 (单位秒,默认30秒)
        leaseRenewalIntervalInSeconds: 10
        #租期到期时间 (单位秒,默认90秒)
        leaseExpirationDurationInSeconds: 30
    #开启健康检查(需要spring-boot-starter-actuator依赖)
    client:
        healthcheck: enabled 

注意:更改Eureka更新频率将打破服务器的自我保护功能,现在开始说eureka服务端代码事件,之前博客有集成邮件的,在此略过。。直接上代码,在Eureka server里直接添加就行

/**
 * eureka状态改变监听器
 *
 * @Author zyt
 * @Date 2018/10/29 10:15
 */
@Component
public class EurekaStateChangeListener {

    private static final Logger logger = LoggerFactory.getLogger(EurekaStateChangeListener.class);

    /** 区分生产环境 */
    @Value("${spring.profiles.active}")
    String active;

    /**
     * 服务下线事件
     * @param event
     */
    @EventListener
    public void listenDown(EurekaInstanceCanceledEvent event){
        if (active.equals("production")) {
            // 发送邮件
            logger.info(MarkerFactory.getMarker("DOWN"), 
                        "服务ID:" + event.getServerId() + "\t" +
                        "服务实例:" + event.getAppName() + "\t服务下线");
        }
        logger.info(event.getServerId() + "\t" + event.getAppName() + "服务下线");
    }
}

里面加了个判断,当为生产环境时则发送邮件

/**
     * 服务注册事件
     * @param event
     */
@EventListener
public void listenDown(EurekaInstanceRegisteredEvent event){
    InstanceInfo instanceInfo = event.getInstanceInfo();
    logger.info(MarkerFactory.getMarker("DOWN"), instanceInfo.getAppName() + "服务注册");
}