最新动态
【SpringCloud】SpringCloud Alibaba Sentinel实现熔断与限流
2025-01-02 22:38

SpringCloud Alibabasentinel实现熔断与限流

限流 blockHandler
降级 fallback
降级需要运行时出现异常才会触发,而限流一旦触发,你连运行的机会都没有,当然就不会降级。
也就是说,两者如果同时触发,那么一定是限流触发(降级连机会都没有)。

https://github.com/alibaba/Sentinel
中文:https://github.com/alibaba/Sentinel/wiki/介绍

一句话解释就是我们之前讲过的hystrix

官方文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel

服务中的各种问题

  • 服务雪崩
  • 服务降级
  • 服务熔断
  • 服务限流
  • 后台
  • 前台8080

https://github.com/alibaba/Sentinel/releases

前提

java8环境OK
8080端口不能被占用

命令

java -jar sentinel-dashboard-1.7.0.jar

http://localhost:8080

登录账号密码均为sentinel

http://localhost:8848/nacos/#/login









java -jar sentinel-dashboard-1.7.0.jar

执行一次访问

http://localhost:8401/testA
http://localhost:8401/testB

效果

sentinel8080正在监控微服务8401

直接->快速失败

系统默认

配置及说明

测试

  • 快速点击访问http://localhost:8401/testA
  • 结果:Blocked by Sentinel(flow limiting)
  • 思考???
    直接调用默认报错信息,技术方面ok,but,是否应该有我们自己的后续处理
    类似有个fallback的兜底方法

应用场景:比如支付时达到阈值,可以从源头上比如购买界面,进行限流
类比:下流洪灾,上流关水

是什么

  • 当关联的资源达到阈值时,就限流自己
  • 当与A关联的资源B达到阈值后,就限流自己
  • B惹事,A挂了

配置A

postman模拟并发密集访问testB

访问B成功
postman里新建多线程集合组
将访问地址添加进新线程组
RUN

大批量线程高并发访问B,导致A失效了

运行后发现testA挂了

  • 点击访问A
  • 结果:Blocked by Sentinel(flow limiting)
  • 多个请求调用同一个微服务
  • 家庭作业试试
  • 直接失败,抛出异常
    Blocked by Sentinel(flow limiting)
  • 源码
    com.alibaba.csp.sentinel.slots.block.controller.DefaultController

说明

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

官网

  • 默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值
  • 限流 冷启动
    https://github.com/alibaba/Sentinel/wiki/限流---冷启动

源码

com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController

WarmUp配置

多次点击http://localhost:8401/testB

刚开始不行,后续慢慢OK

应用场景

如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,颍热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。

匀速排队,阈值必须设置为QPS

官网

源码

com.ailibaba.csp.sentinel.slots.block.controller.RateLimiterController

测试

https://github.com/alibaba/Sentinel/wiki/熔断降级

Sentinel熔断隆级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高) ,对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)。

半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用,具体参考Hystrix

复习Hystrix

是什么

测试

代码
配置
jmeter压测
结论

是什么

测试

代码
配置
jmeter
结论

是什么

异常数是按照分钟统计的

测试

代码

同异常比例

配置
jmeter

https://github.com/alibaba/Sentinel/wiki/热点参数限流

SentinelResource

兜底方法
分为系统默认和客户自定义,两种

之前的case,限流出问题后,都是用sentine|系统默认的提示: Blocked by Sentinel (flow limiting)

我们能不能自定?类似hystrix,某个方诎问题了,就找对应的兜底降级方法?

结论
从HystrixCommand到@SentinelResource

com.alibaba.csp.sentinel.slots.block.BlockException

1

  • @SentinelResource(value = "testHotKey")
  • 异常打到了前台用户界面看到,不友好

2

  • @SentinelResource(value = "testHotKey",blockHandler="dealHandler_testHotKey")
  • 方法testHotKey里面第一个参数只要QPS超过每秒一次,马上降级处理
  • 用了我们自己定义的
  • × error
    http://localhost:8401/testHotKey?p1=abc
  • × error
    http://localhost:8401/testHotKey?p1=abc&p2=33
  • √ right
    http://localhost:8401/testHotKey?p2=abc

普通

  • 超过1秒钟一个后,达到阈值1后马上被限流
  • 我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样
  • 特例:假如当p1的值等于5时,它的阈值可以达到200
  • √ http://localhost:8401/testHotKey?p1=5
  • × http://localhost:8401/testHotKey?p1=3
  • 当p1等于5的时候,阈值变为200
  • 当p1不等于5的时候,阈值就是平常的1

热点参数的注意点,参数必须是基本类型或者String

手贱添加异常看看o(╥﹏╥)o
后面讲

@SentinelResource
处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;

RuntimeException
int age = 10/0, 这个是java运行时报出的运行时异常RunTimeException, @SentinelResource不管

总结
@SentinelResource主管配置出错,运行出错该走异常走异常

https://github.com/alibaba/Sentinel/wiki/ 系统自适应限流

cloudalibaba-sentinel-service8401

pom


yml

业务类RateLimitController


主启动

配置步骤

http://localhost:8401/rateLimit/customerBlockHandler

https://github.com/alibaba/Sentinel/wiki/注解支持

  • sphU定义资源
  • Tracer定义统计
  • ContextUtil定义了上下文

新建cloudalibaba-provider-payment9003/9004

POM


YML


主启动


业务类


测试地址

http://localhost:9003/paymentSQ/

新建cloudalibaba-consumer-nacos-order84

POM

与提供者pom一致

YML


主启动


业务类

ApplicationContextConfig

CircleBreakerController

修改后请重启微服务
  • 热部署对java代码级生效及时
  • 对@SentinelResource注解内属性,有时效果不好
目的
  • fallback管运行异常
  • blockHandler管配置违规
测试地址

http://localhost:84/consumer/fallback/3

没有任何配置

直接给用户error界面。,,不太友好

只配置fallback


只配置blockHandler

#######编码


记得配置一个qps的控制

同时配置fallback和blockHandler
异常忽略
  • 84消费者调用提供者9003
  • Feign组件一般是消费端



  • 带@FeignClient注解的业务接口
  • fallback = PaymentFallbackService.class
  • Controller

添加@EnableFeignClients启动Feign的功能

Sentinel Hystrix resilience4j 隔离策略 信号量隔离(并发线程数限流) 线程池隔离/信号量隔离 信号量隔离 熔断降级策略 基于响应时间、异常比率、异常数 基于异常比率 基于异常比率、响应时间 实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于RxJava) Ring Bit Buffer 动态规则配置 支持多种数据源 支持多种数据源 有限支持 扩展性 多个扩展点 插件的形式 接口的形式 基于注解的支持 支持 支持 支持 限流 基于QPS.支持基于调用关系的限流 有限的支持 Rate Limiter

一旦我们重启应用,sentinel规则消失,生产环境需要将配置规则进行持久化

将限流规则持久进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看得到,只要Nacos里面的配置不删除,针对8401上的流控规则持续有效






内容解析



这一步的作用是每次消费者微服务启动时在nacos中定义sentinel的流控规则,从而做到持久化的效果

发表评论
0评