作者:mobiledu2502852923 | 来源:互联网 | 2023-09-10 20:18
主要是eureka监听存在难点`***服务下线事件*@paramevent*@EventListener(condition#event.replicationfalse)pu
主要是eureka监听存在难点`
/**
* 服务下线事件
* @param event
*/
@EventListener(cOndition= "#event.replication == false")
public void listen(EurekaInstanceCanceledEvent event) {
String appName = event.getAppName();
String serverId = event.getServerId();
// 已经下线的服务,我们不需要重复发送短信,外层拦截
if (SERVICES.contains(serverId + appName)) {
log.warn("服务已下线,外层拦截, serviceId : {}, appName : {}", serverId, appName);
return;
}
synchronized (this) {
// 已经下线的服务,我们不需要重复发送短信,内层拦截
if (SERVICES.contains(serverId + appName)) {
log.warn("服务已下线,内层拦截, serviceId : {}, appName : {}", serverId, appName);
return;
}
// 首次下线,添加发送短信标志
SERVICES.add(serverId + appName);
String hostName = serverId.split(":")[0];
try {
InetAddress ipAddr = InetAddress.getByName(hostName);
log.info("{}服务,服务id:{}离线,ip:{}", appName, serverId, ipAddr.getHostAddress());
updateServiceStatus(appName, ipAddr.getHostAddress(), 0);
} catch (Exception e) {
log.error("转换hostName对应的ip地址失败,{}", e.getMessage());
// windows平台可能因为是主机名,直接传递主机名
updateServiceStatus(appName, hostName, 0);
}
}
}
/**
* 服务注册事件
* @param event
*/
@EventListener(cOndition= "#event.replication == false")
public void listen(EurekaInstanceRegisteredEvent event) {
InstanceInfo instanceInfo = event.getInstanceInfo();
String serverId = instanceInfo.getInstanceId();
String appName = instanceInfo.getAppName();
// 防止服务下线后再次调用注册
if(UP.equals(instanceInfo.getStatus().toString())) {
log.info("服务注册,服务信息:{}, 服务名称:{}, 服务id:{}",
instanceInfo, instanceInfo.getAppName(), instanceInfo.getIPAddr());
updateServiceStatus(instanceInfo.getAppName(), instanceInfo.getIPAddr(), 1);
// 服务重启恢复后,删掉发送短信标志
if(SERVICES.contains(serverId + appName)) {
log.warn("再一次注册服务, 服务集合大小 : {}, 删除服务关键字 : {}",
SERVICES.size(), serverId + appName);
SERVICES.remove(serverId + appName);
}
}
}`