Eureka中的心跳机制

这篇具有很好参考价值的文章主要介绍了Eureka中的心跳机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        从以前的单体架构到现在的微服务分布式架构, 随着架构的演变, 所需要的技术越来越多, 要求的也越来越多了, 今天来谈一下微服务领域中的心跳机制
        在微服务领域,心跳机制很常见了, 比如Eureka. Nacos中的客户端和服务端的服务续约, Redis的主从复制等
        本文主要来谈一下Eureka中的服务续约机制来展示心跳机制实现
        对于Eureka, 会涉及到两个端, 一个客户端, 一个服务端. 客户端就相当于我们的微服务: 订单服务, 商品服务等. 而服务端就是指Eureka注册中心的这个服务, 而保持续约就是客户端在相隔一段时间内向服务端发送一次心跳, 告诉Eureka一个自己的状态是存活的
 

主要知识点
  • 谁发送的心跳请求?
  • 多久发送一次?
  • 如何发送?
  • 如何接收心跳请求?
  • 接收了之后做了什么?
     

谁发送的心跳请求

Eureka采用的是客户端向服务端发送心跳请求, 如下图:
eureka心跳机制,中间件,eureka,java,spring cloud
上图中左边三个客户端都已经注册到了Eureka服务端上, 之后每个微服务都会自己单独发送心跳请求到注册中心
 

多久发送一次

        客户端进行初始化时, 会调度一些定时任务, Eureka初始化了发送了心跳请求的线程池heartbeatExecutor, 用来创建发送心跳的线程HeartbeatThread, 如下图:
eureka心跳机制,中间件,eureka,java,spring cloud
线程池有核心参数 :

  1. maximumPoolSize:最大线程数, 线程池允许创建的最大线程数
  2. corePoolSize:核心线程数。当提交一个任务到线程池时,线程池会创建一个线程来执行任务, 即使其他空闲的核心线程能够执行新任务也会创建线程, 等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的 prestartAllCoreThreads() 方法, 则线程池会提前创建并启动所有基本线程
  3. keepAliveTime:线程活动保持时间, 线程池的工作线程空闲后, 保持存活的时间
  4. runnableTaskQueue:任务队列, 用于保存等待执行的任务的阻塞队列。有四种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue
     
    利用此线程池来执行定时调度任务, 在定时任务开始后, 延迟30s开始执行发送心跳请求, 然后每隔30s发送一次心跳请求
     

如何发送心跳请求

        HeartbeatThread类实现了Runnable类的run方法, 这个里面有执行发送心跳的具体逻辑
eureka心跳机制,中间件,eureka,java,spring cloud
进入 renew 方法中 ,核心逻辑就这一行

eurekaTransport.registrationClient.sendHeartBeat(
    instanceInfo.getAppName(), 
    instanceInfo.getId(), 
    instanceInfo, 
    null);

调用 EurekaHttpClient 的 sentHeartBeat 方法, 将实例信息发送给注册中心。

拼接的请求URL示例如下:

http://localhost:8080/v2/apps/order/i-000000-1

而且这个请求是个PUT请求。
 

如何接收心跳请求的

        从客户端发起心跳请求之后, 服务端就要接收这个请求了
负责接受请求的类为 ApplicationsResource,它相当于 MVC 中的Controller。
        根据请求的 URL 格式和请求方式(PUT),我们可以找到服务端的方法为InstanceResource.renewLease()。

ApplicationsResource->ApplicationResource->InstanceResource

 

接收后做了什么

        里面的核心代码就是 renew 方法, 将实例的一个字段给更新了, 这个字段叫做 ‘lastupdateTimestamp’, 也就是最后更新时间。

public void renew() {
    lastUpdateTimestamp = System.currentTimeMillis() + duration;
}

 
eureka心跳机制,中间件,eureka,java,spring cloud
        这个实例其实是从服务端注册表 registry 中拿到的, 它是一个ConcurrentHashMap, 实例名当做 key, 来获取value(实例), 也就是说实例信息是存在内存中的
        拿到的是一个 Lease 实例, 数据结构是这样的:Lease, 它有一个 volatile 修饰的字段 lastUpdateTimestamp。通过更新这个字段来记录实例信息确实存活着在, 而且刚刚还跟 Eureka 通信了。
        那么有了这个字段更新, Eureka Server 自身还会有个定时任务, 去检查服务实例的最后更新时间, 如果过期了, 则认为该实例状态异常, 需要进行服务下线。
 
本文到此结束文章来源地址https://www.toymoban.com/news/detail-571381.html

到了这里,关于Eureka中的心跳机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生进阶之PaaS中间件】第四章RabbitMQ-4.1-原理机制与进阶特性

    1.客户端连接到消息队列服务器,打开一个Channel。 2.客户端声明一个Exchange,并设置相关属性。 3.客户端声明一个Queue,并设置相关属性。 4.客户端使用Routing key,在Exchange和Queue之间建立好绑定关系。 5.客户端投递消息到Exchange。 6.Exchange接收到消息后,就根据消息的key和已经

    2024年02月21日
    浏览(51)
  • Java 缓存中间件

    :Spring Cache、J2Cache、JetCache JSR107 中制订了 Java 缓存的规范。 因此,在很多缓存框架、缓存库中,其 API 都参考了 JSR 107 规范。 img Java Caching 定义了 5 个核心接口 CachingProvider - 定义了创建、配置、获取、管理和控制多个 CacheManager 。一个应用可以在运行期访问多个 Cac

    2024年02月04日
    浏览(48)
  • 使用开源中间件:云计算环境中的中间件采用开源框架,可以减少开发和部署时间,提高开发效率和可靠性。

    作者:禅与计算机程序设计艺术 云计算是一个新的分布式计算模型,具有独特的特征。它把资源的虚拟化、弹性伸缩和按需付费等能力集成到了一起。这种新型的分布式计算模式,使得软件工程师们在编写应用程序时无须担心服务器性能,而只需要关注应用本身。同时,云平

    2024年02月04日
    浏览(62)
  • Java中间件-Elasticsearch

    Elasticsearch 是一个非常强大的搜索引擎。它目前被广泛地使用于各个 IT 公司。Elasticsearch 是由 Elastic 公司创建。它的代码位于 GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine。目前,Elasticsearch 是一个免费及开放(free and open)的项目。同时,Elastic 公司也拥有

    2023年04月27日
    浏览(48)
  • 【Java中间件】RocketMQ

    Message Queue,是一种提供消息队列服务的中间件。提供了消息生产、存储、消费全过程API的软件系统。 MQ的作用 限流削峰:当用户发送超量请求时,将请求暂存,以便后期慢慢处理。如果不使用MQ暂存直接请求到业务系统中容易引起系统崩溃。 异步解耦:若上游系统和下游系

    2024年02月15日
    浏览(45)
  • Java高可用监控中间件

    Prometheus是一个开源的系统监控和警报工具集,用于收集、存储和查询时间序列数据。 它支持多种数据源,可以监控分布式系统的各种指标,并提供强大的查询语言和灵活的警报规则。 Grafana是一个开源的可视化监控和分析平台,可以与多个数据源集成,包括Prometheus、InfluxD

    2024年01月23日
    浏览(47)
  • 【云原生技术】云计算中的数据库中间件简介

    云计算中的数据库中间件是位于客户端和数据库服务器之间的软件层,提供数据库操作的抽象、管理、优化和扩展功能。这些中间件可以简化数据库的管理,提高性能和安全性,同时使应用程序更容易与数据库进行交互。 主要功能 连接池管理 : 管理数据库连接,提供连接池

    2024年01月22日
    浏览(63)
  • 【Java面试丨消息中间件】Kafka

    1. 介绍 使用kafka在消息的收发过程都有可能会出现消息丢失 (1)生产者发送消息到broker丢失 (2)消息在broker中存储丢失 (3)消费者从broker接收消息丢失 2. 生产者发送消息到broker丢失 设置异步发送:同步发送会发生阻塞,一般使用异步发送方式发送消息 消息重试:由于网

    2024年02月11日
    浏览(47)
  • 远程方法调用中间件Dubbo在spring项目中的使用

    作者: 逍遥Sean 简介:一个主修Java的Web网站游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! Dubbo是一个高性能分布式服务的Java RPC框架,它可以可以帮助实现不同应用之间的远程调用

    2024年02月10日
    浏览(44)
  • 深入理解Java消息中间件-组件-消息队列

    引言: 消息中间件在现代分布式系统中扮演着至关重要的角色,它解决了系统之间异步通信和解耦的需求。而在消息中间件的架构中,核心组件之一就是消息队列。本文将深入探讨消息队列的架构组件,帮助读者加深对消息中间件的理解和应用。 一、什么是消息队列 消息队列

    2024年04月27日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包