广告位联系
返回顶部
分享到

Spring Cloud Alibaba Nacos两种检查机制

java 来源:互联网 作者:酷站 发布时间:2022-05-09 22:42:47 人浏览
摘要

Spring Cloud Alibaba Nacos 作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制。有了此机制之后,Nacos 才能感知服务的健康状态,从而为服务调用者提供健

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 的方式来判断实例是否健康。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计