Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

cc2570290824d9d0f637ac1f53438be2.png

作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行。

两种健康检查机制

Nacos 中提供了两种健康检查机制:

  1. 客户端主动上报机制。

  2. 服务器端反向探测机制。

如何理解这两种机制呢?想象⼀下这么⼀个场景,你所在的地区突然发生地质灾害,你被掩盖在废墟下面,搜救队必须要知道你在废墟里面,那么才能对你进行施救。那有什么方法可以让救援队知道你在废墟下面?

  • 第⼀种,你在废墟里面大喊 help! help! I am here! ,让搜救队知道你的位置和健康状态。

  • 第二种,搜救队使用了他们的专业检查设备,探测到你正埋在废墟下面。

以上这两种方法和 Nacos 的两种健康检查机制类似,也就是客户端主动上报机制,是客户端每隔一段时间,主动向 Nacos 服务器端上报自己的健康状况,而服务器端反向探测机制是 Nacos 服务器端来检测客户端是否健康。0b12b7f47cee2e27b9ba2bfd2738c92a.png

如何设置健康检查机制?

Nacos 中的健康检查机制不能主动设置,但健康检查机制是和 Nacos 的服务实例类型强相关的。也就是说 Nacos 中的两种服务实例分别对应了两种健康检查机制:

  1. 临时实例(也可以叫做非持久化实例):对应的是客户端主动上报机制。

  2. 永久实例(也可以叫做持久化实例):服务端反向探测机制。

为什么需要两种服务实例呢?以淘宝为例,双十一大促期间,流量会比平常高出很多,此时服务肯定需要增加更多实例来应对高并发,而这些实例在双十一之后就无需继续使用了,采用临时实例比较合适。而对于服务的一些常备实例,则使用永久实例更合适。

客户端主动上报机制

临时实例每隔 5 秒会主动上报一次自己的健康状况,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。如果心跳包的间隔时间超过了 15 秒,那么 Nacos 服务器端就会将此服务实例标记为非健康实例,如果心跳包超过了 30s 秒,那么 Nacos 服务器端将会把此服务实例从服务列表中删除掉。运行 Nacos 项目时,可以看到客户端主动上报心跳包的日志,如下图所示:18ba6d88eebafd9afd251596d7489e26.png从上述图片可以看出,Nacos 客户端会以每 5s 一次的频率来上报自己的健康情况,请求信息如下:

/nacos/v1/ns/instance/beat?app=unknown&namespaceId=public&port=8081&clusterName=DEFAULT&ip=192.168.3.72&serviceName=DEFAULT_GROUP@@spring-cloud-nacos-producer2

fd12d4ce75555be0f1a7c0b3fdbb8d9a.png


服务端反向探测机制

永久实例使用的服务器端反向探测的方式实现健康检查的,它的探测周期是 2000 毫秒 + 随机数(5000 毫秒以内),如果检测异常会将此服务实例,标记为非健康实例,但不会把服务实例向临时实例那样进行删除。Nacos 服务器反向探测目前内置了 3 种探测协议:HTTP 探测、TCP 探测和 MySQL 探测。⼀般而言 HTTP 和 TCP 探测已经可以涵盖绝大多数的健康检查场景,MySQL 主要用于特殊的业务场景,例如数据库的主备需要通过服务名对外提供访问,需要确定当前访问数据库是否为主库时,那么我们此时的健康检查接口,是⼀个检查数据库是否为主库的 MySQL 命令。0027f0305cb4b771127f1057975c57e2.png

TCP 探测

默认情况下,永久实例使用的是 TCP 探测,这点可以在 Nacos 控制台观察到,如下图所示:ea128a0289fae8eaad96fa75432a276e.png默认会使用 IP端口来检查,如下图所示:4e6d8ee58dad845f83cfaf36d61a34a4.pngTCP 探测的大体逻辑是通过与注册实例建立 channel,不断 ping 注册实例的端口,来判断实例是否健康。

HTTP 探测

HTTP 探测需要在 Nacos 控制台手动配置,如下图所示:28ca851378b2a18895b54778fefc86de.png我们在服务实例中添加探测接口的实现代码:610db7b0143efbffef87ef11141dc13b.png此时我们重新启动服务实例,在服务详情中可以看到我们配置的 HTTP 探测已经生效了,可以检查出实例是健康的,如下图所示:9ba3b26b7255f04375e587b4e852a139.pngNacos 服务器端通过检查 HTTP 的接口是否返回 200 状态码,来判断实例是否为健康状态。

集群下的健康检查机制

集群下的健康检查机制可以用一句话来概括,那就是“各司其职”。每个服务对应了一个主注册中心,当注册中心接收到临时实例的心跳包之后,将健康状态同步给其他注册中心。而永久实例也是类似的,每个服务对应了一个主注册中心,当负责的注册中心探测到服务实例的健康状态发生改变时,再会将实例的健康状况同步到其他注册中心,从而实现了集群下的健康检查机制。d88514223f288718352893ec75d9aa91.png

总结

Nacos 中提供了两种健康检查机制:临时实例的客户端主动上报机制和永久实例的服务端反向探测机制。临时实例每隔 5s 发送一个心跳包给 Nacos 服务器端,服务器端接收到心跳包之后再将健康状况同步给其他注册中心。永久实例支持 3 种探测协议,TCP、HTTP 和 MySQL,默认探测协议为 TCP,也就是通过不断 ping 的方式来判断实例是否健康。

参考 & 鸣谢

《Nacos框架与原理》

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java中文社群

Java面试合集:https://gitee.com/mydb/interview

5f5cb28d13ed6c9cf4db77c73f33af55.gif

往期推荐

ad2f8324b3fcae021760046d3ddcc878.png

玩转Nacos参数配置!多图勿点


2fdc78ee973e6dc20a05d786c04b3476.png

芭比扣了!Nacos中服务删除不了,肿么办?


f11ac5ea30ac248c597bf02308d5b662.png

Spring Cloud Alibaba Nacos路由策略之保护阈值!



求点赞、在看、分享三连fb9a4f990b4caefc513c9899f792b18c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Python中使用一个元素创建一个元组

Its not simple to create a tuple with one element, if we try to create a tuple with parenthesis or without parenthesis, tuple will not be created. 创建具有一个元素的元组并不简单,如果我们尝试创建带有括号或不带括号的元组,则不会创建元组。…

Python之包管理工具

在Python环境中已经有很多成熟的包,可以通过安装这些包来扩展我们的程序。 例如,很多时候Python开发人员都会去PyPI网站去查找自己想要使用的包,然后进行安装。PyPI ( Python Package Index)是获得第三方 Python 软件包…

为什么wait和notify必须放在synchronized中?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调用了 notify 或 notify…

java字符串转字符串列表_Java中的字符串列表示例

java字符串转字符串列表We have to read total number string i.e. "n", create a list of the Strings and input "n" strings, add then to print the all stings of the list in Java. 我们必须读取总数字符串,即“ n”,创建字符…

聊聊并发编程的10个坑

前言对于从事后端开发的同学来说,并发编程肯定再熟悉不过了。说实话,在java中并发编程是一大难点,至少我是这么认为的。不光理解起来比较费劲,使用起来更容易踩坑。不信,让继续往下面看。今天重点跟大家一起聊聊并发编…

macbook终端使用记(二)终端快捷键

为什么80%的码农都做不了架构师?>>> Command K清屏 Command T新建标签 Command M最小化窗口 Command W 关闭当前标签页 Command S 保存终端输出 Command D 垂直分隔当前标签页 Command Shift D 水平分隔当前标签页 Command shift {或}向左/向…

uint32_t 是常数吗_UINT_MAX常数,带C ++示例

uint32_t 是常数吗C UINT_MAX宏常量 (C UINT_MAX macro constant) UINT_MAX constant is a macro constant which is defied in climits header, it is used to get the minimum value of an unsigned int object, it returns the minimum value that an unsigned int object …

颜值爆表!Redis 官方可视化工具来啦,功能真心强大!

最近逛了一下Redis官方网站,发现Redis不仅推出了很多新特性,而且还发布了一款可视化工具RedisInsight。试用了一下感觉非常不错,最关键的是能支持RedisJSON之类的新特性,这是第三方工具无法比拟的。今天带大家体验一下RedisInsigh…

20个响应式网页设计中的“神话”误区

关于响应式网页的重要性我们已经证实了很长时间了,现在是该把焦点放到如何做出好的响应式网页设计的时候了。一起来看看吧! 虽然很多人都在谈论响应式网页,但并不是每个人都知道他们在说什么。很多时候你看到网上的一些信息也在挑战你对响应式…

char 类型的常数_CHAR_MAX常数,带C ++示例

char 类型的常数C CHAR_MAX宏常量 (C CHAR_MAX macro constant) CHAR_MAX constant is a macro constant which is defied in climits header, it is used to get the maximum value of a char object, it returns the maximum value that a char object can store, which is …

MySQL 索引失效的 15 种场景!

背景 无论你是技术大佬,还是刚入行的小白,时不时都会踩到Mysql数据库不走索引的坑。常见的现象就是:明明在字段上添加了索引,但却并未生效。前些天就遇到一个稍微特殊的场景,同一条SQL语句,在某些参数下生效…

如何对手机使用adb

因为要配合前端做测试,所以我需要在本机中安装adb驱动,以便可以连接手机进行各种操作。 好吧。。。装adb驱动这块当时我没有把流程给做记录。。。郁闷,下次再安装的时候再谷歌吧。 使用的简单脚本就是 有没有连接设备:adb devices…

scala 转换为字符串_如何在Scala中将字符串转换为布尔值?

scala 转换为字符串String in Scala is a sequence of characters. In Scala, the String object is immutable. Scala中的String是一个字符序列。 在Scala中,String对象是不可变的。 Example: 例: String("includehelp.com")A Boolean is a…

Java夺命21连问!(附答案)

大家好,我是磊哥。有位朋友工作三年,去面试,给大家整理一下面试题,并附上答案。Mysql索引在什么情况下会失效MySql的存储引擎InnoDB与MyISAM的区别Mysql在项目中的优化场景,慢查询解决等Mysql有什么索引,索…

固有属性与自定义属性

javascript有两个很相近的东西,property与attribute,懒一点的人都翻译成“属性”。 如果专业点,则区别为“属性”与“特性”。我认为叫做固有属性与自定义属性比较好一点。 property是来自于原型链,所有HTML元素,都是H…

weakhashmap_Java WeakHashMap get()方法与示例

weakhashmapWeakHashMap类的get()方法 (WeakHashMap Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to get the value to which the given key element (key_ele) associated in this map otherw…

SpringCloud Nacos + Ribbon 调用服务的 2 种方法!

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)在 Nacos 中,服务调用主要是通过 RestTemplate Ribbon 实现的,RestTemplate 是 Spring 提供的 Rest…

转:阅读代码

程序员阅读源码是一种什么心态?源码对编程意义何在?如何才能更好阅读代码?转载于:https://www.cnblogs.com/kira2will/p/4777090.html

strictmath_Java StrictMath rint()方法与示例

strictmathStrictMath类rint()方法 (StrictMath Class rint() method) rint() Method is available in java.lang package. rint()方法在java.lang包中可用。 rint() Method is used to return the double type value and if the value of the given argument after decimal po…

在Linux下查看环境变量

原文地址:http://blog.chinaunix.net/uid-25124785-id-77098.html 有时候在编写makefile的时候,自己都不清楚有些变量是什么,也不清楚如何查看,于是感觉有必要在这里写一篇环境变量查看的博文。 如果你想查看某一个名称的环境变量…