文章目录

  • 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服务端并不会直接剔除所有已过期的服务,而是通过随机数的方式进行剔除,避免自我保护开启之前将所有的服务给剔除。

Eureka服务注册发现原理相关推荐

  1. 《微服务系列:Eureka服务注册发现中心》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  2. Eureka服务注册发现实例

    ** 一.搭建服务注册中心 1.通过idea新建一个spring boot工程,方法可参考Spring boot初体验.在依赖项选择的时候选择Cloud Discovery --Eureka Serv ...

  3. eureka 服务注册发现demo

    搭建服务提供方集群 将服务注册至eureka集群中,文中用到了http://euk1.com,是本地服务,需要修改hosts文件 127.0.0.1 euk1.com 127.0.0.1 euk2.c ...

  4. Spring-Cloud-Eureka服务注册发现中心server+client案列模拟说明

    Spring-Cloud概念理解 Eureka源码分析 Eureka简介及原理 上面三个博文链接大致扫一篇,在读一下下面我所阐述的,然后再回过头来细细翻看一下上面的三个博文,你会发现,原来如此 Eur ...

  5. 详解Eureka服务注册与发现和Ribbon负载均衡【纯理论实战】

    Eureka服务注册与发现 Eureka简介 在介绍Eureka前,先说一下CAP原则 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability ...

  6. SpringCloud[01]Eureka服务注册与发现

    文章目录 Eureka服务注册与发现 1. Eureka基础知识 1. 什么是服务治理 2. 什么是服务注册与发现 3. Eureka包含两个组件:**Eureka Server** 和 **Eure ...

  7. 跟着狂神学SpringCloud(Rest环境搭建+Eureka服务注册与发现+ribbon+Feign负载均衡+Hystrix+服务熔断+Zuul路由网关+SpringCloud config分布)

    跟着狂神学SpringCloud SpringCloud 回顾之前的知识- JavaSE 数据库 前端 Servlet Http Mybatis Spring SpringMVC SpringBoot ...

  8. 【夯实Spring Cloud】Spring Cloud中的Eureka服务注册与发现详解

    本文属于[夯实Spring Cloud]系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货.系列目录如下: [夯实Spring Cloud]D ...

  9. SpringCloud(三) Eureka之服务注册发现以及实现工程间调用

    概述:本章节将介绍Eureka客户端如何与EurekaServer端链接,以及生产者工程如何将服务注册到Eureka注册中心中去,消费者工程怎么从EurekaServer端获取生产者工程的服务地址,并 ...

最新文章

  1. Spring 注解的作用
  2. 上海交通大学python教材答案-上海交通大学python期末考试样题加解析.doc
  3. mysql 普通sql流程控制,【mysql的编程专题①】流程控制与其他语法
  4. 解决scala对象转化为json对象为{}
  5. ChipKill内存技术
  6. Data URL和图片,及Data URI的利弊
  7. java6 3_2018.3.6 Java web notes:
  8. BSTR与CString之前的转换
  9. luogu P1156 垃圾陷阱
  10. LeetCode 242 Valid Anagram
  11. ARM汇编书写格式及符号(symbol)和表达式(expr)
  12. 各种网线的分类和区别
  13. w3c html 检验器,如何在W3C验证器中验证HTML时获取徽章?
  14. JS基础到结束知识详细大汇总
  15. java如何找出勾股数组_勾股数组 学习笔记
  16. ZUCC_计算机系统原理实验_大作业 bomb 破解
  17. oracle怎么备份bak文件,[转载]如何将sqlserver的bak文件中的数据还原到oracle数据库中...
  18. 分布式任务xxl-job调度中心安装说明
  19. 2021年4月9日京东 2019校园招聘 Java开发工程师
  20. mysql在 union 与group by后order by排序混乱

热门文章

  1. RabbitMQ第五篇:Spring集成RabbitMQ
  2. 基于网络监听的摄像头遮挡检测
  3. 阿里7年技术员:SQL Server 下载安装教程
  4. u盘做成了启动盘后,如何复原
  5. 港科百创 | 思特威创始人徐辰校友:始于兴趣,忠于热爱
  6. 航天器动力学建模笔记
  7. CSS3之2D转换、3D转换
  8. EF从数据库更新模型时保留Model上的属性设定
  9. 中秋被各大厂的月饼秀到了!快和小编看看这些大厂到底发的什么月饼吧!!!不知道有没有被惊讶到的?
  10. 在C#中改变系统时间 得到系统时间改变通知