Spring Cloud Alibaba Nacos 的 2 种健康检查机制!
作者 | 磊哥
来源 | Java中文社群(ID:javacn666)
转载请联系授权(微信ID:GG_Stone)
Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健康的服务实例,最终保证了业务系统能够正常的执行。
两种健康检查机制
Nacos 中提供了两种健康检查机制:
客户端主动上报机制。
服务器端反向探测机制。
如何理解这两种机制呢?想象⼀下这么⼀个场景,你所在的地区突然发生地质灾害,你被掩盖在废墟下面,搜救队必须要知道你在废墟里面,那么才能对你进行施救。那有什么方法可以让救援队知道你在废墟下面?
第⼀种,你在废墟里面大喊 help! help! I am here! ,让搜救队知道你的位置和健康状态。
第二种,搜救队使用了他们的专业检查设备,探测到你正埋在废墟下面。
以上这两种方法和 Nacos 的两种健康检查机制类似,也就是客户端主动上报机制,是客户端每隔一段时间,主动向 Nacos 服务器端上报自己的健康状况,而服务器端反向探测机制是 Nacos 服务器端来检测客户端是否健康。
如何设置健康检查机制?
Nacos 中的健康检查机制不能主动设置,但健康检查机制是和 Nacos 的服务实例类型强相关的。也就是说 Nacos 中的两种服务实例分别对应了两种健康检查机制:
临时实例(也可以叫做非持久化实例):对应的是客户端主动上报机制。
永久实例(也可以叫做持久化实例):服务端反向探测机制。
为什么需要两种服务实例呢?以淘宝为例,双十一大促期间,流量会比平常高出很多,此时服务肯定需要增加更多实例来应对高并发,而这些实例在双十一之后就无需继续使用了,采用临时实例比较合适。而对于服务的一些常备实例,则使用永久实例更合适。
客户端主动上报机制
临时实例每隔 5 秒会主动上报一次自己的健康状况,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。如果心跳包的间隔时间超过了 15 秒,那么 Nacos 服务器端就会将此服务实例标记为非健康实例,如果心跳包超过了 30s 秒,那么 Nacos 服务器端将会把此服务实例从服务列表中删除掉。运行 Nacos 项目时,可以看到客户端主动上报心跳包的日志,如下图所示:从上述图片可以看出,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
服务端反向探测机制
永久实例使用的服务器端反向探测的方式实现健康检查的,它的探测周期是 2000 毫秒 + 随机数(5000 毫秒以内),如果检测异常会将此服务实例,标记为非健康实例,但不会把服务实例向临时实例那样进行删除。Nacos 服务器反向探测目前内置了 3 种探测协议:HTTP 探测、TCP 探测和 MySQL 探测。⼀般而言 HTTP 和 TCP 探测已经可以涵盖绝大多数的健康检查场景,MySQL 主要用于特殊的业务场景,例如数据库的主备需要通过服务名对外提供访问,需要确定当前访问数据库是否为主库时,那么我们此时的健康检查接口,是⼀个检查数据库是否为主库的 MySQL 命令。
TCP 探测
默认情况下,永久实例使用的是 TCP 探测,这点可以在 Nacos 控制台观察到,如下图所示:默认会使用 IP端口来检查,如下图所示:TCP 探测的大体逻辑是通过与注册实例建立 channel,不断 ping 注册实例的端口,来判断实例是否健康。
HTTP 探测
HTTP 探测需要在 Nacos 控制台手动配置,如下图所示:我们在服务实例中添加探测接口的实现代码:此时我们重新启动服务实例,在服务详情中可以看到我们配置的 HTTP 探测已经生效了,可以检查出实例是健康的,如下图所示:Nacos 服务器端通过检查 HTTP 的接口是否返回 200 状态码,来判断实例是否为健康状态。
集群下的健康检查机制
集群下的健康检查机制可以用一句话来概括,那就是“各司其职”。每个服务对应了一个主注册中心,当注册中心接收到临时实例的心跳包之后,将健康状态同步给其他注册中心。而永久实例也是类似的,每个服务对应了一个主注册中心,当负责的注册中心探测到服务实例的健康状态发生改变时,再会将实例的健康状况同步到其他注册中心,从而实现了集群下的健康检查机制。
总结
Nacos 中提供了两种健康检查机制:临时实例的客户端主动上报机制和永久实例的服务端反向探测机制。临时实例每隔 5s 发送一个心跳包给 Nacos 服务器端,服务器端接收到心跳包之后再将健康状况同步给其他注册中心。永久实例支持 3 种探测协议,TCP、HTTP 和 MySQL,默认探测协议为 TCP,也就是通过不断 ping 的方式来判断实例是否健康。
参考 & 鸣谢
《Nacos框架与原理》
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java中文社群
Java面试合集:https://gitee.com/mydb/interview
往期推荐
玩转Nacos参数配置!多图勿点
芭比扣了!Nacos中服务删除不了,肿么办?
Spring Cloud Alibaba Nacos路由策略之保护阈值!
求点赞、在看、分享三连
Spring Cloud Alibaba Nacos 的 2 种健康检查机制!相关推荐
- 513、Java Spring Cloud Alibaba -【Spring Cloud Alibaba Nacos】 2021.08.30
目录 1.Nacos简介 2.使用 Docker 快速搭建 Nacos 1.4 2.1 从 git 上 clone 项目: 2.2 clone 完成后,进入 naocs-docker 目录: 2.3 ...
- Spring Cloud Alibaba Nacos 分布式配置
Spring Cloud Alibaba 分布式配置 1. 简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spr ...
- Spring Cloud Alibaba Nacos Confifig是什么
Spring Cloud Alibaba Nacos Confifig是Spring Cloud Alibaba的子项目,而Spring Cloud Alibaba是阿里巴巴公司提供的开源的基于Spr ...
- Spring Cloud Alibaba —— Nacos Config 配置中心
导航 引言 一.什么是配置中心 二.常见的配置中心组件 三.Nacos Config 入门 四.Nacos Config 动态配置 4.1 硬编码方式(默认支持动态生效) 4.2 属性注入 五.配置共 ...
- nacos 配置动态刷新_使用 Spring Cloud Alibaba Nacos Config 作为配置中心
什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Con ...
- Spring Cloud Alibaba Nacos 分布式配置中心
文章目录 1 摘要 2 核心 Maven 依赖 3 核心代码 3.1 bootstrap 配置文件 3.2 application 配置文件 3.3 配置测试类 - Controller 层 3.4 ...
- Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.1 Spring Cloud Alibaba Nacos 概述
11.1 Spring Cloud Alibaba Nacos 概述 11.1.1 Spring Cloud Alibaba 简介 在一开始,我们先简单介绍下Spring Cloud Alibaba的 ...
- SpringBoot 整合 Spring Cloud Alibaba Nacos 连通性+负载均衡
文章目录 一.整合版本说明 1. 毕业版本依赖关系(推荐使用) 2. 组件版本关系 3. 演示版本 二.整合实战 2.1. 聚合模块设计 2.2. 创建聚合parent 2.3. 依次创建子项目 三. ...
- Spring Cloud Alibaba——Nacos实现服务治理
引言 本博客总结微服务开发中各个微服务调用的实现,并使用 Nacos 完成服务注册和发现. 文章中会涉及到 maven 的使用,以及 spring boot 的一些知识.开发工具采用 IDEA 202 ...
最新文章
- Ubuntu磁盘空间如何扩容
- IDEA for Java Web
- unity,standalone下自定义分辨率不起作用的解法
- 2021夏季每日一题 【week3 完结】
- 兼容超大图片的处理_计算机读取超大图像的一些问题简述
- 面试了57位数据分析师,我发现牛逼的人都有这4个特质
- php.ini-dist和php.ini区别,php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)...
- java实现多线程抢单_来聊一聊3种实现JAVA多线程的方式吧
- 汽车研发的五大阶段及制造的四大工艺
- java 读写文件乱码_Java 解决读写本地文件中文乱码的问题
- 链式存储【C语言单链表】
- python之flask_sqlalchemy的使用及详解
- 模型可解释性-SHAPE
- 研究人员创建一种安全的CAR T细胞疗法来对抗儿童的实体瘤
- 美豪酒店集团获亿元投资,同程旅游领投陕文投跟投
- Unity UGUI图文混排源码(三) -- 动态表情
- 谷歌眼镜设计规范之UI设计原则
- VC6 MFC里怎么使用TTS朗读中文?
- 【PTA题目】7-4 输出大写英文字母 (15 分)
- Spring Boot 大型线上商城项目实战教程
热门文章
- 软件测试用例_软件测试用例设计实战场景法
- 华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动
- pytorch 查看参数是否被训练 require_grad()
- Angular Web App部署Ubuntu Nginx
- Qt for Android 开发大坑
- Facebook也大干新闻聚合 “新闻快读”向所有媒体开放
- Coreseek Windows下安装调试
- 【python】编程学习练习题-2
- head first python(第三章)–学习笔记
- 远程服务器电脑的设置