文章目录
简介
![](../md/springcloud/images/8.png)
服务降级,雪崩,熔断,限流
分为两个部分
- 核心库java客户端,不依赖任何库,能运行于所有java运行时环境,对dubbo和springcloud也有很好地支持。
- 控制器dashboard基于springboot,打包后直接运行。
演示工程 8401
- yml:
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719 #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口
management:
endpoints:
web:
exposure:
include: '*'
- 主启动加**@EnableDiscoveryClient**
*注意,sentinel默认懒加载,只有访问过一次才会被监控
流控
流控规则:
-
快速失败:配置,若1s内1次就ok,超过就报错
-
关联:a关联b,b超过限制,a报错
-
链路:多个请求调用了同一个微服务
流控效果:
-
快速失败:直接报错
-
预热:默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值。
-
排队等待:匀速排队,阈值必须设置为QPS。
降级规则—前提1s内持续进入5个请求
-
RT平均响应时间,对应时刻的平均响应时间都超过阈值,则在接下来的时间窗内,服务会被熔断,抛出DergradeException,默认最大RT上限是4900ms。
-
异常比例:每秒异常总数占通过量的比值超过阈值,进入降级状态。
-
异常数:近一分钟内的异常数目超过阈值,时间窗口一定要大于等于60s。
热点key限流
- 统计传入参数中的热点参数,并根据配置的限流阈值与模式,对且仅对包含热点参数的资源调用进行限流。BlockException exception
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey") public String testHotKey(
@RequestParam(value = "p1",required = false) String p1, @RequestParam(value = "p2",required = false) String p2) {
//int age = 10/0;
return "------testHotKey";
}
- 参数例外项
希望热点参数在某个特殊值时限流参数和平时不一样,进行配置。
系统规则—应用于系统维度
-
Load自适应:仅可用于Unix-like机器,用系统的load1作为启发指标
-
CPU usage:CPU使用率
-
平均RT
-
并发线程数
-
入口QPS
@SentinelResource
自定义限流处理逻辑BlockingException!!!一定注意处理函数参数必须一致!
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handlerException2")
public CommonResult customerBlockHandler() {
return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));
}
Sentinel三大核心API
SphU定义资源,Tracer定义统计,ContextUtil定义上下文。
feign整合
- yml
server:
port: 84
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
service-url:
nacos-user-service: http://nacos-payment-provider
#对Feign的支持
feign:
sentinel:
enabled: true
持久化
- yml添加Nacos数据源配置
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataid: ${spring.application.name}
groupid: DEFAULT_GROUP
data-type: json
rule-type: flow
- 在nacos服务器添加
[ { “resource”: “/retaLimit/byUrl”, “limitApp”: “default”, “grade”: 1, “count”: 1, “strategy”: 0, “controlBehavior”: 0, “clusterMode”: false } ]