服务下架
如上图所示一路debug走InstanceRegistry(发布事件)——>AbstractInstanceRegistry(真正操作)——>PeerAwareInstanceRegistryImpl(集群同步),设计采取责任链模式遵循单一职责原则.
InstanceResource #cancelLease()
——>InstanceRegistry#cancel发布事件EurekaInstanceCanceledEvent
——>AbstractInstanceRegistry#cancel 真正进行服务下架操作
——>PeerAwareInstanceRegistryImpl#cancel 集群同步
真正进行服务下架操作
protected boolean internalCancel(String appName, String id, boolean isReplication) {
try {
read.lock();
CANCEL.increment(isReplication);
//从registry拿到appName的微服务组
Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
Lease<InstanceInfo> leaseToCancel = null;
if (gMap != null) {
//从appName的微服务组拿到id的微服务实例
leaseToCancel = gMap.remove(id);
}
synchronized (recentCanceledQueue) {
//最近下架的微服务的queue
recentCanceledQueue.add(new Pair<Long, String>(System.currentTimeMillis(), appName + "(" + id + ")"));
}
InstanceStatus instanceStatus = overriddenInstanceStatusMap.remove(id);
if (instanceStatus != null) {
logger.debug("Removed instance id {} from the overridden map which has value {}", id, instanceStatus.name());
}
if (leaseToCancel == null) {
//下架失败
CANCEL_NOT_FOUND.increment(isReplication);
logger.warn("DS: Registry: cancel failed because Lease is not registered for: {}/{}", appName, id);
return false;
} else {
//调用lease的cancel记录evictionTimestamp
leaseToCancel.cancel();
//微服务实例
InstanceInfo instanceInfo = leaseToCancel.getHolder();
String vip = null;
String svip = null;
if (instanceInfo != null) {
//设置微服务状态delete
instanceInfo.setActionType(ActionType.DELETED);
//近三分钟发生改动的微服务的queue,用于增量更新使用返回给客户端
recentlyChangedQueue.add(new RecentlyChangedItem(leaseToCancel));
//最后更新的时间戳
instanceInfo.setLastUpdatedTimestamp();
vip = instanceInfo.getVIPAddress();
svip = instanceInfo.getSecureVipAddress();
}
// 更新缓存数据
invalidateCache(appName, vip, svip);
logger.info("Cancelled instance {}/{} (replication={})", appName, id, isReplication);
return true;
}
} finally {
read.unlock();
}
}
服务续期
一样是发布事件,续期操作,集群同步,这里只看续期最低层方法renew
public boolean renew(String appName, String id, boolean isReplication) {
RENEW.increment(isReplication);
//从registry拿到appName的微服务组
Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
Lease<InstanceInfo> leaseToRenew = null;
if (gMap != null) {
//从appName的微服务组拿到id的微服务实例
leaseToRenew = gMap.get(id);
}
//续期失败
if (leaseToRenew == null) {
RENEW_NOT_FOUND.increment(isReplication);
logger.warn("DS: Registry: lease doesn't exist, registering resource: {} - {}", appName, id);
return false;
} else {
//微服务实例
InstanceInfo instanceInfo = leaseToRenew.getHolder();
if (instanceInfo != null) {
// touchASGCache(instanceInfo.getASGName());
InstanceStatus overriddenInstanceStatus = this.getOverriddenInstanceStatus(
instanceInfo, leaseToRenew, isReplication);
if (overriddenInstanceStatus == InstanceStatus.UNKNOWN) {
logger.info("Instance status UNKNOWN possibly due to deleted override for instance {}"
+ "; re-register required", instanceInfo.getId());
RENEW_NOT_FOUND.increment(isReplication);
return false;
}
if (!instanceInfo.getStatus().equals(overriddenInstanceStatus)) {
logger.info(
"The instance status {} is different from overridden instance status {} for instance {}. "
+ "Hence setting the status to overridden status", instanceInfo.getStatus().name(),
instanceInfo.getOverriddenStatus().name(),
instanceInfo.getId());
instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);
}
}
renewsLastMin.increment();
//执行lease的renew进行续期
leaseToRenew.renew();
return true;
}
}
总结
服务下架:发布下架事件,下架操作gMap.remove,lease.cancel, 集群同步
服务续期:发布续期事件,续期操作lease.renew,集群同步