eureka服务下架、服务续期及eureka源码分析

 

服务下架

如上图所示一路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,集群同步

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章