原创

sentinel

温馨提示:
本文最后更新于 2025年09月10日,已超过 276 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

sentinel 配置

添加 sentinel 依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

yml中添加 参数

spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
      eager: true
eager: true--> sentilnel 预加载, 不会等到 调接口时,再接入 sentinel

使用自定义返回 信息 

自定义 处理类

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

正文到此结束