最近由于微服务会莫名其妙挂掉,导致一些服务宕机;
固所以寻找解决办法,莫名宕机暂时还未查明原因,先人肉解决办法
Eureka的server端会发出5个事件通知,分别是:
EurekaInstanceCanceledEvent 当有服务下线时会执行
EurekaInstanceRegisteredEvent 当有服务注册时会执行
EurekaInstanceRenewedEvent 当有服务续约时会执行
EurekaRegistryAvailableEvent Eureka注册中心启动执行
EurekaServerStartedEvent Eureka Server启动时执行
由于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() + "服务注册"); }