eureka源码解析——服务续约

阅读: 评论:0

eureka源码解析——服务续约

eureka源码解析——服务续约

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、续约源码解析
    • 1.1 InstanceResource#renewLease
    • 1.2 PeerAwareInstanceRegistryImpl#renew
      • 1.2.1 AbstractInstanceRegistry#renew
      • 1.2.2 PeerAwareInstanceRegistryImpl#replicateToPeers

前言

服务续约使用过心跳来实现了,客户端会开启一个定时任务,定时向eureka server发送续约请求,然后服务端收到续约信息然后更新租约的最后发送时间,在eureka server中也会开启一个定时任务,定时扫描注册表的实例租约信息,然后看最后续约时间距离现在是不是超过了存活时间(90s),如果超过了,就将这个实例从注册表中剔除

一、续约源码解析

1.1 InstanceResource#renewLease

客户端会发送续约请求,到服务端的处理接口就是renewLease接口,在这个接口中会调用注册表的renew方法来进行续约。

    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 = Name(), id, isFromReplicaNode);// Not found in the registry, immediately ask for a registerif (!isSuccess) {logger.warn("Not Found (Renew): {} - {}", Name(), id);return Response.status(Status.NOT_FOUND).build();}// Check if we need to sync based on dirty time stamp, the client// instance might have changed some valueResponse response;if (lastDirtyTimestamp != null && serverConfig.shouldSyncWhenTimestampDiffers()) {response = this.validateDirtyTimestamp(Long.valueOf(lastDirtyTimestamp), isFromReplicaNode);// Store the overridden status since the validation found out the node that replicates winsif (Status() == Response.Status.StatusCode()&& (overriddenStatus != null)&& !(InstanceStatus.UNKNOWN.name().equals(overriddenStatus))&& isFromReplicaNode) {registry.AppName(), id, InstanceStatus.valueOf(overriddenStatus));}} else {response = Response.ok().build();}logger.debug("Found (Renew): {} - {}; reply status={}", Name(), id, Status());return response;}

1.2 PeerAwareInstanceRegistryImpl#renew

  1. 调用父类的AbstractInstanceRegistryrenew方法,更新本地注册表实例租约信息
  2. 调用replicateToPeers方法将服务续约请求同步给集群的其他节点
    public boolean renew(final String appName, final String id, final boolean isReplication) {if (w(appName, id, isReplication)) {replicateToPeers(Action.Heartbeat, appName, id, null, null, isReplication);return true;}return false;}

1.2.1 AbstractInstanceRegistry#renew

这里就是更新注册表的租约信息,其实就是更新lastUpdateTimestamp

   public boolean renew(String appName, String id, boolean isReplication) {RENEW.increment(isReplication);// 根据 appName 找到对应的实例租约列表Map<String, Lease<InstanceInfo>> gMap = (appName);Lease<InstanceInfo> leaseToRenew = null;if (gMap != null) {// 通过实例id (instanceId 获取对应实例的租约信息)leaseToRenew = (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 = Holder();if (instanceInfo != null) {// ASGName());InstanceStatus overriddenInstanceStatus = OverriddenInstanceStatus(instanceInfo, leaseToRenew, isReplication);if (overriddenInstanceStatus == InstanceStatus.UNKNOWN) {logger.info("Instance status UNKNOWN possibly due to deleted override for instance {}"+ "; re-register required", Id());RENEW_NOT_FOUND.increment(isReplication);return false;}if (!Status().equals(overriddenInstanceStatus)) {logger.info("The instance status {} is different from overridden instance status {} for instance {}. "+ "Hence setting the status to overridden status", Status().name(),overriddenInstanceStatus.name(),Id());instanceInfo.setStatusWithoutDirty(overriddenInstanceStatus);}}// renew 计数,自我保护机制会用到renewsLastMin.increment();// 实例w();return true;}}//Lease#renewpublic void renew() {// 更新 lastUpdateTimestamplastUpdateTimestamp = System.currentTimeMillis() + duration;}

1.2.2 PeerAwareInstanceRegistryImpl#replicateToPeers

这里就是遍历集群所有的其他节点,然后将实例信息同步到其他节点。

    private void replicateToPeers(Action action, String appName, String id,InstanceInfo info /* optional */,InstanceStatus newStatus /* optional */, boolean isReplication) {Stopwatch tracer = Timer().start();try {if (isReplication) {numberOfReplicationsLastMin.increment();}// If it is a replication already, do not replicate again as this will create a poison replicationif (peerEurekaNodes == Collections.EMPTY_LIST || isReplication) {return;}for (final PeerEurekaNode node : PeerEurekaNodes()) {// If the url represents this host, do not replicate to yourself.if (peerEurekaNodes.ServiceUrl())) {continue;}//复制实例信息到其他节点replicateInstanceActionsToPeers(action, appName, id, info, newStatus, node);}} finally {tracer.stop();}}

本文发布于:2024-01-31 01:18:17,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170663509824305.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:源码   eureka
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23