继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

第四篇:Spring Cloud Eureka服务上下线监控

慕标5832272
关注TA
已关注
手记 1263
粉丝 233
获赞 1008

在一些场景下,我们需要监听eureka服务中心的一些状态,譬如某个微服务挂掉了,我们希望能监听到,并给管理员发送邮件通知。

在Eureka服务中进行检测通知,Eureka中提供了事件监听的方式来支持扩展。

  • EurekaInstanceCanceledEvent 服务下线事件

  • EurekaInstanceRegisteredEvent 服务注册事件

  • EurekaInstanceRenewedEvent 服务续约事件

  • EurekaRegistryAvailableEvent Eureka注册中心启动事件

  • EurekaServerStartedEvent Eureka Server启动事件

import com.netflix.discovery.shared.Applications;import com.netflix.eureka.EurekaServerContextHolder;import com.netflix.eureka.registry.PeerAwareInstanceRegistry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;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.context.ApplicationEvent;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;/**
 * eureka事件监听
 * 例如:用于监听eureka服务停机通知
 *
 * @author hrabbit
 * @date 2018-09-13
 */@Configuration@EnableSchedulingpublic class EurekaInstanceCanceledListener implements ApplicationListener {    private Logger log = LoggerFactory.getLogger(EurekaInstanceCanceledListener.class);    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {        // EurekaInstanceCanceledEvent 服务下线事件
        if (applicationEvent instanceof EurekaInstanceCanceledEvent) {
            EurekaInstanceCanceledEvent event = (EurekaInstanceCanceledEvent) applicationEvent;            // 获取当前Eureka实例中的节点信息
            PeerAwareInstanceRegistry registry = EurekaServerContextHolder.getInstance().getServerContext().getRegistry();
            Applications applications = registry.getApplications();            // 遍历获取已注册节点中与当前失效节点ID一致的节点信息
            applications.getRegisteredApplications().forEach((registeredApplication) -> {
                registeredApplication.getInstances().forEach((instance) -> {                    if (instance.getInstanceId().equals(event.getServerId())) {
                        log.info("服务:" + instance.getAppName() + " 挂啦。。。");                        // TODO: 2018-09-13 扩展消息提醒 邮件、手机短信、微信等
                    }
                });
            });
        }        //EurekaInstanceRegisteredEvent 服务注册事件
        if (applicationEvent instanceof EurekaInstanceRegisteredEvent) {
            EurekaInstanceRegisteredEvent event = (EurekaInstanceRegisteredEvent) applicationEvent;
            log.info("服务:" + event.getInstanceInfo().getAppName() + " 注册成功啦...");
        }        //EurekaInstanceRenewedEvent 服务续约事件
        if (applicationEvent instanceof EurekaInstanceRenewedEvent) {
            EurekaInstanceRenewedEvent event = (EurekaInstanceRenewedEvent) applicationEvent;
            log.info("服务:" + event.getInstanceInfo().getAppName() + "续约...");
        }        //EurekaRegistryAvailableEvent Eureka注册中心启动事件
        if (applicationEvent instanceof EurekaRegistryAvailableEvent) {
            log.info("Eureka注册中心启动了...");
        }

    }
}

这样我们可以构建自己的注册中心监控,当然这种写法是为了方便大家了解几个实践,下面的写法显得更加简洁和符合规范。

import com.netflix.appinfo.InstanceInfo;import org.springframework.cloud.netflix.eureka.server.event.*;import org.springframework.context.event.EventListener;import org.springframework.stereotype.Component;/**
 * eureka事件监听
 * 例如:用于监听eureka服务停机通知
 *
 * @author hrabbit
 * @date 2018-09-13
 */@Componentpublic class EurekaStateChangeListener {    /**
     * EurekaInstanceCanceledEvent 服务下线事件
     * @param event
     */
    @EventListener
    public void listen(EurekaInstanceCanceledEvent event) {
        System.out.println(event.getServerId() + "\t" + event.getAppName() + " 服务下线");
    }    /**
     * EurekaInstanceRegisteredEvent 服务注册事件
     * @param event
     */
    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        System.out.println(instanceInfo.getAppName() + "进行注册");
    }    /**
     * EurekaInstanceRenewedEvent 服务续约事件
     * @param event
     */
    @EventListener
    public void listen(EurekaInstanceRenewedEvent event) {
        System.out.println(event.getServerId() + "\t" + event.getAppName() + " 服务进行续约");
    }    /**
     * EurekaRegistryAvailableEvent Eureka注册中心启动事件
     * @param event
     */
    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) {
        System.out.println("注册中心 启动");
    }    /**
     * EurekaServerStartedEvent Eureka Server启动事件
     * @param event
     */
    @EventListener
    public void listen(EurekaServerStartedEvent event) {
        System.out.println("Eureka Server 启动");
    }
}



作者:hrabbits
链接:https://www.jianshu.com/p/0d4f760510c7


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP