作者 | 磊哥

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

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

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

两种健康检查机制

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

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

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

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

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

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

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

如何设置健康检查机制?

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

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

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

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

客户端主动上报机制

临时实例每隔 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 种健康检查机制!相关推荐

  1. 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 ...

  2. Spring Cloud Alibaba Nacos 分布式配置

    Spring Cloud Alibaba 分布式配置 1. 简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spr ...

  3. Spring Cloud Alibaba Nacos Confifig是什么

    Spring Cloud Alibaba Nacos Confifig是Spring Cloud Alibaba的子项目,而Spring Cloud Alibaba是阿里巴巴公司提供的开源的基于Spr ...

  4. Spring Cloud Alibaba —— Nacos Config 配置中心

    导航 引言 一.什么是配置中心 二.常见的配置中心组件 三.Nacos Config 入门 四.Nacos Config 动态配置 4.1 硬编码方式(默认支持动态生效) 4.2 属性注入 五.配置共 ...

  5. nacos 配置动态刷新_使用 Spring Cloud Alibaba Nacos Config 作为配置中心

    什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Con ...

  6. Spring Cloud Alibaba Nacos 分布式配置中心

    文章目录 1 摘要 2 核心 Maven 依赖 3 核心代码 3.1 bootstrap 配置文件 3.2 application 配置文件 3.3 配置测试类 - Controller 层 3.4 ...

  7. Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.1 Spring Cloud Alibaba Nacos 概述

    11.1 Spring Cloud Alibaba Nacos 概述 11.1.1 Spring Cloud Alibaba 简介 在一开始,我们先简单介绍下Spring Cloud Alibaba的 ...

  8. SpringBoot 整合 Spring Cloud Alibaba Nacos 连通性+负载均衡

    文章目录 一.整合版本说明 1. 毕业版本依赖关系(推荐使用) 2. 组件版本关系 3. 演示版本 二.整合实战 2.1. 聚合模块设计 2.2. 创建聚合parent 2.3. 依次创建子项目 三. ...

  9. Spring Cloud Alibaba——Nacos实现服务治理

    引言 本博客总结微服务开发中各个微服务调用的实现,并使用 Nacos 完成服务注册和发现. 文章中会涉及到 maven 的使用,以及 spring boot 的一些知识.开发工具采用 IDEA 202 ...

最新文章

  1. Ubuntu磁盘空间如何扩容
  2. IDEA for Java Web
  3. unity,standalone下自定义分辨率不起作用的解法
  4. 2021夏季每日一题 【week3 完结】
  5. 兼容超大图片的处理_计算机读取超大图像的一些问题简述
  6. 面试了57位数据分析师,我发现牛逼的人都有这4个特质
  7. php.ini-dist和php.ini区别,php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)...
  8. java实现多线程抢单_来聊一聊3种实现JAVA多线程的方式吧
  9. 汽车研发的五大阶段及制造的四大工艺
  10. java 读写文件乱码_Java 解决读写本地文件中文乱码的问题
  11. 链式存储【C语言单链表】
  12. python之flask_sqlalchemy的使用及详解
  13. 模型可解释性-SHAPE
  14. 研究人员创建一种安全的CAR T细胞疗法来对抗儿童的实体瘤
  15. 美豪酒店集团获亿元投资,同程旅游领投陕文投跟投
  16. Unity UGUI图文混排源码(三) -- 动态表情
  17. 谷歌眼镜设计规范之UI设计原则
  18. VC6 MFC里怎么使用TTS朗读中文?
  19. 【PTA题目】7-4 输出大写英文字母 (15 分)
  20. Spring Boot 大型线上商城项目实战教程

热门文章

  1. 软件测试用例_软件测试用例设计实战场景法
  2. 华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动
  3. pytorch 查看参数是否被训练 require_grad()
  4. Angular Web App部署Ubuntu Nginx
  5. Qt for Android 开发大坑
  6. Facebook也大干新闻聚合 “新闻快读”向所有媒体开放
  7. Coreseek Windows下安装调试
  8. 【python】编程学习练习题-2
  9. head first python(第三章)–学习笔记
  10. 远程服务器电脑的设置