最近由於微服務會莫名其妙掛掉,導致一些服務宕機;
固所以尋找解決辦法,莫名宕機暫時還未查明原因,先人肉解決辦法
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() + "服務注冊"); }