当前位置: 首页 > news >正文

Eureka服务注册发现原理

文章目录

    • Eureka服务注册发现原理
      • 客户端启动时如何注册到服务端
      • 服务端存储客户端信息
      • 心跳机制和服务剔除机制

Eureka服务注册发现原理

客户端启动时如何注册到服务端

Eureka客户端在启动时,首先会创建心跳的定时任务,默认每隔30s向向服务端发送心跳请求,服务端对心跳做出响应。如果响应状态码是404,表示服务端并没有该客户端的服务信息,那么客户端就会向服务端发送注册请求,注册信息包括服务名、IP端口、实例ID等信息。

//DiscoveryClient.java
//定时任务线程池默认有两个任务,一个用来心跳检测,一个用来刷新缓存
scheduler = Executors.newScheduledThreadPool(2, new ThreadFactoryBuilder()
   .setNameFormat("DiscoveryClient-%d").setDaemon(true).build());
//心跳检测线程池:核心线程1个,EurekaClientConfigBean中默认配置最大心跳线程2个
heartbeatExecutor = new ThreadPoolExecutor(1, 	clientConfig.getHeartbeatExecutorThreadPoolSize(), 0, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(),
            new ThreadFactoryBuilder()
            .setNameFormat("DiscoveryClient-HeartbeatExecutor-%d")
            .setDaemon(true)
            .build()
);  
//缓存刷新线程池
cacheRefreshExecutor = new ThreadPoolExecutor(1, clientConfig.getCacheRefreshExecutorThreadPoolSize(), 0, TimeUnit.SECONDS,
            new SynchronousQueue<Runnable>(),
            new ThreadFactoryBuilder()
            .setNameFormat("DiscoveryClient-CacheRefreshExecutor-%d")
            .setDaemon(true)
            .build()
        ); 
//...       
//初始化所有的调度任务
initScheduledTasks();
//...
//DiscoveryClient#initScheduledTasks
//客户端默认shouldFetchRegistry为true,注册缓存刷新定时器,定时刷新缓存
//默认shouldRegistryWithEureka为true,定时调用心跳线程
private class HeartbeatThread implements Runnable {
    public void run() {
        if (renew()) {
            lastSuccessfulHeartbeatTimeStamp = = System.currentTimeMillis();
        }
    }
}

boolean renew() {
    EurekaHttpResponse<InstanceInfo> httpResponse;
    try {
        httpResponse = eurekaTransport.registrationClient.sendHeartBeat(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null);
        logger.debug(PREFIX + "{} - Heartbeat status: {}", appPathIdentifier, httpResponse.getStatusCode());
        if (httpResponse.getStatusCode() == Status.NOT_FOUND.getStatusCode()) {
            REREGISTER_COUNTER.increment();
            logger.info(PREFIX + "{} - Re-registering apps/{}", appPathIdentifier, instanceInfo.getAppName());
            long timestamp = instanceInfo.setIsDirtyWithTime();
            boolean success = register();
            if (success) {
                instanceInfo.unsetIsDirty(timestamp);
            }
            return success;
        }
        return httpResponse.getStatusCode() == Status.OK.getStatusCode();
    } catch (Throwable e) {
        logger.error(PREFIX + "{} - was unable to send heartbeat!", appPathIdentifier, e);
        return false;
    }
}	

服务端存储客户端信息

//AbstractInstanceRegistry#register方法把服务实例信息InstanceInfo注册到了ConcurrentHashMap中

###客户端获取服务端信息

客户端通过刷新缓存的定时任务拉取服务端的服务信息,每次拉取后刷新本地已保存的信息。

心跳机制和服务剔除机制

心跳机制:客户端启动后,定时任务默认每隔30s向服务端发送心跳数据保持活跃。

服务剔除机制:如果开启了自我保护机制,所有的服务都不会被剔除;如果未开启自我保护机制,那么将判断最后一分钟收到的心跳数与前一分钟收到的心跳数临界值比较,如果前者大于后者,且后者大于零则启用服务剔除机制。一旦开启了服务剔除机制,Eureka服务端并不会直接剔除所有已过期的服务,而是通过随机数的方式进行剔除,避免自我保护开启之前将所有的服务给剔除。

相关文章:

  • RK3399平台开发系列讲解(中断篇)中断控制器驱动初始化
  • 【Redis】Redis的持久化
  • LibreOJ_10010
  • 数据增强
  • 一文搞懂堆外内存(模拟内存泄漏)
  • 还在调API写所谓的AI“女友”,唠了唠了,教你基于python咱们“new”一个(深度学习)
  • Win7纯净版系统镜像64位介绍
  • Kali系统MSF模块暴力破解MySQL弱口令漏洞
  • [附源码]java毕业设计疫情环境下的酒店管理系统
  • kafka配置外网访问
  • java每一练(3)
  • Java学习----前端4
  • ABAP中 delete 语句的使用
  • cesium火箭发射,模型控制,模型动画,模型移动
  • http请求走私漏洞原理,利用,检测,防护
  • Docker学习(3)—— 将容器转化为新的镜像,并将新镜像发布到阿里云公共仓库或私有仓库
  • cpu天梯图2022年11月 cpu排行榜天梯图2022
  • Linux的基本协议与他的堂兄堂弟
  • FEDformer 代码分析(2)
  • UCloud 对象存储使用
  • 细粒度图像分类论文研读-2017
  • [深度学习] python基础支持汇总
  • JSP文件上传
  • [附源码]计算机毕业设计校园服装租赁系统Springboot程序
  • 详解C语言二级指针三种内存模型
  • List——顺序表与链表(二)
  • 太原乐山燃气锅炉_斯大燃气热水锅炉控制器
  • 生物质环保节能锅炉_十吨生物质锅炉
  • 山东电蒸汽发生器厂家_清洗机蒸汽发生器