文章目录
- 常见服务调用异常
-
- 服务雪崩
- 服务限流
- 服务熔断
- 服务降级
- 服务熔断降级的方案
-
- 平均响应时间
- 异常比例
- 异常数量
- 常见的四种限流算法
-
- 计数器算法
- 滑动窗口限流算法
- 令牌桶限流算法
- 漏桶限流算法
- Sentinel
-
- 概述
-
- 部署Sentinel Dashboard
- Sentinel实战
-
- 使用SphU或SphO进行限流
- 使用@SentinelResource进行限流
-
- 限流规则和熔断规则参数解释
- Sentinel集成
-
- SpringCloud--Dashboard方式
- 限流异常和资源清晰
-
- 自定义URL限流异常
- URL资源清晰
- 集成Nacos
- 总结
常见服务调用异常
服务雪崩
- 一个服务失败,导致整条链路的服务都失败的情况
- 服务熔断和服务降级就可以视为解决雪崩的手段
服务限流
- 限流的主要的目的是通过限制并发访问数或者限制一个窗口内所允许处理的请求数量来保护系统,一旦达到限制流量,则对当前请求进行对应的拒绝策略。如:跳转错误页面,进入排队队列,服务降级。
服务熔断
当某个服务提供者无法正常为服务调用者提供服务时,为了防止服务雪崩,暂时将出现故障的接口隔离出来,后续一段时间内该服务调用者的请求都会直接失败,知道目标服务恢复正常
服务降级
- 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度
- 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户
- 服务降级大多是属于一种业务级别的处理。比如:开关降级(做一个开关配置放在配置中心,在配置中心更改开关,决定哪些服务进行降级)
服务熔断降级的方案
平均响应时间
比如1秒钟持续进入5个请求,对应时刻的平均响应时间均超过阈值,那么接下来在一个固定的时间窗口内,对这个方法的访问都自动熔断
异常比例
当某个方法每秒调用所获得的异常总数的比例超过设定的阈值,该资源会自动进入降级状态,也就是在接下来的一个固定时间窗口中,对这个方法的调用都会自动返回
异常数量
和异常比例类似,当某个方法在指定时间窗口内获得的异常数量超过阈值,会触发熔断
常见的四种限流算法
计数器算法
滑动窗口限流算法
令牌桶限流算法
漏桶限流算法
Sentinel
https://github.com/alibaba/Sentinel/wiki/介绍
概述
- 面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流,流量整形,服务降级,系统负载保护等多维度实现微服务的稳定性
部署Sentinel Dashboard
- 下载Sentinel源码或者直接下载release版本jar包
- 源码:https://github.com/alibaba/Sentinel
- jar包:https://github.com/alibaba/Sentinel/releases
-
命令启动Sentinel Dashboard
启动命令:
java -Dserver.port=8000 -Dcsp.sentinel.dashboard.server=localhost:8000 - Dproject.name=sentinel-dashboard -jar sentinel-dashboard-x.x.x.jar
- 访问控制台http://localhost:8000
用户名密码: sentinel
Sentinel实战
使用SphU或SphO进行限流
使用@SentinelResource进行限流
定义资源时,也可以使用@SentinelResource注解的方式,方便的进行资源管理。
- 首先:引入sentinel-annotation-aspectj依赖
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-annotation-aspectj</artifactId> <version>1.4.0</version> </dependency>
- 其次:编写Configuration配置类
- 第三:编写服务类
@SentinelResource(value = "process", blockHandler = "processBlockHandler",
fallback ="fallbackHandler")
public void process() {
...
...
}
限流规则和熔断规则参数解释
- FlowRule(限流规则)
- rule.setGrade() //限流阈值类型
- rule.setControlBehavior() // QPS流量流控行为
- rule.setStrategy() //调用关系限流策略
- DegradeRule(熔断规则)
- rule.setGrade() 熔断策略
Sentinel集成
SpringCloud–Dashboard方式
- 启动Sentinel Dashboard
java -Dserver.port=8000
-Dcsp.sentinel.dashboard.server=localhost:8000
-Dproject.name=sentinel-dashboard
-jar sentinel-dashboard-1.8.0.jar
- 在application.yml中添加如下配置
spring: application: name: sentinel-demo cloud: sentinel: transport: dashboard: 127.0.0.1:8000
- 配置簇点链路
限流异常和资源清晰
自定义URL限流异常
通过实现UrlBlockHandler接口,来重写blocked方法
URL资源清晰
通过实现UrlCleaner接口,重写clean方法
集成Nacos
- 配置启动Nacos
Nacos官网 https://nacos.io/zh-cn/docs/quick-start.html 下载安装包 https://github.com/alibaba/nacos/releases 启动Nacos sh startup.sh -m standalone 打开控制台 http://localhost:8848/nacos 用户名&密码为:nacos & nacos
- 在nacos中创建流量配置规则
[
{ "resource": "/withnacos",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"clusterMode": false
}
]
- 添加Nacos数据源的依赖包
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.7.0</version> </dependency>
- 在项目中application.yml中配置
spring:
application:
name: sentinel-nacos-demo
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8000
datasource:
- nacos:
server-addr: 127.0.0.1:8848
data-id: sentinel-nacos-demo-sentinel-flow
group-id: DEFAULT_GROUP
data-type: json
rule-type: flow