source code
@PUT
public Response renewLease(
@HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication,
@QueryParam("overriddenstatus") String overriddenStatus,
@QueryParam("status") String status,
@QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) {
boolean isFromReplicaNode = "true".equals(isReplication);
//核心代码
boolean isSuccess = registry.renew(app.getName(), id, isFromReplicaNode);
return response;
}
/**
* @Description:
* @Author: PABLO
* @Date: 2022/5/18 14:23
* @Params: [appName, serverId, isReplication]
* @Return: boolean
**/
public boolean renew(final String appName, final String serverId, boolean isReplication) {
log("renew " + appName + " serverId " + serverId + ", isReplication {}" + isReplication);
//根据appName获取application
Application application = getApplication(appName);
if (application != null) {
InstanceInfo instanceInfo = application.getByInstanceId(serverId);
if (instanceInfo != null) {
publishEvent(new EurekaInstanceRenewedEvent(this, appName, serverId, instanceInfo, isReplication));
}
}
return super.renew(appName, serverId, isReplication);
}
/**
* @Description: 获取对应节点
* @Author: PABLO
* @Date: 2022/5/18 14:23
* @Params: [appName, includeRemoteRegion]
* @Return: com.netflix.discovery.shared.Application
**/
public Application getApplication(String appName, boolean includeRemoteRegion) {
Application app = null;
//注册表
Map<String, Lease<InstanceInfo>> leaseMap = registry.get(appName);
if (leaseMap != null && leaseMap.size() > 0) {
//集群遍历
for (Map.Entry<String, Lease<InstanceInfo>> entry : leaseMap.entrySet()) {
if (app == null) {
app = new Application(appName);
}
//这里会获取该节点的心跳间隔时间(默认30)和客户端租约时间(默认90)-->(客户端均可自定义)
app.addInstance(decorateInstanceInfo(entry.getValue()));
}
//远程获取查询
} else if (includeRemoteRegion) {
for (RemoteRegionRegistry remoteRegistry : this.regionNameVSRemoteRegistry.values()) {
Application application = remoteRegistry.getApplication(appName);
if (application != null) {
return application;
}
}
}
return app;
}
/**
* @Description: 续约
* @Author: PABLO
* @Date: 2022/5/18 14:06
* @Params: [appName, id 节点id , isReplication]
* @Return: boolean
**/
public boolean renew(String appName, String id, boolean isReplication) {
RENEW.increment(isReplication);
//获取对应集群map
Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
Lease<InstanceInfo> leaseToRenew = null;
if (gMap != null) {
//获取对应节点信息
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) {
//获取节点状态
InstanceInfo.InstanceStatus overriddenInstanceStatus = this.getOverriddenInstanceStatus(
instanceInfo, leaseToRenew, isReplication);
//判断是否宕机状态
if (overriddenInstanceStatus == InstanceInfo.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(),
overriddenInstanceStatus.name(),
instanceInfo.getId());
//重置状态
instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);
}
}
renewsLastMin.increment();
//续约
leaseToRenew.renew();
return true;
}
}
public void renew() {
//修改最后的操作时间 当前时间+租约时间(可自定义)
lastUpdateTimestamp = System.currentTimeMillis() + duration;
//判断过期
//当前时间-最后操作时间是否大于duration
}