eureka監聽各服務狀態並針對服務中斷郵件提醒功能實現
為實現重要服務單點故障的及時修復, 加上Eureka Server 包含對服務5種狀態較完善的監聽實現, 特基於此實現各監聽處理邏輯.
Eureka-Server的五種事件通知

EurekaInstanceCanceledEvent 服務下線事件
EurekaInstanceRegisteredEvent 服務注冊事件
EurekaInstanceRenewedEvent 服務續約事件
EurekaRegistryAvailableEvent Eureka注冊中心啟動事件
EurekaServerStartedEvent Eureka Server啟動事件
Java郵箱通知實現
pom導包:
<!-- JavaMail-->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
連接郵件服務器(對應的郵箱賬號需開通郵箱服務)
Properties props = new Properties(); // 發送服務器需要身份驗證 props.setProperty("mail.smtp.auth", "true"); // 設置郵件服務器主機名 props.setProperty("mail.host", "smtp.163.com"); // 發送郵件協議名稱 props.setProperty("mail.transport.protocol", "smtp"); try { // 設置環境信息 Session session = Session.getInstance(props); // 創建郵件對象 Message msg = new MimeMessage(session); msg.setSubject("Eureka Server status check"); // 設置郵件內容 msg.setText("服務異常關閉提醒 appName : " + appName + " , serverId : " + serverId); // 設置發件人(賬號) msg.setFrom(new InternetAddress("niuya***@163.com")); Transport transport = session.getTransport(); // 連接郵件服務器(賬號,授權碼) transport.connect("niuya***@163.com", "***"); // 發送郵件 transport.sendMessage(msg, new Address[] {new InternetAddress("niuya@***.com")}); // 關閉連接 transport.close(); } catch (Exception e) { log.error("send module canceled message error : ", e); }
完整實現
import com.netflix.appinfo.InstanceInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.netflix.eureka.server.event.*; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import javax.mail.Address; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; @Component public class EurekaStateChangeListener { private static final Logger log = LoggerFactory.getLogger(EurekaStateChangeListener.class); @EventListener public void listen(EurekaInstanceCanceledEvent eurekaInstanceCanceledEvent) { String appName = eurekaInstanceCanceledEvent.getAppName(); String serverId = eurekaInstanceCanceledEvent.getServerId(); log.info("module canceled server_id : " + serverId); sendCanceledWarnMail(appName,serverId); } @EventListener public void listen(EurekaInstanceRegisteredEvent event) { InstanceInfo instanceInfo = event.getInstanceInfo(); log.info("module registered instanceInfo : " + instanceInfo); } @EventListener public void listen(EurekaInstanceRenewedEvent event) { String serverId = event.getServerId(); log.info("module renewed server_id : " + serverId); } @EventListener public void listen(EurekaRegistryAvailableEvent event) { String eventStr = event.toString(); log.info("module available is " + eventStr); } @EventListener public void listen(EurekaServerStartedEvent event) { String startStr = event.toString(); log.info("module start is " + startStr); } }
