SpringCloudEureka service renewal process and source code

insert image description here
insert image description here

insert image description here
insert image description here

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

}

Guess you like

Origin blog.csdn.net/GiantCrocodile/article/details/124843273