Sentinel学习

sentinel是阿里巴巴研发的一款微服务组件,主要为用户提供服务保护,包括限流熔断等措施

(一)主要功能

流量控制(限流):比如限制1s内有多少请求能到达服务器,防止大量请求打崩服务器

熔断降级:当下级服务响应慢或者不可用时,熔断服务,快速失败,保护上游服务

(二)使用方法

Releases · alibaba/Sentinel · GitHub下载对应的jar包

在jar包所在的目录cmd运行命令

复制代码
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.8.jar

然后通过8080端口即可访问sentinel的控制台 ,账号密码均为sentinel

然后去项目中添加依赖

复制代码
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>

同时修改服务的application.yml

复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090   # 指定 Sentinel Dashboard 地址
        port: 8719                  # 客户端监控端口,用于与 Sentinel Dashboard 通信

dashboard的地址必须和sentinel控制台的地址一致,连接控制台

port端口号是服务与sentinel的通信端口,是独立的,不能和运行服务的端口一样

在项目的代码中使用:

@SentinelResource注解

常用参数

value:指定资源名,在控制台中可看

blockHandler:触发限流规则时会调用哪个方法,一般会写一个兜底方法,方法参数要和设置了限流的方法一致,但可以加一个BlockException

fallback:触发异常时调用哪个兜底方法,和上面的很像,但是上面是用于触发限流后用的,这个是用于触发异常用的,方法参数可以加一个Throwable

(三)限流规则

限流主要是阻止大量请求同时打到服务器上

资源名 与@SentinelResource的value对应

针对来源 就是调用这个controller发送请求的来源,你要限流哪些来源的,默认全部

阈值类型:QPS每秒通过多少个(多少个就是单机阈值的数量),并发线程数通常配合线程池使用

是否集群:多服务器的情况下会用,也要设置一个阈值

比如,设置全局阈值12,比如进来100个请求,有三个服务器,它们总共只能处理12个请求

如果设置的单机均摊12,进来100个请求,就会每个服务器都能处理12个请求,总共36

继续看:

流控模式分为3种:直接、关联和链路

直接没什么好说的,就是对单一资源进行限流

关联就是a资源关联b资源,当b资源访问量大触发限流时,a也会被限流

链路就是当同一个方法会被多种渠道调用时,只对部分渠道进行限流

流控效果分三种:快速失败、warm up和排队等待

快速失败就是触发限流后,后面的请求全部丢弃,报错

warm up就是冷启动,需要设置启动时间n,前n秒内处理量大概为阈值的1/3,后面再逐步提高处理量达到阈值

排队等待就是触发限流后,后面的请求不会丢弃,而是排队等待前面的执行完后它再执行,需要设置排队时间,超过这个时间请求还未被处理的话,丢弃

ps:只有快速失败支持关联和链路,其它两种不支持

(四)熔断规则

当a服务调用b服务时,b服务可能会卡住执行很久,也可能会异常,这时a要及时熔断,切断与b的联系,保护自己

又有一个问题?怎么判断服务有问题去熔断呢?熔断之后怎么恢复连接呢?

答:判断熔断主要根据熔断策略,符合条件即熔断。恢复连接的话,当a、b服务间断开的时长达到熔断时长后,服务会切换到半开状态,a会向b发送一个或几个请求,如果这些请求正常执行,那就取消熔断恢复运行,如果这些请求有问题(满足熔断条件),就会继续保持熔断

熔断策略有三种:慢调用、异常比例和异常数

选择慢调用

最大RT:最大的响应时间,超过这个时间判定为慢调用

比例阈值:当n%的调用是慢调用时,触发熔断

熔断时长:熔断多久

最小请求数:要触发熔断起码要有多少个请求,低于这个数值不会熔断

统计时长:统计时长

选择异常比例

其他不变,没用最大RT,比例阈值改为当n%的调用是异常时触发熔断

选择异常数

其他不变,比例阈值改为异常数

(五)热点规则

就是可以对方法的具体参数进行限流

当用户调用这个方法,携带了3个参数,你可以设置热点来对具体的第几个参数进行限流

(六)总结

sentinel是服务保护的重要组件,起到限流、熔断等作用

首先下载sentinel的jar包,用命令运行,用浏览器打开sentinel的控制台

然后去项目中添加对应依赖,修改代码,添加@SentinelResource,并写对应的兜底方法

java 复制代码
@RestController
public class UserController {

    @GetMapping("/user")
    @SentinelResource(
        value = "getUser",               // 资源名,用于控制台设置规则
        fallback = "fallbackMethod",    // 业务异常兜底方法
        blockHandler = "blockHandlerMethod" // 流控、熔断时的处理方法
    )
    public String getUser(@RequestParam(required = false) String name) {
        if ("error".equals(name)) {
            throw new RuntimeException("模拟业务异常");
        }
        return "用户:" + name;
    }

    // fallback 方法:处理业务异常(如运行时异常)
    public String fallbackMethod(String name, Throwable e) {
        return "fallback:业务处理异常,返回兜底用户";
    }

    // blockHandler 方法:处理被 Sentinel 限流、降级、熔断的情况
    public String blockHandlerMethod(String name, BlockException ex) {
        return "blockHandler:服务被限流或熔断,返回默认用户";
    }
}

其实代码部分很少,主要用控制台对限流规则、熔断规则进行配置即可

相关推荐
夏季疯9 分钟前
学习笔记:黑马程序员JavaWeb开发教程(2025.3.29)
java·笔记·学习
xixixiLucky1 小时前
Selenium Web自动化测试学习笔记(一)
笔记·学习·selenium
虾球xz2 小时前
游戏引擎学习第263天:添加调试帧滑块
c++·学习·游戏引擎
搞不懂语言的程序员2 小时前
Kafka Consumer的auto.offset.reset参数有哪些配置?适用场景?
分布式·kafka
洋芋爱吃芋头2 小时前
hadoop中的序列化和反序列化(2)
大数据·hadoop·分布式
他们都不看好你,偏偏你最不争气3 小时前
OC语言学习——面向对象(下)
开发语言·学习·objective-c·面向对象
虾球xz3 小时前
游戏引擎学习第262天:绘制多帧性能分析图
c++·学习·游戏引擎
TUTO_TUTO3 小时前
【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例
学习·云计算·aws
不会飞的鲨鱼4 小时前
Scrapy框架之Scrapyd部署及Gerapy分布式爬虫管理框架的使用
分布式·爬虫·scrapy
kkai人工智能4 小时前
DeepSeek的100个应用场景
人工智能·gpt·学习·chatgpt