欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > [0633].第3-3节:@SentinueResource注解

[0633].第3-3节:@SentinueResource注解

2024/10/26 0:30:10 来源:https://blog.csdn.net/weixin_43783284/article/details/143029298  浏览:    关键词:[0633].第3-3节:@SentinueResource注解

我的后端学习大纲

SpringCloud学习大纲


是什么:

SentinueResource是一个流量防卫防护组件注解
用于指定防护资源,,对配置的资源进行流量控制、熔断降级等功能
@SentinueResource注解说明:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SentinelResource {//资源名称String value() default "";//entry类型,标记流量的方向,取值IN/OUT,默认是OUTEntryType entryType() default EntryType.OUT;//资源分类int resourceType() default 0;//处理BlockException的函数名称,函数要求://1. 必须是 public//2.返回类型 参数与原方法一致//3. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置blockHandlerClass ,并指定blockHandlerClass里面的方法。String blockHandler() default "";//存放blockHandler的类,对应的处理函数必须static修饰。Class<?>[] blockHandlerClass() default {};//用于在抛出异常的时候提供fallback处理逻辑。 fallback函数可以针对所//有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求://1. 返回类型与原方法一致//2. 参数类型需要和原方法相匹配//3. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass ,并指定fallbackClass里面的方法。String fallback() default "";//存放fallback的类。对应的处理函数必须static修饰。String defaultFallback() default "";//用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常进//行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求://1. 返回类型与原方法一致//2. 方法参数列表为空,或者有一个 Throwable 类型的参数。//3. 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置fallbackClass ,并指定 fallbackClass 里面的方法。Class<?>[] fallbackClass() default {};//需要trace的异常Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class};//指定排除忽略掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。Class<? extends Throwable>[] exceptionsToIgnore() default {};
}

启动Nacos

启动Sentinue

按照res地址限流 + 默认限流返回:

通过访问的res地址来限流,会返回Sentinue自带默认的限流处理信息

业务类RateLimitController

package com.atguigu.cloudalibaba.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class RateLimitController
{@GetMapping("/rateLimit/byUrl")public String byUrl(){return "按rest地址限流测试OK";}
}

访问一次

Sentinue控制台配置:

在这里插入图片描述

在这里插入图片描述

测试:
疯狂点击

  • 结果:
    • 会返回Sentinel自带的限流处理结果,默认
    • 会返回Sentinel自带的限流处理结果,默认
    • 会返回Sentinel自带的限流处理结果,默认 在这里插入图片描述

2、按照SentinueResource资源名称限流+自定义限流返回

不想用默认的限流提示(Blocked by Sentinue)

微服务cloudalibaba-sentinue-sentinue-service8401
业务类RateLimiController

package com.atguigu.cloudalibaba.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@GetMapping("/rateLimit/byUrl")public String byUrl(){return "按rest地址限流测试OK";}@GetMapping("/rateLimit/byResource")@SentinelResource(value = "byResourceSentinelResource",blockHandler = "handleException")public String byResource(){return "按资源名称SentinelResource限流测试OK";}public String handleException(BlockException exception){return "服务不可用@SentinelResource启动"+"\t"+"o(╥﹏╥)o";}
}

按照SentinueResource资源名称限流+自定义限流返回 + 服务降级处理

1.按SentinueResource配置,点击超过限流配置返回自定义限流提示 + 程序异常返回fallback服务降级

2.微服务cloudalibaba-sentinel-service8401
业务类RelateLimitController:

package com.atguigu.cloudalibaba.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class RateLimitController
{@GetMapping("/rateLimit/byUrl")public String byUrl(){return "按rest地址限流测试OK";}@GetMapping("/rateLimit/byResource")@SentinelResource(value = "byResourceSentinelResource",blockHandler = "handleException")public String byResource(){return "按资源名称SentinelResource限流测试OK";}public String handleException(BlockException exception){return "服务不可用@SentinelResource启动"+"\t"+"o(╥﹏╥)o";}@GetMapping("/rateLimit/doAction/{p1}")@SentinelResource(value = "doActionSentinelResource",blockHandler = "doActionBlockHandler", fallback = "doActionFallback")public String doAction(@PathVariable("p1") Integer p1) {if (p1 == 0){throw new RuntimeException("p1等于零直接异常");}return "doAction";}public String doActionBlockHandler(@PathVariable("p1") Integer p1,BlockException e){log.error("sentinel配置自定义限流了:{}", e);return "sentinel配置自定义限流了";}public String doActionFallback(@PathVariable("p1") Integer p1,Throwable e){log.error("程序逻辑异常了:{}", e);return "程序逻辑异常了"+"\t"+e.getMessage();}}
  • 3.配置流控规则:
    图形配置和代码关系:

表示1秒钟内查询次数大于1,就跑到我们自定义的处流,限流

测试:

1秒钟点击1下,OK

超过上述,疯狂点击,返回了自定义的限流处理信息,限流发生,配合了sentinue设定的规则

p1参数为0,异常发生,返回自己定义的服务降级处理

总结:

blockHandler:主要针对sentinue配置后出现的违规情况处理
fallback:程序异常了,jvm抛出的异常服务降级
两者可共存

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com