如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略

技术如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略,很多新手对此不是很清楚,为了帮助大家解决这个难

如何使用@SentinelResource注释灵活定义控制资源,以及如何配置控制策略,很多新手都不清楚。为了帮助大家解决这个问题,下面小编就为大家详细讲解一下。有这方面需求的可以借鉴,希望你能有所收获。

在实际应用中,我们可能需要将电流限制在不限于接口的水平。可能希望控制某个方法的调用电流限制和外部资源的调用电流限制。好了,这个时候,我们要手动定义需要限流的资源点,配置相关的限流策略。

00-1010下面这个例子是基于你已经介绍了春云阿里巴巴哨兵这个事实。如果还不知道这些,建议先看《使用Sentinel实现接口限流》。

步骤1:在应用主类中添加支持注释的配置:

@回弹应用

publicclassTestApplication{

publicationstativitmain(String[]args){ 0

springapplication . run(testapplication . class,args);

}

//注释支持的配置Bean。

@豆

public sentinel resources aspectsentinel resources aspect(){ 0

returnnewsentinelresourcespace();

}

}第二步:在需要Sentinel控制流量的地方使用@ Sentinel资源标注,例如,以一种控制Service逻辑层的方法为例:

@Slf4j

@服务

publicclassTestService{

@SentinelResource(值=' doSomeThing ')

publicationidsomething(Stringstr){ 0

log . info(str);

}

}这里定义了一个需要保护的方法。下面我们来谈谈在定义资源点之后,如何实施不同的保护策略,包括限流和降级。

自定义资源点

定义资源点后,可以通过Dashboard设置限流降级策略,保护资源点。同时,@SentinelResource还可以用来指定当电流限制和降级发生时的异常处理策略。接下来,让我们看看如何实现限流和降级。

00-1010步骤1:在Web层调用此受保护的方法:

@RestController

publicclassTestController{

@自动连线

privateTestServicetestService

@ GetMapping(“/hello”)

public stringhello(){ 0

estservice . dosometing(' hello ' new date());

return ' didis space.com;

}

}第二步:启动测试应用程序和Sentinel-Dashboard。向/hello接口发送请求,这样Sentinel-Dashboard就可以看到几个控制点,如下图所示:

isu.com/upload/information/20210524/347/779167.jpg" alt="如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略">

可以看到,除了如之前入门实例中那样有/hello资源点之外,多了一个doSomeThing资源点。可以通过界面为这个资源点设置限流规则,比如将其QPS设置为2。由于/hello资源不设置限流规则,所以只要请求/hello接口,就可以直接模拟调用doSomeThing资源,来观察限流规则是否生效。

下面可以通过任何你喜欢的工具来调用/hello接口,只要QPS超过2,那么就会出现如下的错误返回,代表限流策略生效了。

如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略

此时,服务端的控制台也会有对应的限流报错日志:

2019-06-27 11:30:43.514  INFO 36898 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : aaa
2019-06-27 11:30:43.905 ERROR 36898 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause
com.alibaba.csp.sentinel.slots.block.flow.FlowException: null

实现限流的异常处理

默认情况下,Sentinel对控制资源的限流处理是直接抛出异常,也就是上一节中贴出的日志内容。在没有合理的业务承接或者前端对接情况下可以这样,但是正常情况为了更好的用户业务,都会实现一些被限流之后的特殊处理,我们不希望展示一个生硬的报错。那么只需要基于上面的例子做一些加工,比如:

@Slf4j
@Service
public class TestService {
    @SentinelResource(value = "doSomeThing", blockHandler = "exceptionHandler")
    public void doSomeThing(String str) {
        log.info(str);
    }
    // 限流与阻塞处理
    public void exceptionHandler(String str, BlockException ex) {
        log.error( "blockHandler:" + str, ex);
    }
    
}

主要做了两件事:

  • 通过@SentinelResource注解的blockHandler属性制定具体的处理函数

  • 实现处理函数,该函数的传参必须与资源点的传参一样,并且最后加上BlockException异常参数;同时,返回类型也必须一样。

> 如果熟悉Hystrix的读者应该会发现,这样的设计与HystrixCommand中定义fallback很相似,还是很容易理解的。

完成上面的改动之后,再尝试访问接口(注意限流规则需要配置好),此时前端就不会返回异常信息了,后端会打印exceptionHandler中定义的日志输出。而在实际应用的时候,只要根据业务需要对限流请求做缓存或者前端提示等都可以基于此方法来实现。

实现熔断降级

@SentinelResource注解除了可以用来做限流控制之外,还能实现与Hystrix类似的熔断降级策略。下面就来具体看看如何使用吧。

第一步:与限流控制一样,使用@SentinelResource注解标记资源点,比如:

@Slf4j
@Service
public class TestService {
    @SentinelResource(value = "doSomeThing2")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常");
    }
}

这里在TestService类中创建了一个新的方法,并使用@SentinelResource将该资源命名为doSomeThing2。该方法会抛出异常,以配合后续制定基于异常比例的降级策略(类似Hystrix)。Sentinel相比Hystrix更丰富,还有基于响应时间和异常数的降级策略。

第二步:在Web层调用这个被保护的方法:

@RestController
public class TestController {
    @Autowired
    private TestService testService;
    @GetMapping("/hello2")
    public String hello2() {
        testService.doSomeThing2("hello2 " + new Date());
        return "didispace.com";
    }
}

第三步:启动测试应用,启动Sentinel-Dashboard。发一个请求到/hello2接口上,使得Sentinel-Dashboard上可以看到名为doSomeThing2的资源点。然后点击”降级“按钮,为该资源设置降级规则。这里使用异常比例策略,比例设置为0.5(即:50%的异常率),时间窗口设置为2(秒)。

如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略

第四步:验证熔断降级,根据上面的降级策略配置,当doSomeThing2方法的调用QPS >= 5,如果异常率超过50%,那么后续2秒内的调用将直接出发熔断降级,默认情况会直接抛出DegradeException异常,比如:

2019-06-27 17:49:58.913 ERROR 99863 --- [nio-8001-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.reflect.UndeclaredThrowableException] with root cause
com.alibaba.csp.sentinel.slots.block.degrade.DegradeException: null

熔断的降级处理

在Sentinel中定义熔断的降级处理方法非常简单,与Hystrix非常相似。只需要使用@SentinelResource注解的fallback属性来指定具体的方法名即可。这里也需要注意传参与返回必须一致。比如:

@Slf4j
@Service
public class TestService {
    // 熔断与降级处理
    @SentinelResource(value = "doSomeThing2", fallback = "fallbackHandler")
    public void doSomeThing2(String str) {
        log.info(str);
        throw new RuntimeException("发生异常");
    }
    public void fallbackHandler(String str) {
        log.error("fallbackHandler:">

完成上面的改造之后,重启应用,并设置doSomeThing2资源的熔断降级策略(使用异常百分比),然后频繁的请求/hello2接口。在QPS>=5之后,由于这个接口一直在抛出异常,所以一定会满足熔断降级条件,这时候就会执行fallbackHandler方法,不断的打印如下日志:

2019-06-27 23:44:19.432 ERROR 58471 --- [nio-8001-exec-1] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.599 ERROR 58471 --- [nio-8001-exec-2] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.791 ERROR 58471 --- [nio-8001-exec-3] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:19.975 ERROR 58471 --- [nio-8001-exec-4] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:19 CST 2019
2019-06-27 23:44:20.168 ERROR 58471 --- [nio-8001-exec-5] c.d.a.sentinel.service.TestService       : fallbackHandler:hello2 Thu Jun 27 23:44:20 CST 2019

更多注解属性说明

关于@SentinelResource注解最主要的两个用法:限流控制和熔断降级的具体使用案例介绍完了。另外,该注解还有一些其他更精细化的配置,比如忽略某些异常的配置、默认降级函数等等,具体可见如下说明:

  • value:资源名称,必需项(不能为空)

  • entryType:entry 类型,可选项(默认为 EntryType.OUT

  • blockHandler / blockHandlerClassblockHandler对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:

    • 返回值类型必须与原函数返回值类型一致;

    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。

    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:

    • 返回值类型必须与原函数返回值类型一致;

    • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。

    • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

> 注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandlerfallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/38065.html

(0)

相关推荐

  • 分享CSS3边框

    技术分享CSS3边框本篇内容主要讲解“分享CSS3边框”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分享CSS3边框”吧!浏览器支持实例使用图片创建围绕 div 元素的边框:

    攻略 2021年11月6日
  • python中dict用法(python里面dict的作用)

    技术怎么解析Python中的Dict这篇文章将为大家详细讲解有关怎么解析Python中的Dict,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是dict?dict全称

    攻略 2021年12月16日
  • 大众系列车型有哪些,大众哪几个系列的车是国产的

    技术大众系列车型有哪些,大众哪几个系列的车是国产的大众是德国生产的大众系列车型有哪些,分为一汽大众、上海大众、德国大众。“一汽大众”就是“中国一汽”与“德国大众”合作而产生的公司。“上海大众”就是“上海汽车制造厂”与“德

    生活 2021年10月26日
  • css和html的区别有哪些

    技术css和html的区别有哪些这篇文章主要介绍“css和html的区别有哪些”,在日常操作中,相信很多人在css和html的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css

    攻略 2021年11月9日
  • 抖音能刷粉吗,便宜刷抖音网站?

    技术抖音能刷粉吗,便宜刷抖音网站?首先,抖音刷粉是不违规的。这在行业内已经属于潜规则了。很多网红公司都在使用这类辅助工具。目前这类辅助工具,不违规,也不违法。可以放心使用。但是需要找到靠谱的代刷网,否则很可能被坑钱财。

    测评 2021年10月19日
  • 银氨溶液化学式,苯甲醛和银氨溶液的反应方程式

    技术银氨溶液化学式,苯甲醛和银氨溶液的反应方程式苯甲醛与银氨溶液反应方程式是HCHO+4Ag(NH3)2OH—△→(NH4)2CO3+4Ag↓+6NH3+2H2O银氨溶液化学式。 苯甲醛,甲醛的氢被苯取代后形成的有机化

    生活 2021年10月30日