Spring Cloud Alibaba Nacos 的 2 种健康检查机制!
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
Spring Cloud Alibaba Nacos 的 2 种健康检查机制!的更多相关文章
- Spring Cloud Alibaba Nacos 服务注册与发现功能实现!
Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能. 服务注册与发现功能解决了微服务集群中,调用者和服务提供者连 ...
- Spring Cloud Alibaba | Nacos集群部署
目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...
- Spring Cloud Alibaba Nacos
1. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 为分布式应用程序开发提供了一站式解决方案.它包含了开发分布式应用程序所需的所有组件,使得你可以轻松地使用 ...
- Spring Cloud Alibaba | Nacos服务中心初探
目录 Spring Cloud Alibaba | Nacos服务中心初探 1. 什么是Nacos? 1.1 Nacos 1.0 1.2 Nacos 2.0 2. Nacos 架构及概念 2.1 服务 ...
- Spring Cloud Alibaba | Nacos服务注册与发现
目录 Spring Cloud Alibaba | Nacos服务注册与发现 1. 服务提供者 1.1 pom.xml项目依赖 1.2 配置文件application.yml 1.3 启动类Produ ...
- Spring Cloud Alibaba | Nacos配置管理
目录 Spring Cloud Alibaba | Nacos配置管理 1. pom.xml 项目依赖 2. 在 bootstrap.properties 中配置 Nacos server 的地址和应 ...
- 0.9.0.RELEASE版本的spring cloud alibaba nacos+feign实例
这里的feign依然是原来的feign,只不过将注册中心由eureka换成了nacos.服务提供方参见0.9.0.RELEASE版本的spring cloud alibaba nacos实例,消费方跟 ...
- 0.9.0.RELEASE版本的spring cloud alibaba nacos实例
简而言之,nacos与eureka的不同之处有三:后台老板.部署方式.功能.nacos是阿里的,eureka是奈飞的:nacos有自己的安装包,需要独立部署,eureka仅作为一个服务组件,引入jar ...
- Spring Cloud Alibaba+Nacos搭建微服务架构
1. Spring Cloud Alibaba 简介 Spring Cloud Alibaba是阿里巴巴为分布式应用提供的一站式解决方案,能够更方便快捷地搭建分布式平台,nacos拥有着替换eu ...
随机推荐
- 一个小程序:Instrumentation的使用
本来是想练习Matrix的,没想到写了一个自定义View,监听它的ASWD键后,不知道该如何按下ASWD(手机上一般都没实体按键了).于是: 一个自定义View: public class MyVie ...
- Android官方文档翻译 九 2.2Adding Action Buttons
Adding Action Buttons 增加动作按钮 This lesson teaches you to 这节课教给你 Specify the Actions in XML 在XML中指定动作 ...
- 《剑指offer》面试题18. 删除链表的节点
问题描述 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = ...
- ClassCastException: java.util.Date cannot be cast to java.sql.Date
解决办法 /** * 单个方法,作用,根据输入的day:yyyy-mm-dd格式的字符日期,将数据库中的该天所有数据更新为0 * 0表示假期 * @param day * @throws SQLExc ...
- 【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断
先看看导致异常的代码: package main import ( "fmt" "log" ) type MyError1 struct{ MyErrorCod ...
- 【get√】golang新手理解了一点点gin框架的中间件
1.通过use()来使用多个中间件 router := gin.New() router.Use( middleware1, middleware2) 2.中间件的典型实现 func Logger() ...
- 2022年最新黑苹果monterey安装efi分享
最新版本monterey 12.1 安装. 配置: 名称 型号 备注 主板 Gigabyte Z490M Gaming X 内存 威刚万紫千红DDR4 2666 16G x 2 两条16G 插2 ...
- WPF学习笔记(四):AvalonEdit 代码高亮编辑控件专题
AvalonEdit 是一个基于 WPF 的文本编辑器组件.它是由 Daniel Grunwald 为 SharpDevelop 编写的.从 5.0 版开始,AvalonEdit 根据MIT许可证发布 ...
- MyCms 自媒体 CMS 系统 v2.8,支持织梦数据导入
MyCms 是一款基于Laravel开发的开源免费的自媒体博客CMS系统,助力开发者知识技能变现. MyCms 基于Apache2.0开源协议发布,免费且不限制商业使用,欢迎持续关注我们. V2.8 ...
- Qt之进入和出去和关闭事件
widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QEvent> class Wi ...