我的后端学习大纲
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抛出的异常服务降级
两者可共存