python eureka服务发现_Eureka - 服务发现

本文深入探讨Eureka客户端的服务发现机制,包括定时任务TimedSupervisorTask的运行原理,服务发现过程中的全量和增量获取策略。在定时任务中,当调用超时时,延迟时间会翻倍但不超过最大值。服务发现根据配置或状态决定执行全量或增量更新,通过与服务器交互获取应用信息,并处理新增、修改和删除实例。
摘要由CSDN通过智能技术生成

在Eureka - Client服务启动我们看到,注册表获取的地方有两个,一个是EurekaClient构造函数,一个是定时器每隔30秒去获取。我们先看看定时器TimedSupervisorTask的run方法

定时器

这个方法有三个比较重要的参数,timeoutMillis、delay、maxDelay。比如频率是30s,那这个maxDelay就是30*10=300s(这个10的来源参考上一篇),delay在这里是每次都翻倍,但是不能比maxDelay大。

整个设计思路是,如果调用30s超时,那就用60秒,如果再超时,就一直翻,但是不能超过300s。如果在后面的调用中正常了,那delay就恢复到30s,下次超时继续翻倍。@Override

public void run() {

Future> future = null;

try {

// 执行任务

future = executor.submit(task);

threadPoolLevelGauge.set((long) executor.getActiveCount());

// 指定超时时间

future.get(timeoutMillis, TimeUnit.MILLISECONDS); // block until done or timeout

//设置delay

delay.set(timeoutMillis);

threadPoolLevelGauge.set((long) executor.getActiveCount());

successCounter.increment();

} catch (TimeoutException e) {

logger.warn("task supervisor timed out", e);

timeoutCounter.increment();

// 获取delay

long currentDelay = delay.get();

// maxDelay和currentDelay的2倍中取最小值

long newDelay = Math.min(maxDelay, currentDelay * 2);

// 设置为上面最小值

delay.compareAndSet(currentDelay, newDelay);

} catch (RejectedExecutionException e) {

// 其他的略

rejectedCounter.increment();

} catch (Throwable e) {

// 其他的略

throwableCounter.increment();

} finally {

if (future != null) {

future.cancel(true);

}

// 把任务放入定时器,时间是delay

if (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值