Sentinel 安装启动 + 全规则详解 + Feign 整合 + 持久化

前言

上一篇我们讲解了 Sentinel 入门 ,从服务雪崩问题引入,完成了基础 API、注解方式接入 Sentinel。本文将从 Sentinel 控制台安装启动 开始,详细讲解 流控 / 热点 / 授权 / 系统 / 降级五大规则blockHandler 自定义兜底全局异常处理Feign 整合熔断Nacos 规则持久化,一站式掌握 Sentinel 生产级用法。

使用版本

  • Spring Cloud Alibaba
  • Sentinel 1.8.1
  • Nacos 服务发现 / 配置中心
  • Spring Boot / Spring Cloud OpenFeign

1. Sentinel 的安装和启动

Sentinel 提供轻量级控制台,支持实时监控、规则管理、接口链路查看,是开发与线上调试必备工具。

1.1 下载 Sentinel 控制台

官方下载地址:https://github.com/alibaba/Sentinel/releases

1.2 启动控制台

使用 java -jar 直接启动,默认端口 8080

复制代码
java -jar sentinel-dashboard-1.8.1.jar

1.3 访问控制台

浏览器访问:http://localhost:8080

  • 默认账号:sentinel
  • 默认密码:sentinel

2. 微服务接入 Sentinel 控制台

2.1 引入 Starter 依赖

替换之前的 sentinel-coresentinel-annotation-aspectj,直接使用官方启动器

XML 复制代码
<!-- sentinel 启动器 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.2 配置控制台地址

application.yml

XML 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  # 控制台地址

2.3 编写测试接口

java 复制代码
@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    @RequestMapping("/hello3")
    public String hello3() {
        return "Hello Sentinel3!!!";
    }
}

2.4 测试接入效果

  1. 启动微服务,访问一次接口:http://127.0.0.1/consumer/getUserById/666
  2. 打开 Sentinel 控制台,即可看到服务与接口监控
  3. 在控制台直接新增流控规则 ,无需重启服务
  4. 高并发访问,触发限流

3. Sentinel 规则详解

Sentinel 规则分为五大类:流控规则、热点规则、授权规则、系统规则、降级规则

3.1 流控规则

流控规则是最常用的规则,控制接口的访问速度,防止被上游压垮。

3.1.1 阈值类型
  1. QPS:每秒请求数达到阈值直接限流
  2. 线程数:当前接口并发线程数达到阈值限流
3.1.2 流控模式
  • 直接:对当前接口直接限流
  • 关联:关联资源达到阈值,限流自己(如订单 / 支付互相让步)
  • 链路:只对指定入口链路限流(粒度更细)
3.1.3 流控效果
  • 快速失败:直接拒绝,抛异常
  • Warm Up:预热模式,初始阈值 = 最大阈值 / 3,慢慢爬升
  • 排队等待:匀速通过,超时报错
QPS 限流示例

高并发访问触发限流:

Warm Up 预热示例

排队等待示例

3.2 热点规则

热点参数限流:对接口参数做细粒度限流,比如限制同一个商品 ID、同一个用户 ID 的访问频率。

3.2.1 接口添加注解

必须加 @SentinelResource 才生效

java 复制代码
@RequestMapping("/getUserById/{id}")
@SentinelResource(value = "getUserById", blockHandler = "blockHandlerMethod")
public User getUserById(@PathVariable Integer id) {
    return userFeign.getUserById(id);
}

// 兜底方法
public User blockHandlerMethod(Integer id, BlockException e){
    return new User(id,"热点限流触发",0);
}
3.2.2 控制台配置热点规则
3.2.3 参数例外项

可对特定参数单独放宽阈值,如 ID=2 不限流

3.3 授权规则

根据调用来源控制放行 / 拦截,支持白名单 / 黑名单。

3.3.1 自定义来源解析器
java 复制代码
@Component
public class RequestOriginParserDefinition implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        // 从请求参数获取来源标识
        return request.getParameter("origin");
    }
}
3.3.2 配置白名单 / 黑名单

3.4 系统规则

系统规则是应用级保护,对整个微服务所有接口统一限流,粒度较粗,慎用。

支持 5 种保护维度:

  • LOAD(Linux)
  • CPU 使用率
  • 全局 RT
  • 全局线程数
  • 全局入口 QPS

3.5 降级规则(熔断)

当下游服务慢调用、异常比例、异常数超标时,暂时切断调用,防止级联故障。

3.5.1 三种降级策略
  1. 慢调用比例 :RT 超过阈值的请求占比超标

    属性 说明
    最大RT 需要设置的阈值,超过该值则为慢调用
    比例阈值 慢调用占所有的调用的比率,范围:[0~1]
    熔断时长 在这段时间内发生熔断、拒绝所有请求
    最小请求数 即允许通过的最小请求数,在该数量内不发生熔断
  2. 异常比例 :请求异常占比超标

    属性 说明
    异常比例阈值 异常比例=发生异常的请求数÷请求总数取值范围:[0~1]
    熔断时长 在这段时间内发生熔断、拒绝所有请求
    最小请求数 即允许通过的最小请求数,在该数量内不发生熔断
  3. 异常数 :单位时间内异常次数超标

    属性 说明
    异常数 请求发生异常的数量
    熔断时长 在这段时间内发生熔断、拒绝所有请求
    最小请求数 即允许通过的最小请求数,在该数量内不发生熔断

服务熔断状态切换:

3.5.2 慢调用比例配置

1)新增熔断策略

2)控制请求时间

java 复制代码
    @RequestMapping(value = "/getUserById/{id}")
    public User getUserById(@PathVariable Integer id) {
        System.out.println("熔断降级效果:"+new Date());
        //控制请求时间
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return userFeign.getUserById(id);
    }
3.5.3 异常比例配置

1)新增熔断策略

2)请求报异常

java 复制代码
@RequestMapping(value = "/getUserById/{id}")
public User getUserById(@PathVariable Integer id) {
    System.out.println("熔断降级效果:"+new Date());
    //请求报异常
    int a = 6/0;
    return userFeign.getUserById(id);
}
3.5.4 异常数配置

1)新增熔断策略

2)请求报异常

java 复制代码
@RequestMapping(value = "/getUserById/{id}")
public User getUserById(@PathVariable Integer id) {
    System.out.println("熔断降级效果:"+new Date());
    //请求报异常
    int a = 6/0;
    return userFeign.getUserById(id);
}

4. Sentinel 自定义兜底(blockHandler)

默认限流提示不友好,可通过 blockHandler 自定义返回。

4.1 同类内定义兜底

java 复制代码
@SentinelResource(value = "getUserById", blockHandler = "blockHandlerMethod")
public User getUserById(@PathVariable Integer id) {
    return userFeign.getUserById(id);
}

// 必须:返回值相同 + 参数相同 + 最后加 BlockException
public User blockHandlerMethod(Integer id, BlockException e) {
    return new User(0, "接口被限流/熔断:" + e.getMessage(), 0);
}

4.2 外置类统一兜底

java 复制代码
// 外置类
public class BlockHandlerClass {
    public static User blockHandlerMethod(Integer id, BlockException e) {
        return new User(0, "全局限流提示", 0);
    }
}

// 注解使用
@SentinelResource(
    value = "getUserById",
    blockHandler = "blockHandlerMethod",
    blockHandlerClass = BlockHandlerClass.class
)

5. Sentinel 全局异常处理

统一处理所有 BlockException,返回标准 JSON 格式。

5.1 实现 BlockExceptionHandler

java 复制代码
@Component
public class GloabBlockExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, 
                       HttpServletResponse response, 
                       BlockException e) throws Exception {
        response.setContentType("application/json;charset=utf-8");
        Result result = null;

        if (e instanceof FlowException) {
            result = Result.fail(-1, "接口限流");
        } else if (e instanceof DegradeException) {
            result = Result.fail(-2, "服务降级");
        } else if (e instanceof ParamFlowException) {
            result = Result.fail(-3, "热点参数限流");
        } else if (e instanceof AuthorityException) {
            result = Result.fail(-4, "授权校验失败");
        } else if (e instanceof SystemBlockException) {
            result = Result.fail(-5, "系统保护触发");
        }

        response.getWriter().write(JSON.toJSONString(result));
    }
}

5.2 测试效果

6. Sentinel 整合 Feign(微服务调用熔断)

实际项目中通过 Feign 远程调用,必须在 Feign 层面实现熔断降级。

6.1 开启 Feign 对 Sentinel 支持

java 复制代码
feign:
  sentinel:
    enabled: true  # 开启整合

6.2 编写 FallbackFactory

java 复制代码
@Component
public class UserFeignFallback implements FallbackFactory<UserFeign> {
    @Override
    public UserFeign create(Throwable throwable) {
        return new UserFeign() {
            @Override
            public User getUserById(Integer id) {
                return new User(id, "Feign 调用失败:" + throwable.getMessage(), 0);
            }
        };
    }
}

6.3 Feign 接口指定降级

java 复制代码
@FeignClient(
    value = "sentinel-provider",
    fallbackFactory = UserFeignFallback.class
)
public interface UserFeign {
    @RequestMapping("/provider/getUserById/{id}")
    User getUserById(@PathVariable("id") Integer id);
}

6.4 测试熔断

关闭服务提供者,访问接口:

7. Sentinel 规则持久化(Nacos)

Sentinel 默认规则内存存储,重启丢失,必须持久化到 Nacos。

7.1 引入持久化依赖

XML 复制代码
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

7.2 配置 Nacos 数据源

XML 复制代码
spring:
  cloud:
    sentinel:
      datasource:
        # 流控规则
        flow:
          nacos:
            server-addr: 192.168.209.129:8848
            namespace: sentinel
            groupId: SENTINEL_GROUP
            dataId: ${spring.application.name}-flow-rules
            rule-type: flow
        # 降级规则
        degrade:
          nacos:
            server-addr: 192.168.209.129:8848
            namespace: sentinel
            groupId: SENTINEL_GROUP
            dataId: ${spring.application.name}-degrade-rules
            rule-type: degrade

7.3 改造 Sentinel Dashboard(推送到 Nacos)

  1. 下载源码修改 application.properties 配置 Nacos 地址
  2. 重新打包 sentinel-dashboard.jar
  3. 启动后在控制台添加规则自动同步 Nacos

7.4 Nacos 配置效果


总结

  1. Sentinel 控制台:安装启动 → 服务接入 → 实时监控
  2. 五大规则:流控、热点、授权、系统、降级,覆盖所有保护场景
  3. 兜底方案:blockHandler 局部 + 全局异常处理
  4. Feign 整合:微服务调用熔断必备
  5. Nacos 持久化:生产环境必须配置,防止规则丢失
相关推荐
青槿吖2 小时前
Sentinel 进阶实战:Feign 整合 + 全局异常 + Nacos 持久化,生产环境直接用
java·开发语言·spring cloud·微服务·云原生·ribbon·sentinel
StackNoOverflow2 小时前
Sentinel服务保护框架完全指南:从原理到实践
java·数据库·sentinel
tsyjjOvO4 小时前
SpringCloud Alibaba Sentinel 从入门到精通
spring·spring cloud·sentinel
恼书:-(空寄1 天前
Sentinel 限流降级:滑动窗口原理 + 生产实战全解
sentinel·限流
身如柳絮随风扬1 天前
深入理解 Sentinel:服务雪崩、熔断原理、使用实践与规则持久化
java·微服务·sentinel
weixin_704266051 天前
Sentinel:微服务流量防护与熔断降级实战指南
sentinel
武超杰1 天前
微服务服务保护:Sentinel 从入门到流控规则实战
微服务·架构·sentinel
小旭95271 天前
微服务服务容错保护:Sentinel 从入门到实战
微服务·架构·sentinel
uNke DEPH3 天前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel