当前位置: 首页 > news >正文

SpringCloud中 Sentinel 限流的使用

  1. 引入依赖

     <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
  2. 手动编写限流规则,缺点是不够灵活,如果需要改变限流规则需要修改源码

    	@PostConstructprivate void initFlowQpsRule() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();//一定要与 @SentinelResource 里的值一致rule.setResource("confirmOrder");//定义限流规则,常见的有QPS和线程数rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//最大QPS为20,如果请求超过了20,也只有20个请求会执行成功,如果没有定义降级的方法其余的请求会抛出 FlowExceptionrule.setCount(20);rule.setLimitApp("default");rules.add(rule);FlowRuleManager.loadRules(rules);}//定义一个资源,value值不能少,并指定降级对应的方法@SentinelResource(value = "confirmOrder",blockHandler = "exceptionHandler")public void flowMethod(String abc) {...}// blockHandler函数,原方法调用被限流/降级/系统保护的时候调用,编写的时候要注意降级方法内的参数除了BlockException之外要与资源方法参数一致public void exceptionHandler(String abc,BlockException ex) {//降级逻辑的编写}
    
  3. 利用控制台编写限流规则,控制台是额外的Java项目,需要运行起来,优点是不需要修改源码,可以运行时修改限流规则,启动后访问
    localhost:18080即可,需要注意的时,控制台一开始并不会显示限流的资源,需要请求一次限流资源才会显示 ,缺点是限流规则没有持久化,服务重启限流规则就消失了

    spring:application:name: businesscloud:sentinel:transport: #启用sentinel控制台port: 8719 #控制台监听的端口,固定的端口dashboard: localhost:18080 #控制台项目启动的端口,启动控制台项目可以自己指定
    

    实时监控
    显示的效果
    流控规则,可以定义修改限流规则
    在这里插入图片描述
    簇点链路
    在这里插入图片描述

  4. 使用Nacos实现限流规则持久化

    <!--        实现sentinel限流规则持久化-->
    <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    
    spring:application:name: businesscloud:sentinel:datasource:flow: # 这个可以随意取nacos:server-addr: #nacos服务的地址namespace: traingroup-id: DEFAULT_GROUPdata-id: sentinel-flowrule-type: flow #限流degrade: # 这个可以随意取nacos:server-addr: #nacos服务的地址namespace: traingroup-id: DEFAULT_GROUPdata-id: sentinel-degraderule-type: degrade #熔断
    

    定义限流规则,里面是一个json数组,所以可以配置多条规则,其实nacos的这个配置相当于没有界面的Sentinel台端,实现的功能是一样的,只不过他定义的规则是持久化的,控制台定义的的规则是推送到我们的项目的,也就是保存在内存当中的,重启就没了,这些参数不知道可以使用控制台的时候 F12去查看对应的名称
    在这里插入图片描述

  5. Sentinel配置详解
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 资源名:对哪个方法进行限流
    • 针对来源:限流的资源可能被多个服务调用(例如远程调用),用来指定什么服务来调用需要限流,一般都是使用默认
    • 流控效果:
      • 快速失败是指触发限流直接失败返回
      • 排队等待触发限流后等排队等待,可以设置超时时间,假设阀值是10,一下子来了20个请求,但一秒内只能接受10个请求,剩余的请求可以等待下一秒执行,如果等待的时间超过了设置的时间,还是会失败返回的,注意只有选择QPS才会有排队等待功能,适合会有流量突刺的系统,通过排队等待慢慢处理请求
      • Warm Up 进行预热,可以设置预热时长.假设预热时长是两秒,设置的单机阀值是10,那么一开始的阀值就是 10 / 3 = 3,然后会慢慢增加,在两秒后 阀值才会变成10,预热是为了保护系统,如果系统设置了阀值很大,系统刚启动就来了超过阀值的请求,可能会出现很多问题,所以需要预热让系统的阀值慢慢增加,而不是一下子就达到设定的阀值,适合流量一直很大的系统
    • 流控模式
      • 关联:需要配置一个关联资源,只有当关联资源限流了,当前资源开启限流,例如支付资源关联了下单资源,只有当下单资源触发了限流,支付资源才会开启限流,否则无论多大的请求都不会触发限流
      • 链路:需要配置一个入口资源,例如A资源调用了C资源,B资源也调用了C资源,但入口资源是A,所以只有A调用C资源时时才会触发C资源的限流
        spring:cloud:sentinel:web-context-unify: false #流控模式为链路时必须设置为false
        
  6. Sentinel的熔断功能,一般是配合远程调用使用

    熔断规则

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    spring:cloud:openfeign: #feign.sentinel.enabled改为true后不加会报错lazy-attributes-resolution: true
    feign:sentinel:enabled: true #sentinel默认不监控feign,需要sentinel配置 lazy-attributes-resolution: true不然会报错
    

    注意的是feign接口是不能自己使用注解定义资源的,sentinel开启了监控feign会自动定义feign接口的资源,而且名称是固定的

    • 资源名:需要远程调用服务的接口全路径
    • 熔断策略
      • 慢调用比例:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且有 30% 的请求响应时间超过201ms,会进行熔断11秒,也就是说在11秒内都不会再远程调用对应的服务了,并且会抛出 DegradeException ,此时可以做相应的降级处理保证服务的可用性
      • 异常比例:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且有 30% 的请求出现异常,会进行熔断3秒
      • 异常数:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且出现3次异常,会进行熔断3秒
http://www.lryc.cn/news/124802.html

相关文章:

  • springboot文件上传和下载接口的简单思路
  • MySQL索引和事务
  • typeScript 之 基础
  • android app控制ros机器人五(百度地图)
  • 【ts】【cocos creator】excel表格转JSON
  • 每天一个知识点——L2R
  • 解决flutter showDialog下拉框,复选框等无法及时响应的问题
  • [C++ 网络协议编程] UDP协议
  • reactNative跳转appstore链接报错:Redirection to URL with a scheme that is not HTTP(S)
  • html css实现爱心
  • react中使用shouldComponentUpdate生命周期函数调用setState引起的无限循环的错误
  • 麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?
  • 【爬虫】P1 对目标网站的背景调研(robot.txt,advanced_search,builtwith,whois)
  • maven如何建立JavaWeb项目并连接数据库,验证登录
  • CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)
  • 动态规划(基础)
  • 【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector
  • 动态库的命名规则
  • 【Linux】网络---->网络理论
  • Android学习之路(4) UI控件之输入框
  • 1.初识Web
  • 【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)
  • 【Linux】可重入函数 volatile关键字 以及SIGCHLD信号
  • 【动态规划】回文串问题
  • Laravel Swift Mail发送带附件的邮件报错 “Swift_IoException The path cannot be empty“处理
  • Linux下常见的代理服务器软件介绍
  • SCSS的基本用法
  • alertmanager创建nginx-ingress basic auth鉴权
  • 系列六、Redis中的五大数据类型及相关操作
  • 四大运营商的大流量卡测评,看完您会选哪个运营商?