针对电商系统,在遇到大流量时,必须要考虑如何保障系统的稳定运行,常用的手段:限流,降级,拒绝服务。
一、限流
限流算法:计数器、滑动窗口、漏铜算法、令牌桶算法。
限流的方案
- 前端限流
- 接入层 nginx 限流
- 网关限流
- 应用层限流
网关限流
限流方式:
- 同一个ip的访问频率
- 接口QPS
- 黑白名单
1. 基于 redis+lua 脚本限流
gateway 官方提供了Spring Cloud Gateway(RequestRateLimiter 过滤器工厂) ,基于 redis+lua 脚本方式,采用令牌桶算法实现了限流。
具体使用可以参考 微服务专题 Spring Cloud Gateway 实战。
2. 整合 sentinel 限流
2.1 接入Sentinel步骤
(网关服务指的是电商系统中的tulingmall-gateway模块)
- 下载Sentinel客户端包,启动
- 服务中引入Sentinel依赖:
<!--添加 Sentinel 的依赖--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!-- gateway 接入 sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>
- 修改 application.yml 配置,配置Sentinel
4. 测试, 启动网关服务,商品服务,访问Sentinel客户端
2.2 限流配置方式
1. 请求QPS、请求线程数
2. 请求属性
3. API维度(实际一般都是对这个做限流配置)
2.3 Sentinel规则持久化配置
Sentinel规则默认保存在内存中,如果Sentinel控制台服务宕机了,规则就会丢失,所以需要将Sentinel规则持久化。
持久化改造步骤:
1. 引入sentinel-datasource-nacos依赖
2. 增加数据源、配置中心等配置
3. 启动持久化改造后的 Sentinel 控制台
指定端口和 nacos 配置中心地址:
java -Dserver.port=8000 -Dsentinel.nacos.config.serverAddr=192.168.65.103:8848 -jar
tulingmall-sentinel-dashboard-1.8.4.jar
应用层限流
微服务接入Sentinel, 比如商品服务tulingmall-product, 接入过程同网关服务接入过程一致。
限流场景_热点参数限流
二、熔断 / 降级
降级就是当系统的容量达到一定程度时,限制或者关闭系统的某些非核心功能,从而把有限的资源保留给更核心的业务。
降级策略
1. 自动运维
2. 功能维度
3. 系统层次维度
整合Sentinel降级
1.在跨服务调用时,OpenFeign整合Sentinel, 并实现降级后的业务功能。
2. 配置降级规则
基于响应时间:
基于异常数:
三、拒绝服务
拒绝服务可以说是一种不得已的兜底方案,用以防止最坏情况发生,防止因把服务器压跨而长时间彻底无法提供服务。 系统直接拒绝所有请求的示例:
- CPU 使用率达到90%
- 系统 load 值达到 2*CPU 核数时
配置方式:
- Nginx 上设置过载保护:阿里开发的nginx过载保护插件sysguard :https://github.com/alibaba/nginx-http-sysguard
-
Sentinel 提供了系统规则限流
Sentinel 系统自适应限流 从 整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。