第四篇:Spring Cloud Eureka服务上下线监控
标签:
Spring Cloud
在一些场景下,我们需要监听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
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦