sentinel
sentinel 配置
添加 sentinel 依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
yml中添加 参数
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
eager: true 使用自定义返回 信息
自定义 处理类
import com.alibaba.csp.sentinel.adapter.spring.webmvc_v6x.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.common.R;
import org.springframework.stereotype.Component;
import java.io.PrintWriter;
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, String s, BlockException e) throws Exception {
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
R error = R.error(500, s + "sentinel 限流了" + e.getClass());
String value = objectMapper.writeValueAsString(error);
writer.write(value);
writer.flush();
writer.close();
}
} 返回
{
"code": 500,
"msg": "/createsentinel 限流了class com.alibaba.csp.sentinel.slots.block.flow.FlowException",
"data": null
} 使用@SentinelResource 定义的资源
添加 兜底方法 --> blockHandler = "createOrderFallback"
@SentinelResource(value = "createOrder", blockHandler = "createOrderFallback") 创建 与 原方法签名相同的方法 ,命名为 上面指定的方法名
public Order createOrderFallback(Long productId, Long userId, BlockException e) {
Order order = new Order();
order.setId(0L);
order.setTotalAmount(new BigDecimal("0"));
order.setUserId(0L);
order.setNickName("未知用户");
order.setAddress("异常信息" + e.getClass());
return order;
} 当出现流控时
{
"id": 0,
"totalAmount": 0,
"userId": 0,
"nickName": "未知用户",
"address": "异常信息class com.alibaba.csp.sentinel.slots.block.flow.FlowException",
"products": null
} Openfeign调用
有fallback回调 使用 兜底回调,否则 使用 spring的全局异常处理
异常处理

Sphu 硬编码模式
try {
SphU.entry("createOrder");
// 流控规则
} catch (BlockException e) {
// 编码处理
throw new RuntimeException(e);
} 流控规则
对于 sentinel的 集群 阈值模式
单机均摊:限制的是 每一个 服务器的规则
总体阈值: 限制的是 集群 的规则
流控模式
直接 对资源进行直接的限制
关联
链路
yml中添加 web-context-unify: false
sentinel:
transport:
dashboard: 127.0.0.1:8080
eager: true
web-context-unify: false 设置 流控规则

虽说是 对 createOrder 资源进行的限制,但 实际 是 对方法 /seckill的流控限制。
关联

是关联资源的访问量大的时候,本资源就会被流控。

当 :writeDb 访问量大 ,readDb才会被流控。
直接
当超出设置的阈值,那么请求会被 丢弃。

快速失败 只允许设置的阈值数,其余的请求会失败。
预热(warm up):在预热时间内 逐步到达 阈值。最初的阈值 = 阈值/预热时长

warm up和排队等待 不能 使用 关联、链路 流控模式
熔断降级

有熔断:在通断期间的请求不会发送请求出去,直接使用 兜底回调
没有熔断:每个请求 都会发送到 下一级模块,请求失败,再调用 兜底回调。
热点参数限流
添加 注解
@SentinelResource(value = "seckill-order") 在sentinel->簇点链路 中 seckill-order 后 选择 热点。
在 sentinel->热点规则 中 seckill-order 选择 编辑。

限流为0,相当于 禁止访问。 返回 500 状态码的默认页。 如果 设置了 ,兜底返回 ,则是 兜底返回的数据
blockHandler 和 fallback区别
@SentinelResource(value = "seckill-order", blockHandler = "seckillFallback") sentinel 的流控 处理 顺序,先 blockHandler 后 fallback。
对于方法中 发生的异常,可以走 fallback。
兜底方法:接收的异常参数:
blockHandler => BlockException
fallback=>Exception
fallback
- 本文标签: SpringCloud
- 本文链接: http://119.91.109.247:8443//article/134
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权