Spring Cloud Alibaba Nacos路由策略之保护阈值!
在 Nacos 的路由策略中有 3 个比较重要的内容:权重、保护阈值和就近访问。因为这 3 个内容都是彼此独立的,所以今天我们就单独拎出“保护阈值”来详细聊聊。
保护阈值
保护阈值(ProtectThreshold):为了防止因过多实例故障,导致所有流量全部流入剩余健康实例,继而造成流量压力将剩余健康实例被压垮形成雪崩效应。应将健康保护阈值定义为⼀个 0 到 1 之间的浮点数。当域名健康实例数占总服务实例数的比例小于该值时,无论实例是否健康,都会将这个(健康或不健康的)实例返回给客户端。这样做虽然损失了⼀部分流量,但是保证了集群中剩余健康实例能正常工作。
也就是说,保护阈值是设置集群中健康实例占比允许的最小值,它需要设置一个 0-1 的浮点值,默认值为 0,当集群中的健康实例占比小于设置的保护阈值时,就会触发阈值保护功能。保护阈值可在服务详情中查询和设置,如下图所示:

如何理解保护阈值?
要理解保护阈值先要明确一个前提条件:对于 Nacos 的注册中心功能来说,Nacos 有一个天然的职责,是将服务消费者(Consumer)的请求转发给某个健康的服务提供者(Provider)。
但在执行的流程中,可能会出现一种极端的情况,比如某个服务有 100 个实例,其中 99 个实例都宕机了,只剩下一个健康的实例,这个时候如果把所有的请求都转发到这一个健康实例上就会造成雪崩效应,最终导致业务系统崩溃。
为了防止这种极端情况,于是就有了“保护阈值”,保护阈值一旦被触发,那么 Nacos 将会把请求转发给所有服务实例,也就是健康实例+非健康实例,这样可能会损失了⼀部分流量,但能保证集群中剩余的健康实例能正常工作。
保护阈值触发条件:(实际健康实例/总服务实例)≤设置的保护阈值
设置保护阈值
我们可以通过“编辑服务”来设置保护阈值,如下图所示:

触发保护阈值
接下来我们创建一个服务测试一下保护阈值的功能,在创建的服务中添加两个实例,如下图所示:


默认情况下服务实例都是健康的,接下来我们将保护阈值设置为 0.8,也就是健康实例的最低要求是 80%,如果健康实例占比小于此值就会触发保护阈值,如下图所示:

当所有节点都健康时,观察服务列表页面,可以看出并未触发保护阈值的功能,如下图所示:

此时我们手动停止一个服务实例,如下图所示:

这是健康实例的占比就从 100%,下降到了 50%,小于了设置的保护阈值 0.8(80%),接下来返回服务列表页面,可以看到保护阈值功能被触发了:

此时,我们再去访问服务就会看到,部分请求会转发到非健康实例,也就是访问会出错,如下图所示:

未触发保护阈值
接下来我们降低保护阈值,将保护阈值设置为 0.3,也就是健康实例占比最低要求是 30%,否则会触发阈值保护,如下图所示:

而此时因为我们健康实例占比是 50%,大于设置的阈值保护 0.3,所以就不会触发阈值保护,这点可以在服务列表中观察到:

当未触发保护阈值时,Nacos 会把所有请求都转发到健康的实例上,所以每次都能正常的访问服务,执行效果如下图所示:

总结
保护阈值是为了防止因过多实例故障,导致所有流量全部流入剩余健康实例,继而造成流量压力将剩余健康实例被压垮形成雪崩效应。它的默认值是 0,取值范围应该是 0-1 的浮点数。此值是定义集群中允许健康实例占比的最小值,如果实际健康服务占比小于或等于此值,就会触发保护阈值,那么 Nacos 就会将全部实例:健康实例 + 非健康实例全部返回给调用者,而当保护阈值未触发时,Nacos 只会把健康实例返回给调用者。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java中文社群
Java面试合集:https://gitee.com/mydb/interview
Spring Cloud Alibaba Nacos路由策略之保护阈值!的更多相关文章
- 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 的地址和应 ...
- Spring Cloud Alibaba | Nacos集群部署
目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...
- 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 ...
- Spring Cloud Alibaba Nacos Config 实战
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持.使用 Spring Cloud Alibaba Nacos Config,您可 ...
随机推荐
- js 模块化 -- 基本的导出与引入class模块
1.目录结构 2.类语法与导出 class food { } //定义常量 let c = "苹果"; //正确的函数写法 food.prototype.getfood = fun ...
- 物理机异常断电,linux虚拟机系统磁盘mount失败,导致无法启动; kubectl 连接失败
虚拟机 CentOS 7 挂载文件系统失败 上周五下班前没有关闭虚拟机和物理机, 今天周一开了虚拟机之后,发现操作系统启动失败. 原因跟 这篇文章描述的一模一样. 解决操作系统的文件系统挂载的问题之后 ...
- 详谈 Java工厂 ---工厂方法模式
1.前言 有个场景,消费者需要付钱,有可能是使用支付宝.微信.银行卡,那么该怎么选择呢? 是不是想到了使用用if else判断?还是使用switch? 一个地方这样写还好,如果有很多这样的业务,难道都 ...
- println打印的原理
由于out是System类中的一个不可变的变量 println方法在PrintStream类中 并且在打印都时候都会转换成字符串
- 安霸pipeline简述之YUV域的处理
YUV域处理模块的详细介绍: YUV域的处理主要是rgb_to_yuv_matrix,chroma_scale,ASF(空域降噪),MCTF(时域降噪),SharpenB(锐化模块). RGB2YUV ...
- JVM调优工具锦囊
Arthas线上 分析诊断调优工具 以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令.最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具中.这样操作有诸多不变,现 ...
- springBoot--原理分析
起步依赖分析 分析spring-boot-starter-parent 按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-star ...
- CesiumJS新增官方TypeScript类型定义
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 在当前的1.70版本中,CesiumJS现在附带了正式的Type ...
- [一]Cesium利其器——Visual Studio Code
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ IDE Web前端刚入门的朋友,常常想选择一个快速.好用.流行( ...
- Qt之QColorDialog
widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> class Widget : public QWidget { ...