分享

sprincloud源码之eureka服务下架/续期

 vnxy001 2022-02-09
sprincloud源码之eureka服务下架/续期

前言

请先看服务注册
本文只涉及eureka-server端的代码

服务下架

InstanceRegistry(发布事件)——>AbstractInstanceRegistry(真正操作)——>PeerAwareInstanceRegistryImpl(集群同步),设计采取责任链模式遵循单一职责原则

eureka-core的resources包下
InstanceResource #cancelLease()
——>InstanceRegistry#cancel发布事件EurekaInstanceCanceledEvent
——>AbstractInstanceRegistry#cancel 真正进行服务下架操作
——>PeerAwareInstanceRegistryImpl#cancel 集群同步

真正进行服务下架操作

	protected boolean internalCancel(String appName, String id, boolean isReplication) {
			//从registry拿到appName的微服务组
    	 	Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
    	 	//从appName的微服务组拿到id的微服务实例
            Lease<InstanceInfo> leaseToCancel = null;
            if (gMap != null) {
                leaseToCancel = gMap.remove(id);
            }
            //最近下架的微服务的queue
            recentCanceledQueue.add(new Pair<Long, String>(System.currentTimeMillis(), appName + "(" + id + ")"));
            if (leaseToCancel == null) {
            	//下架失败
                return false;
            } else {
            	//调用lease的cancel记录evictionTimestamp
                leaseToCancel.cancel();
                //微服务实例
                InstanceInfo instanceInfo = leaseToCancel.getHolder();
                //vip和svip我没用过,应该是eureka-client可以设置一些vip地址
                //比如一个集群可以有几千个微服务,但是user模块只对其中几个微服务实例感兴趣,这就是vip地址
                //上面是个人猜测
                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();
                }
            }
       
        synchronized (lock) {
            if (this.expectedNumberOfClientsSendingRenews > 0) {
            	//期待的发送心跳的客户端的数量-1
                this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews - 1;
                //这个请看前言里的那个链接的文章
                updateRenewsPerMinThreshold();
            }
        }

        return true;          
}

服务续期

一样是发布事件,续期操作,集群同步,这里只看renew

public boolean renew(String appName, String id, boolean isReplication) {
       //从registry拿到appName的微服务组
        Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
        //从appName的微服务组拿到id的微服务实例
        Lease<InstanceInfo> leaseToRenew = null;
        if (gMap != null) {
            leaseToRenew = gMap.get(id);
        }
        if (leaseToRenew == null) {
          	//续期失败
            return false;
        } else {
        	//微服务实例
            InstanceInfo instanceInfo = leaseToRenew.getHolder();
            
            if (instanceInfo != null) {
                InstanceStatus overriddenInstanceStatus = this.getOverriddenInstanceStatus(
                        instanceInfo, leaseToRenew, isReplication);
                 //这一段我暂时没看懂,但正常情况都不会进
                if (overriddenInstanceStatus == InstanceStatus.UNKNOWN) {
                    RENEW_NOT_FOUND.increment(isReplication);
                    return false;
                }
                if (!instanceInfo.getStatus().equals(overriddenInstanceStatus)) {
                    instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);
                }
            }
			//执行lease的renew进行续期
            leaseToRenew.renew();
            return true;
        }
    }

总结

服务下架:发布下架事件,下架操作gMap.remove,lease.cancel, 集群同步
服务续期:发布续期事件,续期操作lease.renew,集群同步

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多