首页 > 其他分享 >微服务笔记之Eureka03(服务续约分析)

微服务笔记之Eureka03(服务续约分析)

时间:2022-11-13 15:14:42浏览次数:52  
标签:status 续约 服务 String isReplication renew instanceInfo Eureka03 id

服务续约接口分析
com.netflix.eureka.resources.InstanceResource#renewLease

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);

        // 没有在注册表中找到,立即请求注册表
        if (!isSuccess) {
            logger.warn("Not Found (Renew): {} - {}", app.getName(), id);
            return Response.status(Status.NOT_FOUND).build();
        }
        // 检查我们是否需要基于脏时间戳进行同步,客户端实例可能已经更改了一些值
        Response response;
        if (lastDirtyTimestamp != null && serverConfig.shouldSyncWhenTimestampDiffers()) {
            response = this.validateDirtyTimestamp(Long.valueOf(lastDirtyTimestamp), isFromReplicaNode);
            // 存储被覆盖的状态,因为验证发现复制的节点胜出
            if (response.getStatus() == Response.Status.NOT_FOUND.getStatusCode()
                    && (overriddenStatus != null)
                    && !(InstanceStatus.UNKNOWN.name().equals(overriddenStatus))
                    && isFromReplicaNode) {
                registry.storeOverriddenStatusIfRequired(app.getAppName(), id, InstanceStatus.valueOf(overriddenStatus));
            }
        } else {
            response = Response.ok().build();
        }
        logger.debug("Found (Renew): {} - {}; reply status={}", app.getName(), id, response.getStatus());
        return response;
    }

再看renew方法
com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#renew

public boolean renew(final String appName, final String id, final boolean isReplication) {
	// 调用父类renew方法
        if (super.renew(appName, id, isReplication)) {
	    // 将该实例信息同步到其他节点
            replicateToPeers(Action.Heartbeat, appName, id, null, null, isReplication);
            return true;
        }
        return false;
    }

再看父类中的renew方法
com.netflix.eureka.registry.AbstractInstanceRegistry#renew

public boolean renew(String appName, String id, boolean isReplication) {
        RENEW.increment(isReplication);
	// 根据服务名称获取实例信息集合
        Map<String, Lease<InstanceInfo>> gMap = registry.get(appName);
        Lease<InstanceInfo> leaseToRenew = null;
        if (gMap != null) {
	    // 根据实例id获取实例信息
            leaseToRenew = gMap.get(id);
        }
	// 没有获取到,有可能下线,直接返回false
        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();
	    // 真正的操作,更改时间
            leaseToRenew.renew();
            return true;
        }
    }

com.netflix.eureka.lease.Lease#renew

public void renew() {
	// 当前时间加上间隔时间
        lastUpdateTimestamp = System.currentTimeMillis() + duration;

    }

标签:status,续约,服务,String,isReplication,renew,instanceInfo,Eureka03,id
From: https://www.cnblogs.com/du001011/p/16885985.html

相关文章

  • samba服务器
    简介:   Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。samba是模仿Windows网上邻居的SMB的通讯协议,将Linux操作系统“假装成”Wind......
  • 微服务笔记之Eureka03
    服务注册接口源码分析:com.netflix.eureka.resources.ApplicationResource#addInstancepublicResponseaddInstance(InstanceInfoinfo,......
  • systemctl命令列出所有服务
    systemctl命令列出所有服务systemctl是Systemd的主命令,可用于管理系统。列出所有已经加载的systemdunitssystemctlsystemctl|grepdocker.service12列出所有service......
  • 服务注册模板
    主程序exe或者jar编写配置文件  注册为系统服务cmd文件运行程序目录(最好将运行程序名改为端口号)WinSW.NET4.exeinstall    ......
  • 深入浅出学习透析Nginx服务器的基本原理和配置指南「进阶实践篇」
    proxy_pass的疑问?很多小伙伴们跟我沟通说之前章节的介绍的proxy_pass介绍的并不是很详细和清晰,那么我们就针对于Nginxproxy_pass使用在进行复习回顾一下。proxy_pass的使......
  • Goravel 让微服务间通讯如此简单,省出来的时间想干点啥干点啥吧
    Goravel升级v1.4,使微服务间请求更加简单一体化。Nobb,showthecode.Goravel是一个功能完备、具有良好扩展能力的GolangWeb应用程序框架。风格与Laravel保持一......
  • 日ip过万用什么服务器?
    日ip过万用什么服务器?没真正用过的别瞎哔哔,错误博客日均万ip的实例告诉大家一万ip服务器配置到底应该怎么选。https://sh.tiancebbs.cn/mayi-info.xml https://sh.tianceb......
  • Gerrit 不使用代理服务的搭建配置
    1、前言Gerrit名声已很大了,我也就不在过多阐述介绍了,凡是需要安装搭建Gerrit服务器的,网上一搜索都是大把精彩教程。但是,基本都是基于代理服务的搭建安装,一种是基于apach......
  • 白嫖永久服务器1668309535005
    阿贝云服务器注册免费领取1核1g内存5m宽带10g内存的云服务器,对于个人来说完全够用了。还有免费备案和虚拟主机,免备案对于搭建个人博客就很方便,部署了小项目上去,运行流畅不......
  • 白嫖永久服务器1668309600001
    阿贝云服务器注册免费领取1核1g内存5m宽带10g内存的云服务器,对于个人来说完全够用了。还有免费备案和虚拟主机,免备案对于搭建个人博客就很方便,部署了小项目上去,运行流畅不......