【源码】eureka server接受心跳信息过程解析

1.源码定位

eureka server 接收服务器请求的处理方法为:

com.netflix.eureka.resources.InstanceResource#renewLease

源码版本: v1.7x

源码地址:https://github.com/Netflix/eureka/tree/v1.7.x



2.请求处理流程

  1. 从eureka server的注册表 registery中获取服务列表 registry.get(appName);
  2. 判断服务实例是否存在 leaseToRenew ,不存在则需要注册
  3. 判断服务实例状态是否存在,不存在说明需要重新注册overriddenInstanceStatus
  4. 每份钟心跳数统计(剔除使用)
  5. 更新Lease 心跳的最新更新时间
  6. 根据isReplication状态判断是否需要同步到其他eureka server replicateToPeers


3.源码解析

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);
        }
        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);
								// 计算出来的服务实例状态为UNKNOEW 时,说明服务实例状态已被删除,需要重新注册
                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)) {
                    Object[] args = {
                            instanceInfo.getStatus().name(),
                            instanceInfo.getOverriddenStatus().name(),
                            instanceInfo.getId()
                    };
                    logger.info(
                            "The instance status {} is different from overridden instance status {} for instance {}. "
                                    + "Hence setting the status to overridden status", args);
                    // 覆盖状态
										instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);
                }
            }
						// 统计每分钟心跳数
            renewsLastMin.increment();
						// 服务实例心跳最后更新时间发布
            leaseToRenew.renew();
            return true;
        }
    }

public boolean renew(final String appName, final String id, final boolean isReplication) {
  if (super.renew(appName, id, isReplication)) {
      // 心跳续约成功则复制到其他对象上去
			replicateToPeers(Action.Heartbeat, appName, id, null, null, isReplication);
      return true;
  }
  return false;
}


4.小结

续约本身没有什么太多东西,就是修改注册表中Lease的续约时间,还有计算服务状态以及复制到集群其他节点。这里面比较有意思的一点竟然是服务状态计算使用了责任链模式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bWl8COfq-1622188515494)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d1374b07-cedc-4822-8989-2018c911bf53/07_.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢谷悠扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值