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,集群同步

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值