请选择 进入手机版 | 继续访问电脑版

Eureka server启动流程图和源码分析

[复制链接]
茂忠想你 发表于 2021-1-2 12:11:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
Eureka server启动流程图和源码分析

流程图


源码剖析

由流程图看出,Eureka server启动时会做两件事
1.服务同步

因为eureka服务可以搭建集群,所以每个服务节点启动时,会从相邻的eureka节点中同步实例数据,源码如下:
  1. @Override    public int syncUp() {        // Copy entire entry from neighboring DS node        int count = 0;        //当我们设置register-with-eureka: true时候,getRegistrySyncRetries的返回值为5        for (int i = 0; ((i < serverConfig.getRegistrySyncRetries()) && (count == 0)); i++) {            if (i > 0) {                try {                    //从第二次开始,休眠30秒                    Thread.sleep(serverConfig.getRegistrySyncRetryWaitMs());                } catch (InterruptedException e) {                    logger.warn("Interrupted during registry transfer..");                    break;                }            }            //eurekaClient是当前节点的最近一个节点,在启动时会初始化            Applications apps = eurekaClient.getApplications();            //循环节点上的实例            for (Application app : apps.getRegisteredApplications()) {                for (InstanceInfo instance : app.getInstances()) {                    try {                        if (isRegisterable(instance)) {                            //将实例同步到本地内存                            register(instance, instance.getLeaseInfo().getDurationInSecs(), true);                            count++;                        }                    } catch (Throwable t) {                        logger.error("During DS init copy", t);                    }                }            }        }        return count;    }
复制代码
固然,若我们的eureka服务为单机的话,可以设置以下设置
  1. eureka:  client:    fetch-registry: false   #是否把eureka服务当成client注册到设置中心    register-with-eureka: false  #eureka服务是否需要读取设置中心的实例
复制代码
2.服务剔除

当完成服务同步后,eureka会开启服务剔除的定时任务,源码如下:
  1. protected void postInit() {        renewsLastMin.start();        if (evictionTaskRef.get() != null) {            evictionTaskRef.get().cancel();        }        evictionTaskRef.set(new EvictionTask());        //执行java Timer 定时器任务        evictionTimer.schedule(evictionTaskRef.get(),                serverConfig.getEvictionIntervalTimerInMs(), //60秒后执行任务,可设置                serverConfig.getEvictionIntervalTimerInMs()); //每次执行完任务后,隔断60秒再执行一次    }
复制代码
EvictionTask实现了Runnable方法,其run方法会调用evict方法,evict方法源码如下
  1. //additionalLeaseMs为当前时间public void evict(long additionalLeaseMs) {        logger.debug("Running the evict task");        if (!isLeaseExpirationEnabled()) {            logger.debug("DS: lease expiration is currently disabled.");            return;        }        // We collect first all expired items, to evict them in random order. For large eviction sets,        // if we do not that, we might wipe out whole apps before self preservation kicks in. By randomizing it,        // the impact should be evenly distributed across all applications.        List expiredLeases = new ArrayList();        //循环实例        for (Entry groupEntry : registry.entrySet()) {            Map leaseMap = groupEntry.getValue();            if (leaseMap != null) {                for (Entry leaseEntry : leaseMap.entrySet()) {                    Lease lease = leaseEntry.getValue();                    //如果该实例最后一次心跳续约记载日期与当前时间隔断大于90秒,则add到List,后续执行剔除使用                    if (lease.isExpired(additionalLeaseMs) && lease.getHolder() != null) {                        expiredLeases.add(lease);                    }                }            }        }        // To compensate for GC pauses or drifting local time, we need to use current registry size as a base for        // triggering self-preservation. Without that we would wipe out full registry.        //设置最大剔除数量        int registrySize = (int) getLocalRegistrySize();        int registrySizeThreshold = (int) (registrySize * serverConfig.getRenewalPercentThreshold());        int evictionLimit = registrySize - registrySizeThreshold;        int toEvict = Math.min(expiredLeases.size(), evictionLimit);        if (toEvict > 0) {            logger.info("Evicting {} items (expired={}, evictionLimit={})", toEvict, expiredLeases.size(), evictionLimit);            //随机剔除实例            Random random = new Random(System.currentTimeMillis());            for (int i = 0; i < toEvict; i++) {                // Pick a random item (Knuth shuffle algorithm)                int next = i + random.nextInt(expiredLeases.size() - i);                Collections.swap(expiredLeases, i, next);                Lease lease = expiredLeases.get(i);                String appName = lease.getHolder().getAppName();                String id = lease.getHolder().getId();                EXPIRED.increment();                logger.warn("DS: Registry: expired lease for {}/{}", appName, id);                internalCancel(appName, id, false);            }        }    }
复制代码
来源:https://blog.csdn.net/qq_34210372/article/details/112024449
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )