1、父工程创建
2、支付模块构建和热部署
3、消费者订单模块
4、服务注册中心-Eureka
5、zookeeper没学习
6、服务注册中心-Consul
7、Eureka、Consul异同
8、服务调用-Ribbon
9、服务调用-OpenFeign
10、服务降级-Hystrix
11、服务降级-Hystrix(二)
12、服务熔断-Hystrix
13、服务网关-Gateway
14-17 在git上做配置中心,没有学习
17、请求链路跟踪-Sleuth
18、Spring Cloud Alibaba-Nacos注册中心与配置中心
19、Spring Cloud Alibaba-Nacos集群和持久化配置
20、Sentinel流控
21、Sentinel熔断降级、热点key限流
22、SentinelResource配置
23、Sentinel 服务熔断与持久化
慢调用比例
请求的响应时间大于RT(最大响应时间)则统计为慢调用。当单位统计时(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
时间窗口结束,熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断
异常比例
当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断
时间窗口结束,熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数
当单位统计时长内的异常数目超过阈值之后会自动进行熔断
经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断
进一步的说明
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。
在cloudalibaba-sentinel-service8401的Controller中新增加一个方法
@GetMapping("/testD")
public String testD() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "TestD";
}
慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。链接
说明:
设置的最大响应时间为200ms
比例阈值为0.5 取值范围为[0.0 ~ 1.0](0% ~ 100%)
熔断时长为 1s(为了更好的观察现象,建议设置大一些)
统计时长 1000ms
最小请求数5
Postman测试:
在线程刚运行完后立刻访问http://localhost:8401/testD,显示”Blocked by Sentinel (flow limiting)“,一秒后访问返为”TestD“
添加一个方法
@GetMapping("/testE")
public String testE() {
int a= 10/0;
log.info("testD 测试RT");
return "Test E";
}
当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
说明:
比例阈值为0.6 取值范围为[0.0 ~ 1.0](0% ~ 100%)
熔断时长为 3s(设置长一点,更方便看到返回的信息)
统计时长 1000ms
最小请求数5
在线程刚运行完后立刻访问http://localhost:8401/testE,显示”Blocked by Sentinel (flow limiting)“,三秒后访问返为”There was an unexpected error (type=Internal Server Error, status=500). / by zero“
当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断
说明:
异常数为7
熔断时长为 3s(设置长一点,更方便看到返回的信息)
统计时长 1000ms
最小请求数5
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式
热点限流的内容可以看【com.alibaba.csp.sentinel.slots.block.BlockException】这个类
默认与自定义
之前的例子中,使用的都是sentinel系统默认的提示”Blocked by Sentinel (flow limiting)“
我们也可以自定义:
使用@SentinelResource注解
/**
* value:名称唯一,在添加资源时做区分
* blockHandler : 兜底方法
*/
@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) {
return "------testHotKey";
}
/**兜底方法*/
public String deal_testHotKey (String p1, String p2, BlockException exception) {
return "------deal_testHotKey,o(╥﹏╥)o";
}
说明:
当方法testHotKey里面第一个参数的QPS超过每秒1次,作降级处理
测试
当快速点击访问以下两个请求时,会降级处理
http://localhost:8401/testHotKey?p1=a
http://localhost:8401/testHotKey?p1=a&p2=b
当快速点击访问以下请求时,没有任何一场
http://localhost:8401/testHotKey?p2=a
使用热点限流
这两种都可以完成热点限流,但是一定要使用第一个,自己写兜底方法的。
因为第二个当达到限流条件时,前端访问直接返回ErrorPage
上个例子演示了第一个参数p1,当QPS超过1秒1次点击后马上被限流。
但是现在我们既想这个参数被限流,又想这个参数不被限流(嘿嘿)
我们期望p1参数只有当它是某个特殊值的时候,它的限流值和平时不一样
http://localhost:8401/testHotKey?p1=5 不降级
http://localhost:8401/testHotKey?p1=3 降级
当p1等于5的时候,阈值变为200
当p1不等于5的时候,阈值就是平常的1
注意:参数必须是基本类型或者String