Sentinel(服务限流/降级/授权)
2021-03-11 18:45:13 2 举报
AI智能生成
Sentinel(服务限流/降级/授权)
作者其他创作
大纲/内容
流控
流控模式
直接
对当前访问资源限流
关联
关联资源影响当前限流
链路
只限制指定链路上的流量
流控效果
快速失败
直接抛异常
Warm Up
指定时间内只开放阈值的1/3
指定时间过去后阈值完全开放
排队等待
调用失败时不会立马抛异常,而是排队等待
指定毫秒间隔后再次调用,再失败才抛异常
降级
降级策略
RT
单个请求的响应时间超过阈值,则进入准降级状态,接下来 1 秒内连续 5 个请求响应时间均
超过阈值,就进行降级,持续时间为时间窗口的值(sentinel 1.8 后支持自定义最小请求数)
超过阈值,就进行降级,持续时间为时间窗口的值(sentinel 1.8 后支持自定义最小请求数)
时间窗口期过后,如果接下来的一个请求成功完成则结束熔断,否则会再次被熔断
异常比例
每秒内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则降级,持续时间为时窗口的值
时间窗口期过后,如果接下来的一个请求成功完成则结束熔断,否则会再次被熔断
异常数
1 分钟内的异常数超过阈值就进行降级处理,时间窗口的值要大于 60秒,否则刚结束熔断又进入下次熔断
热点
热点参数
热点参数限流 会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流
图示
代码
/**
* @SentinelResource: 指定资源名称,作用与 HystrixCommand 大体一致
* blockHandler: 指定降级处理方法,类似于 Hystrix的fallbackMethod 兜底方法
*/
@GetMapping("/testHotKeyRule")
@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")
public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password) {
return "[热点限流规则]testHotKeyRule..";
}
public String testHotKeyRule_blockHandler(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password,
BlockException exception) {
return "[热点限流规则-兜底方法]testHotKeyRule_blockHandler..";
}
* @SentinelResource: 指定资源名称,作用与 HystrixCommand 大体一致
* blockHandler: 指定降级处理方法,类似于 Hystrix的fallbackMethod 兜底方法
*/
@GetMapping("/testHotKeyRule")
@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")
public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password) {
return "[热点限流规则]testHotKeyRule..";
}
public String testHotKeyRule_blockHandler(@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password,
BlockException exception) {
return "[热点限流规则-兜底方法]testHotKeyRule_blockHandler..";
}
参数例外项
我们有时候期望我们的限流参数Key当它是某个特殊值时,它的限流值不一样
举例:比如我们的第一个参数username=wsh的时候,它的阈值可以达到500
举例:比如我们的第一个参数username=wsh的时候,它的阈值可以达到500
图示
授权
给指定的资源设置流控应用(追加参数),可以对流控应用进行访问权限的设置
实现 RequestOriginParser 接口
通过@Configuration使配置生效
具体就是在sentinel控制台添加白名单和黑名单
白名单:只有你能访问
黑名单:只有你不能访问
@SentinelResource
主要用来指定一个资源,配合sentinel控制台的流控规则实现降级处理
常用属性
fallback:如果程序发生Java异常,将执行我们指定的业务异常兜底降级方法
blockHandler:只针对违反控制台降级规则的情况,不处理运行时抛出的异常
exceptionsToIgnore:用于指定哪些异常被排除,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出
也可以结合OpenFeign,实现当远程调用失败后走降级处理逻辑
feign:
sentinel:
enabled: true # 激活Sentinel对Feign的支持
sentinel:
enabled: true # 激活Sentinel对Feign的支持
在@FeignClient中指定fallback属性
自定义限流处理逻辑
创建统一处理类
public class CustomBlockHandler {
public static JsonResult customBlockHandlerMethodA(BlockException exception) {
return new JsonResult(500, "[客户自定义限流处理逻辑]--->customBlockHandlerMethodA");
}
public static JsonResult customBlockHandlerMethodB(BlockException exception) {
return new JsonResult(500, "[客户自定义限流处理逻辑]--->customBlockHandlerMethodB");
}
}
public static JsonResult customBlockHandlerMethodA(BlockException exception) {
return new JsonResult(500, "[客户自定义限流处理逻辑]--->customBlockHandlerMethodA");
}
public static JsonResult customBlockHandlerMethodB(BlockException exception) {
return new JsonResult(500, "[客户自定义限流处理逻辑]--->customBlockHandlerMethodB");
}
}
@SentinelResource配置
@GetMapping("/customBlockHandler")
@SentinelResource(value = "customBlockHandler",
blockHandlerClass = CustomBlockHandler.class,
blockHandler = "customBlockHandlerMethodA")
public JsonResult customerBlockHandler() {
return new JsonResult(200, "客户自定义限流处理逻辑", new Payment(20200906L, UUID.randomUUID().toString()));
}
@SentinelResource(value = "customBlockHandler",
blockHandlerClass = CustomBlockHandler.class,
blockHandler = "customBlockHandlerMethodA")
public JsonResult customerBlockHandler() {
return new JsonResult(200, "客户自定义限流处理逻辑", new Payment(20200906L, UUID.randomUUID().toString()));
}
规则持久化
Sentinel Dashboard中添加的规则是存储在内存中的,只要服务重启流控规则就丢失了,生产环境需要将配置规则进行持久化
如何操作?
pom.xml 添加依赖
application.yml 配置
将sentinel配置的流控规则持久化进nacos,保证每次重启服务后资源对应的流控规则都不会消失
图示
资源隔离
隔离方式
QPS 隔离
信号量隔离
0 条评论
下一页