Eureka中的心跳机制
前言
从以前的单体架构到现在的微服务分布式架构, 随着架构的演变, 所需要的技术越来越多, 要求的也越来越多了, 今天来谈一下微服务领域中的心跳机制
在微服务领域,心跳机制很常见了, 比如Eureka. Nacos中的客户端和服务端的服务续约, Redis的主从复制等
本文主要来谈一下Eureka中的服务续约机制来展示心跳机制实现
对于Eureka, 会涉及到两个端, 一个客户端, 一个服务端. 客户端就相当于我们的微服务: 订单服务, 商品服务等. 而服务端就是指Eureka注册中心的这个服务, 而保持续约就是客户端在相隔一段时间内向服务端发送一次心跳, 告诉Eureka一个自己的状态是存活的
主要知识点
- 谁发送的心跳请求?
- 多久发送一次?
- 如何发送?
- 如何接收心跳请求?
- 接收了之后做了什么?
谁发送的心跳请求
Eureka采用的是客户端向服务端发送心跳请求, 如下图:
上图中左边三个客户端都已经注册到了Eureka服务端上, 之后每个微服务都会自己单独发送心跳请求到注册中心
多久发送一次
客户端进行初始化时, 会调度一些定时任务, Eureka初始化了发送了心跳请求的线程池heartbeatExecutor, 用来创建发送心跳的线程HeartbeatThread, 如下图:
线程池有核心参数 :
- maximumPoolSize:最大线程数, 线程池允许创建的最大线程数
- corePoolSize:核心线程数。当提交一个任务到线程池时,线程池会创建一个线程来执行任务, 即使其他空闲的核心线程能够执行新任务也会创建线程, 等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的 prestartAllCoreThreads() 方法, 则线程池会提前创建并启动所有基本线程
- keepAliveTime:线程活动保持时间, 线程池的工作线程空闲后, 保持存活的时间
- runnableTaskQueue:任务队列, 用于保存等待执行的任务的阻塞队列。有四种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue
利用此线程池来执行定时调度任务, 在定时任务开始后, 延迟30s开始执行发送心跳请求, 然后每隔30s发送一次心跳请求
如何发送心跳请求
HeartbeatThread类实现了Runnable类的run方法, 这个里面有执行发送心跳的具体逻辑
进入 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;
}
这个实例其实是从服务端注册表 registry 中拿到的, 它是一个ConcurrentHashMap, 实例名当做 key, 来获取value(实例), 也就是说实例信息是存在内存中的
拿到的是一个 Lease 实例, 数据结构是这样的:Lease, 它有一个 volatile 修饰的字段 lastUpdateTimestamp。通过更新这个字段来记录实例信息确实存活着在, 而且刚刚还跟 Eureka 通信了。
那么有了这个字段更新, Eureka Server 自身还会有个定时任务, 去检查服务实例的最后更新时间, 如果过期了, 则认为该实例状态异常, 需要进行服务下线。
本文到此结束
Eureka中的心跳机制相关推荐
- 这样讲 Netty 中的心跳机制,还有谁不会?
作者:永顺 segmentfault.com/a/1190000006931568 基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, ...
- Netty 中的心跳机制
何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, ...
- 基于Windows Socket 的网络通信中的心跳机制原理
引言 在采用TCP 连接的C/S 结构的系统中,当通信的一方正常关闭或退出时,另一方能收到相应的连接 断开的通知,然后进行必要的处理:但如果任意一方发生所谓的"非优雅断开",如:意 ...
- 聊聊分布式存储系统中的心跳机制以及主节点下发指令给从节点
心跳( heartbeat )是分布式系统中常用的技术.顾名思义,心跳就是以固定的频率向其他节点汇报当前节点状态的方式.收到心跳,一般可以认为发送心跳的这个节点在当前的网络中状态是良好的. 同时分布式 ...
- vue 心跳监控_【笔记】vue中websocket心跳机制
data () { return { ws: null,//建立的连接 lockReconnect: false,//是否真正建立连接 timeout: 28*1000,//30秒一次心跳 timeo ...
- 面试官问:服务的心跳机制与断线重连,Netty底层是怎么实现的?懵了
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, ...
- Netty实现心跳机制与断线重连
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...
- socket心跳机制图片_socket心跳包机制
心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包 心跳包的作用 网络中的接收和发送数据都是使用SOCKET进行实现.但 ...
- hadoop之MapReduce框架TaskTracker端心跳机制分析(源码分析第六篇)
1.概述 MapReduce框架中的master/slave心跳机制是整个集群运作的基础,是沟通TaskTracker和JobTracker的桥梁.TaskTracker周期性地调用心跳RPC函数,汇 ...
最新文章
- 所有库在门不显示封装_奈雪和石库门在一起,太上头
- 32位微型计算机quot;中的32指的是,《计算机应用基础作业一).doc
- 重读ORB_SLAM之Tracking线程难点
- 可视化篇(四)——— python绘制双y轴、箱线图、概率分布三种图形及案例
- python学习-装饰器(可变参装饰器、完善装饰器)
- CVTE2016校招试题摘选
- linux下printf函数为什么不加\n就不能输出相关的内容 ?
- dell服务器r730老自动重启_Dell R730服务器安装windows server 2008 R2蓝屏问题
- java 字符串常量_Java字符常量详解
- php简单排课_基于PHP+MYSOL教务排课系统的设计与实现.pdf
- Arcgis培训内容
- 货币单位PHP,PHP实现货币换算的方法_PHP
- 在Centos6/RHEL6上恢复ext4文件系统下误删除的文件
- 【2019保研经验】清华贵系、清华软院、北大叉院、中科院自动化所等
- 带倍速音频播放器_带有播放列表HTML5音频播放器
- 淘宝买二级c语言题库可以嘛,大学计算机二级考试(C语言)试题在哪可以买?...
- python 之mechanize
- PHP学习-3 端口开放
- android闹钟哪个好用,谁才是轻便实用好闹钟 Android闹钟类应用横评
- yaffs2裸机移植