关于Sentinel(二)

  • Post author:
  • Post category:其他




关于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的应用就先介绍到这里,文中有不足的地方请各方大牛指正,感谢~



版权声明:本文为weixin_45341429原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。