Sentinel之限流、降级、系统保护、热点、授权规则

简介

Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

本文主要讲限流、熔断降级、热点、系统保护、授权等方面,并持久化到Nacos中。

安装sentinel控制台

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

提供1.7的版本:https://pan.baidu.com/s/1JS2tP_7T0Coh4lE5tEOX5Q   提取码:tffz 

启动命令:

nohup java -server -Xms256m -Xmx256m -jar -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=sentinel  -Dserver.port=9090 -Dserver.servlet.session.timeout=7200 sentinel-dashboard-1.7.0.jar > sentinel.log 2>&1 &

访问: http://localhost:9090/#/dashboard/home   账号密码都是: sentinel

默认用户名和密码都是 sentinel。也可指定用户名密码:

  • Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;
  • Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456;
  • Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;

增加相应依赖

除了sentinel依赖,还需要增加持久化依赖。如果不持久化,服务每次重启后,规则策略都需要重新配置。

sentinel提供的持久化配置中心有redis、nacos、zk、file等,我选用的是Nacos,前文也介绍了Nacos作为配置中心的搭建过程。

 
  1. <!--sentinel-->

  2. <dependency>

  3. <groupId>com.alibaba.cloud</groupId>

  4. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>

  5. </dependency>

  6. <!--sentinel持久化到nacos-->

  7. <dependency>

  8. <groupId>com.alibaba.csp</groupId>

  9. <artifactId>sentinel-datasource-nacos</artifactId>

  10. </dependency>

增加项目配置项 

 
  1. spring:

  2. application:

  3. name: gourdhu-service

  4. cloud:

  5. # nacos-配置

  6. nacos:

  7. # 配置中心

  8. config:

  9. server-addr: 47.103.5.190:8848

  10. file-extension: yaml

  11. encode: UTF-8

  12. group: GOURD

  13. namespace: 0d1fc564-ffec-4670-a634-77b4c607d80f

  14. # sentinel 流控

  15. sentinel:

  16. # 取消Sentinel控制台懒加载

  17. eager: true

  18. # 控制台地址

  19. transport:

  20. port: 8719

  21. dashboard: 10.10.10.100:9090

  22. # 持久化数据库-nacos

  23. datasource:

  24. # 限流

  25. flow:

  26. nacos:

  27. dataId: ${spring.application.name}-sentinel-flow.json

  28. groupId: GOURD

  29. # 规则

  30. ruleType: flow

  31. server-addr: ${spring.cloud.nacos.config.server-addr}

  32. # 熔断降级

  33. degrade:

  34. nacos:

  35. dataId: ${spring.application.name}-sentinel-degrade.json

  36. groupId: GOURD

  37. # 规则

  38. ruleType: degrade

  39. server-addr: ${spring.cloud.nacos.config.server-addr}

  40. # 系统保护

  41. system:

  42. nacos:

  43. dataId: ${spring.application.name}-sentinel-system.json

  44. groupId: GOURD

  45. # 规则

  46. ruleType: system

  47. server-addr: ${spring.cloud.nacos.config.server-addr}

  48. # 授权

  49. authority:

  50. nacos:

  51. dataId: ${spring.application.name}-sentinel-authority.json

  52. groupId: GOURD

  53. # 规则

  54. ruleType: authority

  55. server-addr: ${spring.cloud.nacos.config.server-addr}

  56. # 热点

  57. hot:

  58. nacos:

  59. dataId: ${spring.application.name}-sentinel-hot.json

  60. groupId: GOURD

  61. # 规则

  62. ruleType: param_flow

  63. server-addr: ${spring.cloud.nacos.config.server-addr}

Nacos配置文件内容

限流规则配置:

 
  1. [{

  2. "resource": "resource",

  3. "limitApp": "default",

  4. "grade": 1,

  5. "count": 2,

  6. "strategy": 0,

  7. "controlBehavior": 0,

  8. "clusterMode": false

  9. }]

  10.  
  11. # resource: 资源名

  12. # limitApp-流控应用: default(所有)

  13. # grade-阈值类型: qps(1),线程数(0)

  14. # count-单机阈值: 每秒2次

  15. # strategy-流控模式: 直接(0),关联(1),链路(2)

  16. # controlBehavior-流控方式: 快速失败(0),Warm Up(1),排队等待(2)

 Nacos中配置:

Sentinel控制台显示:

 

熔断降级规则配置:

 
  1. [{

  2. "resource": "resource",

  3. "limitApp": "default",

  4. "count": 60000,

  5. "grade": 0,

  6. "timeWindow": 20

  7. }]

  8.  
  9. # grade-阈值类型: 异常比例(1),RT(0)

  10. # timeWindow-时间窗口:降级时间间隔, 单位秒

热点规则配置:

 
  1. [{

  2. "resource": "hot-resource",

  3. "limitApp": "default",

  4. "grade": 1,

  5. "paramIdx": 0,

  6. "count": 1,

  7. "controlBehavior": 0,

  8. "maxQueueingTimeMs": 0,

  9. "burstCount": 0,

  10. "durationInSec": 1,

  11. "paramFlowItemList": [],

  12. "clusterMode": false

  13. }]

  14.  
  15. # paramIdx: 参数索引,从0开始

  16. # durationInSec:统计窗口时长,默认1s

  17. # paramFlowItemList:参数例外项

系统保护规则配置:

 
  1. [{

  2. "highestSystemLoad": -1,

  3. "qps": 200,

  4. "avgRt": -1,

  5. "maxThread": -1,

  6. "highestCpuUsage": -1

  7. }]

  8.  
  9. # -1表示失效

授权规则配置: 

 
  1. [{

  2. "resource": "auth-resource",

  3. "limitApp": "default",

  4. "strategy": 0

  5. }]

  6.  
  7. # strategy: 授权规则,0-白名单(默认),1-黑名单

授权规则限制可以用一句话就说明:如果配置的策略是黑名单且requester在配置在limitApp中,则请求拦截;如果配置的策略是白名单且requester在配置不在limitApp中,则请求拦截;否则请求不拦截。

至此,sentinel 的整合就好了,下面启动项目,开始测试

启动项目测试

启动成功后,在控制台看到以下输出,说明配置成功

或者直接去sentinel控制台查看流控、降级、系统规则中是否存在记录:

 

 Jmeter测试

增加限流接口,并埋点@SentinelResource:

 
  1. @GetMapping("/sentinel")

  2. @SentinelResource(value="resource")

  3. @ApiOperation(value = "测试sentinel限流")

  4. public BaseResponse sentinelTest() {

  5. return BaseResponse.ok("success!");

  6. }

  7.  
  8. @GetMapping("/sentinel-hot")

  9. @SentinelResource(value="hot-resource")

  10. @ApiOperation(value = "测试sentinel热点")

  11. public BaseResponse sentinelHot(String hotkey) {

  12. return BaseResponse.ok("success! hotkey: "+hotkey);

  13. }

增加异常处理器:

 
  1. /**

  2. * 异常处理器

  3. * @author gourd

  4. */

  5. @RestControllerAdvice

  6. @Slf4j

  7. public class GlobalExceptionHandler {

  8. /**

  9. * 处理Sentinel异常

  10. * @param e

  11. * @return

  12. */

  13. @ExceptionHandler(value = UndeclaredThrowableException.class)

  14. public BaseResponse badRequestException(UndeclaredThrowableException e) {

  15. Throwable undeclaredThrowable = e.getUndeclaredThrowable();

  16. // 打印堆栈信息

  17. log.error("异常信息:",undeclaredThrowable);

  18. if(undeclaredThrowable instanceof FlowException){

  19. return BaseResponse.failure("限流啦!");

  20. }else if(undeclaredThrowable instanceof DegradeException){

  21. return BaseResponse.failure("熔断降级啦!");

  22. }else if(undeclaredThrowable instanceof ParamFlowException){

  23. return BaseResponse.failure("热点限流啦!");

  24. }else if(undeclaredThrowable instanceof AuthorityException){

  25. return BaseResponse.failure(HttpStatus.UNAUTHORIZED.value(),"授权限制了!");

  26. }

  27. return BaseResponse.failure("未知异常!");

  28.  
  29. }

  30. }

测试限流:

我配置的策略类型是QPS。

我们配置的单机QPS是2,也就是说resource资源一秒内只会处理2个请求,其他请求会快速失败返回。Jmeter并发数为3,循环1次。

测试熔断降级

为了方便测试,我们把熔断超时时间改为1s,并把限流qps改大为50,并在接口中设置线程睡眠 1.1s,模拟超时。Jmeter并发数为1,循环10次。

我配置的策略类型是RT。

平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。

测试热点数据限流:

设置限流阙值为1,统计窗口时间为1s,参数索引为0,即以接口第一个参数为热点,一个热点参数一秒内只接受一个请求。

Jmeter增加两个http请求,传不同的参数,并发数为3。

测试系统保护:

我配置的策略类型是QPS,为了方便测试,设置QPS值为5,Jmeter并发数为10,循环1次。

官方文档:https://github.com/alibaba/Sentinel/wiki

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值