企业建站公司推荐,什么是网站收录,望野古诗朗读,网页编辑软件免费版1. SentinelRecourse配置回顾
通过之前的学习#xff0c;我们知道SentinelRecourse配置的资源定位可以通过两种方式实现#xff1a;一种是URL#xff0c;另一种是资源名称。这两种限流方式都要求资源ID唯一
RestController
public class RateLimitController {GetMapping(…1. SentinelRecourse配置回顾
通过之前的学习我们知道SentinelRecourse配置的资源定位可以通过两种方式实现一种是URL另一种是资源名称。这两种限流方式都要求资源ID唯一
RestController
public class RateLimitController {GetMapping(/byResource)SentinelResource(value byResource,blockHandler handleException)public CommonResult byResource() {return new CommonResult(200,按资源名称限流测试OK,new Payment(2020L,serial001));}public CommonResult handleException(BlockException exception) {return new CommonResult(444,exception.getClass().getCanonicalName()\t 服务不可用);}
}2. 自定义降级处理方法
通过查看上面的代码我们不难发现现有的兜底方案面临的问题
系统默认的没有体现我们自己的业务要求。依照现有条件我们自定义的处理方法又和业务代码耦合在一块不直观。每个业务方法都添加—个兜底的那代码膨胀加剧。全局统—的处理方法没有体现。
这时我们就需要定义自己的降级处理类将我们自定义的降级处理方法放在一个统一的类中进行管理从而将降级方法抽象出来以便之后的方法复用并且实现降级处理方法和现有业务逻辑代码的解耦
1. 创建自定义限流方法处理类CustomerBlockHandler
package com.atguigu.alibaba.sentinel.myhandler;import com.atguigu.springcloud.entities.CommonResult;/*** author 强浩* className* date 2022年09月06日*/
public class CustomerBlockHandler {public static CommonResult handlerException(BlockException exception){return new CommonResult(4444,按客户自定义global CustomerBlockHandler ---- handlerException);}public static CommonResult handlerException2(BlockException exception){return new CommonResult(5555,按客户自定义global CustomerBlockHandler ---- handlerException2);}
}2. 在需要进行限流的业务处理类中指定创建好的业务降级兜底处理类和处理方法
package com.atguigu.alibaba.sentinel.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.atguigu.alibaba.sentinel.myhandler.CustomerBlockHandler;
import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** author 强浩* className* date 2022年09月06日*/
RestController
Slf4j
public class RateLimitController {RequestMapping(/rateLimit/customerBlockHandler)SentinelResource(value customerBlockHandler,blockHandlerClass CustomerBlockHandler.class,//-------- 自定义限流处理类blockHandler handlerException)//-----------指定限流降级处理方法public CommonResult customerBlockHandler(){return new CommonResult(200,按用户自定义, new Payment(2022L,serial001 ));}
}3. Sentinel控制台配置将customerBlockHandler加入到sentinel的限流控制中
启动微服务后先调用一次 - http://localhost:8401/rateLimit/customerBlockHandler。然后多次快速刷新http://localhost:8401/rateLimit/customerBlockHandler。刷新后我们自定义兜底方法的字符串信息就返回到前端。
3. SentinelRecourse注解详解
注意注解方式埋点不支持 private 方法。 SentinelResource 用于定义资源并提供可选的异常处理和 fallback 配置项。 SentinelResource 注解包含以下属性 value资源名称必需项不能为空 entryTypeentry 类型可选项默认为 EntryType.OUT blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称可选项。blockHandler 函数访问范围需要是 public返回类型需要与原方法相匹配参数类型需要和原方法相匹配并且最后加一个额外的参数类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数则可以指定 blockHandlerClass 为对应的类的 Class 对象注意对应的函数必需为 static 函数否则无法解析。 fallback /fallbackClassfallback 函数名称可选项用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常除了exceptionsToIgnore里面排除掉的异常类型进行处理。fallback 函数签名和位置要求 返回值类型必须与原函数返回值类型一致方法参数列表需要和原函数一致或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数则可以指定 fallbackClass 为对应的类的 Class 对象注意对应的函数必需为 static 函数否则无法解析。 defaultFallbacksince 1.6.0默认的 fallback 函数名称可选项通常用于通用的 fallback 逻辑即可以用于很多服务或方法。默认 fallback 函数可以针对所有类型的异常除了exceptionsToIgnore里面排除掉的异常类型进行处理。若同时配置了 fallback 和 defaultFallback则只有 fallback 会生效。defaultFallback 函数签名要求 返回值类型必须与原函数返回值类型一致方法参数列表需要为空或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数则可以指定 fallbackClass 为对应的类的 Class 对象注意对应的函数必需为 static 函数否则无法解析。 exceptionsToIgnoresince 1.6.0用于指定哪些异常被排除掉不会计入异常统计中也不会进入 fallback 逻辑中而是会原样抛出。
Sentinel主要有三个核心Api
SphU定义资源Tracer定义统计ContextUtil定义了上下文