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

  

如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在实际应用过程中,我们可能需要限流的层面不仅限于接口。可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。呢么,这个时候我们就不得不手工定义需要限流的资源点,并配置相关的限流策略等内容了。

自定义资源点

下面的例子基于您已经引入了春云阿里巴巴前哨为基础,如果您还不会这些,建议优先阅读《使用前哨实现接口限流》。

第一步:在应用主类中增加注解支持的配置:

 @SpringBootApplication
  public  class  TestApplication  {
  
  ,,,public  static  void  main (String [], args), {
  ,,,,,,,SpringApplication.run (TestApplication.class, args);
  ,,,}
  
  ,,,//,注解支持的配置Bean
  ,,@ bean
  ,,,public  SentinelResourceAspect  sentinelResourceAspect (), {
  ,,,,,,,return  new  SentinelResourceAspect ();
  ,,,}
  
  }

第二步:在需要通过哨兵来控制流量的地方使用<代码> @SentinelResource 注解,比如下面以控制服务逻辑层的某个方法为例:

 @Slf4j
  @ service
  public  class  TestService  {
  
  ,,,@SentinelResource (=value “doSomeThing")
  ,,,public  void  doSomeThing (String  str), {
  ,,,,,,,log.info (str);
  ,,,}
  
  }

到这里一个需要被保护的方法就定义完成了。下面我们分别说说,定义了资源点之后,我们如何实现不同的保护策略,包括:限流,降级等。

如何实现限流与熔断降级

在定义了资源点之后,我们就可以通过仪表板来设置限流和降级策略来对资源点进行保护了。同时,也可以通过<代码> @SentinelResource>

实现限流控制

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

 @RestController
  public  class  TestController  {
  
  ,,@ autowired
  ,,,private  TestService  testService;
  
  ,,,@GetMapping (“/hello")
  ,,,public  String  hello (), {
  ,,,,,,,estService.doSomeThing (“hello “, +, new 日期());
  ,,,,,,,return “didispace.com";
  ,,,}
  
  }

第二步:启动测试应用,启动Sentinel-Dashboard。发一个请求到<代码>/你好接口上,使得Sentinel-Dashboard上可以看到如下图所示的几个控制点:

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

可以看的到,除了如之前入门实例中那样有<代码>/你好> doSomeThing 资源点。可以通过界面为这个资源点设置限流规则,比如将其每秒设置为2。由于<代码>/你好> /你好接口,就可以直接模拟调用<代码> doSomeThing 资源,来观察限流规则是否生效。

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

/> </p> <p>此时,服务端的控制台也会有对应的限流报错日志:</p> <pre> 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],拷贝context  with  path  [], threw  exception  [Request  processing 失败;,nested  exception  is  java.lang.reflect.UndeclaredThrowableException], with  root 原因
  
  com.alibaba.csp.sentinel.slots.block.flow.FlowException:空</pre> <h4>实现限流的异常处理</h4> <p>默认情况下,哨兵对控制资源的限流处理是直接抛出异常,也就是上一节中贴出的日志内容。在没有合理的业务承接或者前端对接情况下可以这样,但是正常情况为了更好的用户业务,都会实现一些被限流之后的特殊处理,我们不希望展示一个生硬的报的错。那么只需要基于上面的例子做一些加工,比如:<h2 class=如何使用@SentinelResource注解灵活的定义控制资源以及如何配置控制策略