系统保护:微服务架构雪崩效应与服务限流
系统保护:微服务架构雪崩效应与服务限流
前面我们介绍了 OpenFeign 微服务间通信与 Spring Cloud Gateway 网关通信,这些是日常业务中的正常处理情况,但是在微服务环境下受制于网络、机器性能、算法、程序各方面影响,运行异常的情况也在显著提升,如果不做好异常保护,微服务架构就像空中楼阁一样随时可能会崩溃,从本节我们开始一个新话题:微服务的系统保护。通过这个话题,我们就可以了解在 Spring Cloud Alibaba 生态下解决雪崩等一系列危机整体架构安全的方法。
先来对 Alibaba Sentinel 做入门讲解,涉及三方面内容:
通过真实的生产案例讲解微服务的雪崩效应;
Alibaba Sentinel 的部署与配置;
配置的接口限流规则。
微服务的雪崩效应
一次线上的服务雪崩事故
雪崩”一词指的是山地积雪由于底部溶解等原因造成的突然大块塌落的现象,具有很强的破坏力。在微服务项目中指由于突发流量导致某个服务不可用,从而导致上游服务不可用,并产生级联效应,最终导致整个系统不可用,使用雪崩这个词来形容这一现象最合适不过。
为什么微服务会产生雪崩效应
如下图所示,假如我们开发了一套分布式应用系统,前端应用分别向 A/H/I/P 四个服务发起调用请求:
但随着时间推移,假如服务 I 因为优化问题,导致需要 20 秒才能返回响应,这就必然会导致 20 秒内该请求线程会一直处于阻塞状态。
但是,如果这种状况放在高并发场景下,就绝对不允许出现,假如在 20 秒内有 10 万个请求通过应用访问到后端微服务。容器会因为大量请求阻塞积压导致连接池爆满,而这种情况后果极其严重!轻则“服务无响应”,重则前端应用直接崩溃。
以上这种因为某一个节点长时间处理导致应用请求积压崩溃的现象被称为微服务的“雪崩效应”。
当大量线程积压后,前端应用崩溃,雪崩效应产生。
如何有效避免雪崩效应?
刚才我们分析了雪崩效应是因为出现瞬间大流量+微服务响应慢造成的。针对这两点在架构设计时要采用不同方案。
采用限流方式进行预防:可以采用限流方案,控制请求的流入,让流量有序的进入应用,保证流量在一个可控的范围内。
采用服务降级与熔断进行补救:针对响应慢问题,可以采用服务降级与熔断进行补救。服务降级是指当应用处理时间超过规定上限后,无论服务是否处理完成,便立即触发服务降级,响应返回预先设置的异常信息。
这么说有些晦涩,以下图为例。在用户支付完成后,通过消息通知服务向用户邮箱发送“订单已确认”的邮件。假设消息通知服务出现异常,需要 10 秒钟才能完成发送请求, 这是不能接受的。为了预防雪崩,我们可以在微服务体系中增加服务降级的功能,预设 2 秒钟有效期,如遇延迟便最多允许 2 秒,2 秒内服务未处理完成则直接降级并返回响应,此时支付服务会收到“邮件发送超时”的错误信息。这也就意味着消息通知服务最多只有两秒钟的处理时间。处理结果,要么发送成功,要么超时降级。因此阻塞时间缩短,产生雪崩的概率会大大降低。
通过服务降级减少阻塞时间
Alibaba Sentinel
有了解决问题的方案,下面咱们就可以聊聊落地实现的事情。在 Spring Cloud Alibaba 生态中有一个重要的流控组件 Sentinel。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征。
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其他开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 整合只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 配置入门Sentinel 分为两个部分:Sentinel Dashboard和Sentinel 客户端。
Sentinel Dashboard:Sentinel Dashboard 是 Sentinel 配套的可视化控制台与监控仪表盘套件,它支持节点发现,以及健康情况管理、监控(单机和集群)、规则管理和推送的功能。Sentinel Dashboard 是基于 Spring Boot 开发的 WEB 应用,打包后可以直接运行,目前最新版本为 1.8.0。
Sentinel 客户端:Sentinel 客户端需要集成在 Spring Boot 微服务应用中,用于接收来自 Dashboard 配置的各种规则,并通过 Spring MVC Interceptor 拦截器技术实现应用限流、熔断保护。
部署 Sentinel Dashboard(仪表盘)
访问:https://github.com/alibaba/Sentinel/releases,下载最新版 Sentinel Dashboard。
利用下面的命令启动 Dashboard。
java -jar -Dserver.port=9100 sentinel-dashboard-1.8.0.jar
即可看到相应的页面。
微服务内置 Sentinel 客户端
第一步,利用 Spring Initializr 向导创建 sentinel-sample 工程,pom.xml 增加以下三项依赖
<!-- Nacos客户端Starter-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Sentinel客户端Starter-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 对外暴露Spring Boot监控指标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
第二步,配置 Nacos 与 Sentinel 客户端。
spring:
application:
name: sentinel-sample #应用名&微服务id
cloud:
sentinel: #Sentinel Dashboard通信地址
transport:
dashboard: 上面地址
eager: true #取消控制台懒加载
nacos: #Nacos通信地址
server-addr: nacosaddr
username: nacos
password: nacos
server:
port: 80
management:
endpoints:
web: #将所有可用的监控指标项对外暴露
exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项
include: '*'
第三步,验证配置。
访问下面网址,在 Sentinel Dashboard 左侧看到 sentinel-sample 服务出现,则代表 Sentinel 客户端与 Dashboard 已经完成通信。
配置限流规则
第一步,在 sentinel-sample 服务中,增加 编写Controller 类,用于演示 Sentinel 限流规则。
启动服务,无论访问多少次,都是一个结果
第二步,访问 Sentinel Dashboard 配置限流规则。
在左侧找到簇点链路,右侧定位到 /url,点击后面的“流控”按钮。
设置接口流控规则
在弹出界面,按下图配置,其含义为 /test_flow_rule 接口每秒钟只允许 1QPS 访问,超出的请求直接服务降级返回异常。最后点击“新增”完成规则设置。
此时针对 /url 接口的流控规则已生效,可以在“流控规则”面板看到。
第三步,验证流控效果。
重新访问接口,浏览器反复刷新。
第一次刷新时处理成功。
同一秒内再次刷新便会出现 “Blocked by Sentinel (flow limiting)”,代表服务已被限流降级。