如何利用 AHAS 保障 Web 服务稳如磐石?
简介:应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,基于阿里开源流控降级组件 Sentinel,以流量与容错为切入点,从流量控制、不稳定调用隔离、熔断降级、热点流量防护、系统自适应过载保护、集群流控、服务防抖动等多个维度来帮助保障服务和网关的稳定性,同时提供秒级的流量监控分析功能。
作者:宿何
微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战。应用高可用服务 AHAS (Application High Availability Service) 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,基于阿里开源流控降级组件 Sentinel,以流量与容错为切入点,从流量控制、不稳定调用隔离、熔断降级、热点流量防护、系统自适应过载保护、集群流控、服务防抖动等多个维度来帮助保障服务和网关的稳定性,同时提供秒级的流量监控分析功能。AHAS 不仅在阿里内部淘宝、天猫等电商领域有着广泛的应用,在互联网金融、在线教育、游戏、直播行业和其他大型政央企行业也有着大量的实践。
在分布式系统架构中,每个请求都会经过很多层处理,比如从入口网关再到 Web Server 再到服务之间的调用,再到服务访问缓存或 DB 等存储。在高可用流量防护体系中,我们建议在流量链路的每一层都进行针对性的流量防护与容错手段,来保障服务的稳定性。上一期我们介绍了如何在 Nginx/Ingress 网关层接入 AHAS Sentinel 来进行前置流量防护,本篇文章我们来介绍一下在 Web 应用层进行细粒度的高可用流量防护。

Web Server 场景
AHAS 应用防护支持 Java/Go 等多语言原生接入,支持主流的 Web 框架与组件:
- Java 支持 Spring Web/Spring WebFlux/Spring Boot/Spring Cloud/Tomcat/Jetty/Undertow 等主流 Web 框架
- Go 支持 Gin, echo 等框架
每个服务都有一个能承载的最大请求容量,这个容量通常压测进行评估。在突发激增流量的场景下,我们需要针对核心 Web API 配置流控规则,来保障系统流量处于有效的处理能力之内,避免被打垮。同时,Web 流量通常具有非常多的业务属性与参数,如 IP、用户 ID、商品 ID 等,许多请求都具有一定的热点特性,比如一大波请求针对某个热点商品。由于流量具有不确定性、不可预测的特性,我们无法准确预知流量的量级、分布、热点访问情况,很难针对性地针对某个突发业务提前预判并配置防护,因此自动识别热点请求能力也是非常重要的。
AHAS Web 场景流控[1]不仅支持 URL path 维度的流控,还支持针对 client IP、host、header、请求参数等进行细粒度热点流量控制。我们只需要在配置 Web 流控规则时,指定针对哪个请求属性进行热点流控(如 key 为 UserId 的 header),那么 AHAS 就会自动分析请求中对应请求属性的值(如 header 的 value),自动统计出 top N 热点访问的参数并分别进行请求量控制。通过这种维度的控制,我们可以在 Web 服务端实现 IP 防刷、热点商品防刷等一系列的细粒度高可用防护策略,甚至可以实现 每个用户每个 API 每分钟限制访问 N 次 这种具有业务含义的流量管控策略。
Web Client 场景
除了 Web 服务端入口流量控制之外,AHAS Sentinel 还提供常用 Web Client 的适配,如 OkHttp、Apache HttpClient 以及 Spring RestTemplate。基于 Web Client 适配模块,我们可以针对 HTTP 客户端调用其他接口的时机进行防护,来保障调用端不会被慢接口或异常接口拖垮:
- 当 Web 调用端调用某个接口非常慢,且请求量很大时,若不加以控制,那么慢调用会挤占整个连接池,导致其他正常服务的调用也被阻塞,自身处理请求的能力也被拖垮。此时可以利用并发控制规则[2]通过控制 API path 的并发线程数(即同时发起调用的数目),来保证调用端的可靠性,防止连接池被占满。
- 当 Web client 调用的某个接口持续出现慢调用或异常,也可以利用 AHAS 熔断规则[3]进行进一步的保护。熔断规则提供熔断器的能力,在某个 API path 出现慢调用或持续异常达到一定比例后,在一段时间内,自动熔断针对该接口的调用,并直接返回预设的降级信息。通过熔断机制,一方面可以防止调用端被不稳定第三方接口拖垮,另一方面也给不稳定接口一些恢复的时间,避免持续调用导致服务进一步劣化。
- 当 Web Client 调用接口时出现偶现的超时等非致命性错误时,可以通过自动重试规则[4]来保障业务成功率,避免业务产生抖动。
熔断规则与并发控制规则是保障调用端稳定性的有效手段,无论在 Web client 场景还是慢 SQL 场景都非常适用。
快速玩转 AHAS Web 场景防护
第一步,我们将 Web 服务接入 AHAS 流量防护。AHAS 提供多种快速便捷的无侵入接入手段:


以普通 Spring Boot Web 服务为例,接入 AHAS 成功后,只要触发服务调用/接口访问,即可在 AHAS 控制台[5]看到自己的服务,并可以在 Web 场景页面看到自己的 Web 接口。默认 Spring Boot 应用接入会提取 controller 中的 URL path 作为资源名称:
我们可以在监控页面非常直观地观测各个接口的实时流量与响应时间情况,以便于我们评估系统的稳定性。
第二步,我们给其中一个接口配置 Web 流控规则[6]。在我们的示例中,我们针对 /hello 这个 API,配置热点参数流控。流控的请求属性为 name 这个请求参数(URL params),流控策略为每个热点参数分别限制每秒访问量最多 1 次。AHAS 会自动提取每个 /hello 请求中的 name 参数对应的值,自动分析出其中 top K 频次的热点值,然后分别对每个热点值进行控制,不超过规则中的访问次数。
效果示例:假设请求中有许多针对 /hello 接口的访问,其中 /hello?name=A 和/hello?name=B 两个 name 参数的访问频次非常高,被 AHAS 统计统计为热点值。那么上面的流控规则会针对 name=A 和 name=B 这两个参数值的请求,分别限制每秒访问量不超过 1 次。
第三步,我们给上面的 Web 流控规则绑定一个 fallback 行为[7],即指定触发该规则后,Web 接口的返回内容。我们可以在页面中自定义 Web 返回行为。以下是一个返回 429 状态码的 JSON 返回配置示例:


配置完成后,我们可以在流程页面选择我们创建的 fallback 行为,然后保存,这样我们的规则就会实时生效了。
第四步,我们发起针对 /hello 接口的流量,并给 name 参数带上不同的值,可以从控制台的监控上面看到请求触发了流控:

在生产环境,我们这些参数的值可能非常多,比如商品 ID 可能有上千万个。在热点请求被流控后,我们通常希望能够知道有哪些 top 参数被限制,方便我们了解业务的请求情况。AHAS 近期新上线热点监控功能,提供热点参数可观测的能力,结合 top 参数热力图,可以非常直观地在控制台了解实时业务情况:

以上就是一个简单的 Spring Boot Web 场景流控的示例,欢迎大家在 AHAS 控制台体验,有关 Web 场景防护的更多信息可以点击此处,查看参考文档。
相关链接
[1] AHAS Web 场景流控:
[2] 并发控制规则
[3] 熔断规则
[4] 自动重试规则
[5] AHAS 控制台
[6] Web 流控规则
[7] fallback 行为
本文为阿里云原创内容,未经允许不得转载。
如何利用 AHAS 保障 Web 服务稳如磐石?的更多相关文章
- 利用JAX-WS 开发web服务
近日在学习Rogers Candenhead的第六版的<Java 入门经典>第22章.利用JAX-WS 开发web服务,简略总结而言主要包括以下几个步骤: 1.定义服务端点接口类: 主要就 ...
- 利用百度地图WEB服务APIGeoCoding API批量地址解析
Geocoding API包括地址解析和逆地址解析功能: 地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.3 ...
- winform客户端利用webClient实现与Web服务端的数据传输
由于项目需要,最近研究了下WebClient的数据传输.关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问.无外乎客户端发送请求,服务端处 ...
- 利用OpenShift托管Node.js Web服务进行微信公众号开发
最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...
- 利用 Apache Synapse 模拟 Web 服务
Apache Synapse 是一个简单.轻量级的高性能企业服务总线 (ESB),它是在 Apache Software Foundation 的 Apache License Version 2.0 ...
- 利用python httplib模块 发送Post请求测试web服务是否正常起来!
最近在学习python,恰好老大最近让我搞个基于post请求测试web服务是否正常启用的小监控,上网查了下资料,发现强大的Python恰好能够用上,所以自己现学现卖,顺便锻炼下自己. 由于本人也刚接触 ...
- 前端利用百度开发文档给的web服务接口实现对某个区域周边配套的检索
最近项目需要实现地图功能,以便于实现对房源周边配套设施的检索.内容如下 其实百度官方有对应的api,但是对于一个网站来说这样的样式难免有些难看 这样的结果显然不能满足当下的需求,所以我决定利用官方给的 ...
- 尝试利用CentOS环境安装LiteSpeed WEB服务环境的过程
对于普通的网站搭建的环境虚拟主机就足够使用,不过近期公司的网站需要上线VPS主机,于是采用到LNMP(http://lnmp.org/)一键包安装的,运行还是比较好的,这不最近我也开始尝试接触VPS方 ...
- 利用Web服务生成产品编号 执行添加操作
为什么我想要执行添加操作,却添加不成功,系统提示我comm.ExecuteNonQuery有错误 已找到原因 在 string strsql = "insert into tb_goods( ...
- 利用Httponly提升web应用程序安全性
随着www服务的兴起,越来越多的应用程序转向了B/S结构,这样只需要一个浏览器就可以访问各种各样的web服务,但是这样也越来越导致了越来越 多的web安全问题.www服务依赖于Http协议实现,Htt ...
随机推荐
- 记本地新建一个gradle方式springboot项目过程
打算使用gradle在idea新建个springboot项目,然后坑很多,记录一下 原来我的idea应该是社区版,新建项目时候没有可以选择spring相关配置,然后卸载了重装,之前问题是启动是启动起来 ...
- Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC
Javabase64macmd5sha 加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实 ...
- 怎么实现Redis的高可用?(主从、哨兵、集群)
高可用有两个含义:一是数据尽量不丢失,二是保证服务尽可能可用. AOF 和 RDB 数据持久化保证了数据尽量不丢失,那么多节点来保证服务尽可能提供服务. 一般在实际生产中,服务不会部署成单节点,主要是 ...
- spring boot2集成api文档工具swagger-ui(上)
说明 第一步:创建项目 浏览器打开:https://start.spring.io/,生成一个spring boot项目 点击Generate这个按钮,下载项目包文件 第二步:导入开发工具 打开下载目 ...
- linux系统必备软件
linux系统必备软件 需要配置好epel源 必须安装的工具 tree vim wget bash-completion bash-completion-extras lrzsz net-tools ...
- Spring Boot学习日记6
@SpringBootConfiguration:SpringBoot的配置 @Configuration: spring配置类 @Component:说明这也是一个spring的组件 @Enable ...
- Activity系列博客5篇
目录介绍 01.前沿介绍 02.handleLaunchActivity 03.performLaunchActivity 04.activity.attach 05.Activity的onCreat ...
- Linux快速入门(八)效率工具(SSH)
环境 (1)Kali(源主机),IP:10.211.55.4/24 (2)Ubuntu(目标主机),IP:10.211.55.5/24 SSH OpenSSH用于在远程系统上安全的运行Shell,假设 ...
- 基于PyQGIS实现遥感影像下载
1. 引言 之前的文章:QGIS中下载遥感影像的Python代码片段 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com),记述了在 QGIS 的 Python Console 中使用Py ...
- 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.安全特性 在上篇文章中,我们了解到HTTP在通信过程中,存在以下问题: 通信使用明文(不加密),内容可能被窃听 不验证通信方的身份,因 ...