在一些场景下,我们需要监听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
@EnableScheduling
public 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
*/
@Component
public 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 启动");
}
}
网友评论