关于Sentinel(二)
Sentinel降级应用
概述
Sentinel熔断降级会在调用某个链路中某个资源时,出现不稳定状态,比如请求超时,异常比例升高,这时就会对此资源进行调用限制,让请求快速失败,避免影响其他请求出现级联错误,当资源被降级后,在接下来 的降级窗口之内,对该资源的调用都自动熔断,(默认行为是抛出DegradeException)
测试准备
在ProviderSentinelController中创建doSentinel05方法
// 支持线程安全的自增自减操作
private AtomicLong aLong = new AtomicLong(1);
@GetMapping("/sentinel05")
public String doSentinel05() throws InterruptedException {
// 获取自增对象的值然后在加1
long num = aLong.getAndIncrement();
if(num % 2 == 0){
Thread.sleep(200);
}
return "sentinel05 test";
}
此类模拟当访问超时时的状态
设置Sentinel
默认是慢调用比例,就是访问超时比例
解释:
最大RT(Response Time):最大响应时间.
比例阈值:响应比例为30%时起作用
熔断时常:熔断后,过多久可再次访问,手滑了多按了一个0
最小请求数:每1000毫秒内发送3次及以上请求
统计时常:1000ms
快速刷新请求页面
此时可在自己写的访问异常业务中打断点看是否抛出DegradeException异常.
Sentinel热点应用
概述
热点是什么?就是我们所谓的微博热搜,头条热搜等,某个访问达到非常大的访问量的时候,为了保证服务的正常访问,这时就需要进行热点限流.Sentinel利用LRU策略统计最近最长访问的热点参数,结合令牌桶算法进行参数级别的流控
测试准备
在ProviderSentinelController中添加doSentinel06方法
@GetMapping("/sentinel06")
public String doSentinel06(Integer id){
return resourceService.doGetResource(id);
}
这里需要在写一个带有参数id的doGetResource方法
public static String doHandle(Integer id,BlockException exception){
log.error("block exception{}", exception.getMessage());
return "服务器繁忙";
}
修改service业务
@SentinelResource(value = "doGetResource",
blockHandlerClass = ResourceBlockHandler.class,
blockHandler = "doHandle")
public String doGetResource(Integer id){
return "test id:" + id;
}
注意:被@Sentinel注解标注的方法参数列表要与请求方法参数列表相同
设置Sentinel
解释:
参数索引:指的是服务请求的参数下标值,默认从0开始,我们只设置了一个参数id,那这里指的就是id
单机阈值:该请求请求1次就被限流.
统计窗口时常:在2秒时间内完成1次请求
设置好之后进行测试
注意请求链路要加参数id随意赋个值即可,刷新此页面,就被限流了
点击高级选项,即可设置自定义参数值以及自定义多个参数值
解释:
添加了三个参数分别是id等于10,20,30,分别对应的限流阈值是1,10,20.大家可以修改请求链路分别测试.
Sentinel授权规则
概述
授权,即给予符合所设置链路格式的访问权限,不符合的就被限制,接下来我们基于参数的问题进行测试
创建DefaultRequestOriginParser类,此类需要实现RequestOriginParser
import javax.servlet.http.HttpServletRequest;
@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
String name = httpServletRequest.getParameter("name");
return name;
}
}
设置Sentinel
解释:
在流控应用这里,设置参数的值比如jack,rose等,自己设置即可,注意用逗号隔开
授权类型:黑名单即,访问链路中的参数为设置的参数,那么就会被限制,白名单即,满足设置的参数值的链路才可访问.
自己设置试一下.
除了根据参数设置,还可以通过获取IP以及请求头等方式进行授权.
Sentinel的应用就先介绍到这里,文中有不足的地方请各方大牛指正,感谢~