作者|雷哥来源|Java中文社区(ID:javacn666)转载请联系授权(微信ID:GG_Stone)。Nacos路由策略中有3个重要内容:权重、保护阈值和最近访问。因为这三个内容是相互独立的,所以今天我们就来详细说说“保护门槛”。ProtectionThreshold保护阈值(ProtectThreshold):为了防止由于实例故障过多导致流量全部流入剩余健康实例,进而导致流量压力压倒剩余健康实例,形成雪崩效应。健康保护阈值应定义为0到1之间的浮点数,当域名健康实例占服务实例总数的比值小于该值时,无论该实例是否正常,该实例(健康或不健康)都会返回给客户端。实例是否健康。这样虽然丢失了一些流量,但是保证了集群中剩下的健康实例可以正常工作。也就是说,保护阈值是设置集群中健康实例所占比例允许的最小值。它需要设置一个0-1的浮点值。默认值为0,当集群中健康实例的比例小于设置的保护阈值时,会触发阈值保护功能。保护阈值可以在服务详情中查询和设置,如下图:如何理解保护阈值?要理解保护阈值,必须明确一个前提:对于Nacos的注册中心功能,Nacos有一个天然的责任,就是将服务消费者(Consumer)的请求转发给一个健康的服务提供者(Provider)。但是,在执行过程中,可能会出现极端情况。比如某服务有100个实例,其中99个宕机,只剩下一个健康的实例。此时,如果所有的请求都转发到这个健康的实例上,就会造成雪崩效应,最终导致业务系统崩溃。为了防止出现这种极端情况,有一个“保护门槛”。一旦触发保护阈值,Nacos会将请求转发给所有服务实例,即健康实例+不健康实例,这可能会造成一些流量损失,但可以保证集群中剩余的健康实例能够正常工作。保护阈值触发条件:(实际健康实例/总服务实例)≤设置保护阈值设置保护阈值我们可以通过“编辑服务”来设置保护阈值,如下图:触发保护阈值接下来我们创建一个服务来测试保护阈值功能,在创建的服务中添加两个实例,如下图:默认情况下,服务实例是健康的,然后我们设置保护阈值为0.8,也就是说对健康实例的最低要求是80%,如果健康实例的比例小于这个值,就会触发保护阈值,如下图:当所有节点都健康时,观察服务列表页面,可以看到函数未触发保护阈值,如下图:此时我们手动停止一个服务实例,如下图:healthyinstance的比例ances从100%下降到50%,低于设定的保护阈值0.8(80%)。接下来回到服务列表页面,可以看到保护阈值功能被触发:此时,我们再次访问该服务时,会看到部分请求会被转发到不健康的实例,即访问失败,如下图:未触发保护阈值。接下来,我们降低保护阈值,将保护阈值设置为0.3,即健康实例比例最低要求为30%,否则会触发阈值保护,如下图所示:此时,因为我们的健康实例比例是50%,大于设置的阈值保护0.3,所以不会触发阈值保护,在服务列表中可以观察到:当没有触发保护阈值时,Nacos会转发所有请求到健康实例,所以每次都能正常访问服务,执行效果如下图所示:摘要保护阈值是为了防止所有流量因为实例故障过多而流向剩余的健康实例,进而导致流量压力压垮剩余的健康实例,形成雪崩效应。它的默认值为0,取值范围应该是0-1的浮点数。该值是定义集群中健康实例比例的最小值。如果健康服务的实际占比小于或等于这个值,就会触发保护阈值,Nacos会返回所有实例:健康实例+不健康实例给调用者,当没有触发保护阈值时,Nacos会只将健康的实例返回给调用者。
