SpringCloud Alibaba微服务--Sentinel的使用

发布于:2025-09-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、Sentinel概念及优势

1、Sentinel简介

Sentinel 是阿里巴巴开源的 流量控制、熔断降级、系统保护 的轻量级框架,主要用于 微服务架构 下的高可用防护。 与 Hystrix 类似,但 Sentinel 提供了更丰富的流量控制策略和实时监控能力,适用于 Spring Cloud Alibaba 生态。

2、Sentinel核心功能

功能 说明
流量控制 控制 QPS、线程数等,防止系统被突发流量击垮
熔断降级 当服务不稳定时自动熔断,避免级联故障
系统自适应保护 根据系统负载动态调整流量
实时监控 提供 Dashboard 可视化监控
热点参数限流 对特定参数(如用户ID)进行精细限流
集群流控 支持分布式集群限流

3、Sentinel优势

  • 轻量级,高性能
  • 丰富的流量控制策略
  • 实时监控和动态规则调整

4、Sentinel VS Hystrix

对比项 Sentinel Hystrix
流量控制 ✅ QPS、线程数、系统负载 ❌ 仅支持线程池/信号量
熔断策略 ✅ 慢调用比例、异常比例、异常数 ✅ 仅异常比例
热点限流 ✅ 支持 ❌ 不支持
实时监控 ✅ 提供 Dashboard ❌ 依赖 Turbine
规则持久化 ✅ 支持 Nacos、ZooKeeper ❌ 不支持

二、Sentinel安装与使用

1、Sentinel下载

下载地址:Release v1.8.3 · alibaba/Sentinel · GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 · alibaba/Sentinelhttps://github.com/alibaba/Sentinel/releases/tag/1.8.3

解压到指定文件夹下

2、启动Sentinel控制台

(1)cmd启动jar包

java -jar sentinel-dashboard-1.8.3.jar

(2)编写启动Senrinel脚本,文件命名为start.bat

@echo off
title Sentinel Dashboard 1.8.3
java -server -Xms256m -Xmx512m -Dserver.port=8080 -jar sentinel-dashboard-1.8.3.jar
pause

3、登录控制台

地址:Sentinel Dashboardhttp://localhost:8080/#/login

账号/密码:sentinel/sentinel

三、Sentinel使用

1、引入依赖

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

上一篇文章已经为项目引入了sentinel的依赖,以及介绍了feign的使用 感兴趣的可以跳转

SpringCloud Alibaba微服务--Open Feign的使用-CSDN博客https://blog.csdn.net/m0_74399067/article/details/150703402?spm=1001.2014.3001.5502

2、yml文件添加sentinel相关配置

server:
  port: 8021

spring:
  application:
    name: jd-shop-user
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: jd
      config:
        server-addr: 127.0.0.1:8848
        extension-configs:
          - data-id: ${spring.application.name}.yaml
            group: DEFAULT_GROUP
            refresh: true
        file-extension: yml
        namespace: jd
        group: DEFAULT_GROUP
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址

feign:
  sentinel:
    enabled: true


3、启动服务,Sentinel监控到jd-shop-user服务

访问地址:localhost:8021/user/getOrderNo?userId=T12345

在Sentinel控制台可以看到已经监控到了jd-shop-user服务

四、Sentinel控制规则

1、流控规则

(1)首先了解各个属性代表什么

配置项 可选值/说明 对应 FlowRule 属性 默认值
资源名 输入框(需与 @SentinelResource 的 value 或接口路径一致) resource -(必填)
针对来源 default(所有来源)、具体服务名(如 serviceA)、other(非默认来源) limitApp default
阈值类型 QPS:按每秒请求数限流- 并发线程数:按当前处理线程数限流 grade QPS
单机阈值 输入框(限流阈值,如 QPS=10 表示每秒允许 10 次请求) count -(必填)
是否集群 复选框(勾选后启用集群限流,阈值为集群整体阈值) -(需配合集群组件) 未勾选(单机)
流控模式 直接:对当前资源限流- 关联:关联资源触发限流(需填关联资源名)- 链路:指定链路入口限流(需填入口资源) strategy 直接
流控效果 快速失败:直接拒绝超限请求- Warm Up:冷启动模式(需配预热时间)- 排队等待:匀速排队(需配等待时间) controlBehavior 快速失败

(2)新增流控规则-直连模式

资源名称填写接口路径

接下来访问地址localhost:8021/user/getOrderNo?userId=T12345

更具规则可以知道,单位时间内发送一次请求不会进行限流

单位时间内点击多次会进行限流,进行单位时间内重复刷新页面操作,可以发现被限流了

(3)新增流控规则-关联模式

关联: 当关联的资源达到阈值时,就限流自己,也就是说关联的资源(接口),QPS为1时,一秒内被多次请求的时候,自己的接口就会被限流。

我们在user服务中创建一个关联接口 /user/getOrderNo2

测试操作:单位时间内,访问地址http://localhost:8021/user/getOrderNo2一次,然后快速访http://localhost:8021/user/getOrderNo?userId=T12345,两次访问在单位时间内完成。

预期结果:当我们访问http://localhost:8021/user/getOrderNo?userId=T12345会发现已经被限流了

2、@SentinelResource注解使用

(1)属性介绍

  • 属性 必填 作用 要求
    value 指定资源名称 需唯一,用于规则匹配
    entryType 标记流量方向:IN(入口)/OUT(出口) -
    blockHandler 处理BlockException的方法名

    1. public方法

    2. 返回类型与原方法一致

    3. 参数匹配+BlockException参数

    4. 默认同class,或通过blockHandlerClass指定

    blockHandlerClass 存放blockHandler的类

    1. 方法必须static

    2. public修饰方法

    3. 返回类型一致

    4. 参数匹配+BlockException

    fallback 异常降级处理方法

    1. 返回类型一致

    2. 参数匹配(可加Throwable)

    3. 默认同class,或通过fallbackClass指定

    fallbackClass 存放fallback的类

    1. 方法必须static

    2. 其他要求同fallback

    defaultFallback 通用降级处理方法

    1. 返回类型一致

    2. 无参或Throwable参数

    3. 优先级低于fallback

    exceptionsToIgnore 排除的异常类型 这些异常不触发降级,直接抛出
    exceptionsToTrace 需要追踪的异常 仅统计这些异常

(2)改写user服务getOrderNo接口,添加@SentinelResource注解

 @GetMapping("getOrderNo")
    @SentinelResource(value = "getOrderNoResource",fallback = "getOrderNoResource", fallbackClass = UserSentinelResourceHandler.class)
    public String getOrderNo(@RequestParam(value = "userId" ,required = false) String userId, HttpServletRequest  request){
        return userService.getOrderNo(userId, request);
    }

(3)创建UserSentinelResourceHandler,对限流进行友好处理

@Component
public class UserSentinelResourceHandler {

    public static String getOrderNoResource(String userId, HttpServletRequest request, BlockException e) {
        String error =  "被限流了";
        return error;
    }

}

(4)编辑之前创建的规则

资源名改为注解的value值

(4)单位时间内多次访问地址localhost:8021/user/getOrderNo?userId=T12345


3、熔断规则

(1)熔断策略介绍

策略名称 详情
慢调用比例 (SLOW_REQUEST_RATIO)

1. 设置允许的最大响应时间(RT),超过该时间的请求记为慢调用

2. 当统计时长内请求数>最小请求数且慢调用比例>阈值时触发熔断

3. 熔断时长后进入半开状态(HALF-OPEN)

4. 探测请求响应时间<RT则恢复,否则继续熔断

异常比例 (ERROR_RATIO)

1. 当统计时长内请求数>最小请求数且异常比例>阈值时触发熔断

2. 异常比例阈值范围为[0.0,1.0]

3. 熔断时长后进入半开状态(HALF-OPEN)

4. 探测请求成功则恢复,否则继续熔断

异常数 (ERROR_COUNT)

1. 当统计时长内异常数>阈值时触发熔断

2. 熔断时长后进入半开状态(HALF-OPEN)

3. 探测请求成功则恢复,否则继续熔断

(2)user服务新增接口 user/sentinelA

 /**
     * 测试熔断规则 慢调用比例
     * @return
     */

    @GetMapping("/sentinelA")
    @SentinelResource(value = "sentinelAResource" , fallback = "sentinelAResource", fallbackClass = UserSentinelResourceHandler.class)
    public String sentinelA(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("我是sentinelA");
        return "我是sentinelA";
    }

(2)在UserSentinelResourceHandler添加对应的熔断处理

 public static String sentinelAResource(Throwable throwable){
        System.out.println("触发熔断,服务不可用");
        return "触发熔断,服务不可用";
    }

(3)新增熔断规则

(2)访问地址 http://localhost:8021/user/sentinelA

统计时间内,访问一次可以看到返回内容

统计时间内,访问多次,当达到阈值,会进入熔断时间,熔断时间过后,进行探测恢复

其他熔断策略可以自己尝试测试,这里就先不介绍了

4、热点规则

(1)概念及属性

热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的数据,并对其访问进行限制,比如对某个商品id进行限制,或者对某个用户id进行限制

参数索引:方法中参数的索引第几个参数
单机阈值:每秒达到单机阈值的数量就会触发兜底方法

(2)user服务新增接口hotspot

/**
     * 测试centinel热点规则限流
     * @param userId
     * @param shopId
     * @return
     */
    @GetMapping("/hotspot")
    @SentinelResource(value = "hotspotResource" , blockHandler = "hotspotResource", blockHandlerClass = UserSentinelResourceHandler.class)
    public String hotspot(@RequestParam(value = "userId" ,required = false) String userId,
                          @RequestParam(value = "shopId" ,required = false) String shopId){
        System.out.println("我是hotspot");
        return "我是hotspot";
    }

(3)在UserSentinelResourceHandler添加热点规则对应的兜底方法

 public static String hotspotResource(String userId, String shopId, BlockException blockException){
        System.out.println("您被认为恶意访问,触发热点限流");
        return "您被认为恶意访问,触发热点限流";
    }

(4)新增热点规则

(5)重启服务

访问地址http://localhost:8021/user/hotspot?shopId=4 ,不涉及到参数索引0,也就是userId参数,不会触发限流

窗口时长内,多次访问地址http://localhost:8021/user/hotspot?shopId=4&userId=1,涉及到参数索引0,也就是userId参数,会触发限流

系统规则会对服务所有接口进行限流,这里就不介绍了

五、总结

SpringCloud Alibaba--Sentinel的使用就介绍到这里了,如果你有更好的想法,可以积极评论。同时,创作不易,路过的家人们不要忘记点赞、收藏哟。

上一篇文章:

SpringCloud Alibaba微服务--Open Feign的使用-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到