介绍:应用高可用服务AHAS(ApplicationHighAvailabilityService)是阿里巴巴内部高可用系统多年积累的云产品。管控、不稳定调用隔离、断路器降级、热点流量保护、系统自适应过载保护、集群流控、服务防抖等多维度保障服务和网关的稳定性,同时提供秒级流量监控分析功能。作者:苏禾微服务的稳定性一直是开发者非常关心的话题。随着业务从单体架构向分布式架构演进和部署方式的改变,服务之间的依赖关系越来越复杂,业务系统也面临着巨大的高可用挑战。应用高可用服务AHAS(ApplicationHighAvailabilityService)是阿里巴巴内部高可用系统多年积累的云产品。基于阿里巴巴开源的流控降级组件Sentinel,以流量和容错为出发点,从流控到不稳定调用隔离、断路器降级、热点流量保护、系统自适应过载保护、集群流控制、服务防抖等维度保障服务和网关的稳定性,同时提供秒级流量监控和分析功能。AHAS不仅在阿里巴巴内部淘宝、天猫等电商领域有着广泛的应用,在互联网金融、在线教育、游戏、直播行业等大型政府和央企行业也有大量实践.在分布式系统架构中,每个请求都会经过很多层的处理,比如从入口网关到WebServer再到服务之间的调用,再到服务访问缓存或者DB等存储。在高可用的流量保护体系中,我们建议在流量链路的每一层都实施有针对性的流量保护和容错措施,以保证服务的稳定性。上一期我们介绍了如何在Nginx/Ingress网关层接入AHASSentinel进行前端流量防护。在本文中,我们将介绍Web应用层的细粒度高可用流量保护。WebServer场景AHAS应用保护支持Java/Go等多语言原生接入,支持主流Web框架和组件:Java支持SpringWeb/SpringWebFlux/SpringBoot/SpringCloud/Tomcat/Jetty/Undertow等主流WebframeworksGo支持的Gin、echo等框架中的每个服务都有一个最大可以承载的请求容量,这个容量通常通过压力测试来评估。在流量突然激增的场景下,我们需要为核心WebAPI配置流控规则,保证系统流量在有效处理能力之内,避免不堪重负。同时,Web流量通常带有很多业务属性和参数,比如IP、用户ID、商品ID等,很多请求都具有一定的热点特征,比如对某个热点商品的一大波请求。由于流量的不确定性和不可预测性,我们无法准确预测流量的大小、分布和热点接入,难以针对突发性业务进行有针对性的预测和配置防护。因此,自动识别热点请求的能力也很重要。AHASweb场景流控[1]不仅支持URL路径维度的流控,还支持对客户端IP、host、header、请求参数等的细粒度热点流控,我们只需要指定哪个请求属性是在配置web流量控制规则时针对热点流量控制(如key为UserId的header),AHAS会自动分析请求中对应请求属性的值(如header的值),并自动统计topN个热点访问的参数,分别控制请求量。通过这个维度的管控,我们可以在web服务器上实现IP防刷、热点产品防刷等一系列细粒度的高可用保护策略,甚至可以实现对每个用户、每个API进行限制每分钟访问N次。具有业务影响的流量控制策略。在WebClient场景,AHASSentinel除了提供Web服务器入口流量控制外,还提供了对常见WebClient的适配,如OkHttp、ApacheHttpClient、SpringRestTemplate等。基于WebClient适配模块,我们可以保护HTTP客户端调用其他接口的时序,保证调用端不会被慢速接口或异常接口拖累:当web调用端调用某个接口很慢时,而请求量很大的时候,如果不加以控制,慢调用会占用整个连接池,导致其他正常的服务调用被阻塞,自身处理请求的能力也会受到拖累。这时可以使用并发控制规则[2],通过控制API路径的并发线程数(即发起的调用数)来保证调用端的可靠性,防止连接池爆满同时)。当Web客户端调用的接口持续出现慢速调用或异常时,也可以使用AHAS熔断规则[3]做进一步的保护。断路器规则提供断路器功能。API路径中出现一定比例的慢调用或持续异常后,在一段时间内,接口调用会自动中断,并直接返回预设的降级信息。通过熔断机制,一方面可以避免调用者被不稳定的第三方接口拖累,另一方面也给不稳定的接口一定的恢复时间,避免持续不断的导致服务进一步下降电话。当WebClient调用接口偶尔出现超时等非致命错误时,可以使用自动重试规则[4]来保证业务成功率,避免业务抖动。断路器规则和并发控制规则是保证调用端稳定性的有效手段,无论是Web客户端场景还是慢SQL场景都非常适用。快玩AHASweb场景防护第一步是将web服务接入AHAS流量防护。AHAS提供了多种快速便捷的非侵入式访问方式:以普通的SpringBootWeb服务为例,成功访问AHAS后,只要触发服务调用/接口访问,就可以在AHAS中看到自己的服务console[5],在web场景页面可以看到自己的web界面。默认情况下,SpringBoot应用访问会提取controller中的URL路径作为资源名:我们可以在监控页面上非常直观的观察到各个接口的实时流量和响应时间,从而评估其稳定性系统。在第二步中,我们为其中一个接口配置Web流量控制规则[6]。在我们的示例中,我们为/helloAPI配置热点参数流控制。流控的请求属性是name的请求参数(URLparams),流控策略限制每个热点参数每秒访问次数最多为1次。AHAS会自动提取每个/hello请求中name参数对应的值,自动分析其中前K个频次的热点值,然后分别控制每个热点值,不超过规则中的访问次数。效果示例:假设请求中访问/hello接口的次数很多,其中/hello?name=A和/hello?name=B这两个name参数的访问频率很高,算作热点值通过AHAS统计。那么上面的流控规则会对name=A和name=B这两个参数值分别限制每秒访问次数不超过1次请求。第三步,我们给上面的web流控规则绑定一个fallbackbehavior[7],即指定规则触发后web界面的返回内容。我们可以在页面中自定义web返回行为。下面是一个返回429状态码的JSON返回配置示例:配置完成后,我们可以在流程页面选择我们创建的回退行为,然后保存,这样我们的规则才会真正生效时间。第四步,我们为/hello接口发起流量,给name参数带上不同的值。从控制台监控可以看到请求触发了流控:同时被流控的热点请求的返回值也和我们一样。控制台中定义的fallback对应返回:在生产环境中,我们这些参数的取值可能有很多,比如可能有几千万个产品ID。热点请求限流后,我们通常想知道哪些top参数被限流了,这样可以了解业务的请求情况。AHAS最近推出了热点监控功能,提供了观察热点参数的能力。结合top参数热力图,可以在控制台直观了解实时业务情况:以上是SpringBootWeb场景流控的简单示例,欢迎大家在AHAS控制台体验。更多关于Web场景保护的内容,请点击此处查看参考文档。相关链接[1]AHASWeb场景流控:https://help.aliyun.com/docum...[2]并发控制规则https://help.aliyun.com/docum...[3]熔断规则https://help.aliyun.com/docum...[4]自动重试规则https://help.aliyun.com/docum...[5]AHAS控制台https://common-buy.aliyun.com...[6]Web流量控制规则https://help.aliyun.com/docum...[7]回退行为https://help.aliyun.com/docum...本文原文链接为阿里云原创内容,未经允许不得转载。
