-
引入依赖
xml<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> -
手动编写限流规则,缺点是不够灵活,如果需要改变限流规则需要修改源码
java@PostConstruct private 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个请求会执行成功,如果没有定义降级的方法其余的请求会抛出 FlowException rule.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) { //降级逻辑的编写 } -
利用控制台编写限流规则,控制台是额外的Java项目,需要运行起来,优点是不需要修改源码,可以运行时修改限流规则,启动后访问
localhost:18080即可,需要注意的时,控制台一开始并不会显示限流的资源,需要请求一次限流资源才会显示 ,缺点是限流规则没有持久化,服务重启限流规则就消失了yamlspring: application: name: business cloud: sentinel: transport: #启用sentinel控制台 port: 8719 #控制台监听的端口,固定的端口 dashboard: localhost:18080 #控制台项目启动的端口,启动控制台项目可以自己指定实时监控

流控规则,可以定义修改限流规则

簇点链路

-
使用Nacos实现限流规则持久化
xml<!-- 实现sentinel限流规则持久化--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>yamlspring: application: name: business cloud: sentinel: datasource: flow: # 这个可以随意取 nacos: server-addr: #nacos服务的地址 namespace: train group-id: DEFAULT_GROUP data-id: sentinel-flow rule-type: flow #限流 degrade: # 这个可以随意取 nacos: server-addr: #nacos服务的地址 namespace: train group-id: DEFAULT_GROUP data-id: sentinel-degrade rule-type: degrade #熔断定义限流规则,里面是一个json数组,所以可以配置多条规则,其实nacos的这个配置相当于没有界面的Sentinel台端,实现的功能是一样的,只不过他定义的规则是持久化的,控制台定义的的规则是推送到我们的项目的,也就是保存在内存当中的,重启就没了,这些参数不知道可以使用控制台的时候 F12去查看对应的名称

-
Sentinel配置详解






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




yamlspring: 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秒
SpringCloud中 Sentinel 限流的使用
坤了2023-08-15 21:52
相关推荐
lbb 小魔仙5 小时前
【Java】Spring Boot 与 Spring Cloud 整合:微服务架构入门实战Roye_ack5 小时前
【微服务 Day3】SpringCloud实战开发(网关路由 + 网关登录校验 + 自定义过滤器 + 配置共享 + 配置热更新 + 动态路由)机灵猫5 小时前
守卫系统的最后一道防线:深入 Sentinel 限流降级与熔断机制(对比 Hystrix)蜀中孤鹰5 小时前
从秒级到毫秒级:一次Redis限流脚本的深度优化实战weixin_439706255 小时前
spring boot+nacos+gateway+sentinel的简单例子lbb 小魔仙6 小时前
【Java】Spring Cloud 核心组件详解:Eureka、Ribbon、Feign 与 Hystrix清晓粼溪21 小时前
RestTemplateKnight_AL1 天前
深入理解 PropertySource 与优先级:Spring Boot/Spring Cloud 配置体系的底层原理lbb 小魔仙1 天前
【Java】Spring Data JPA 详解:ORM 映射、查询方法与复杂 SQL 处理lbb 小魔仙1 天前
【Java】Spring Cloud 微服务架构入门:五大核心组件与分布式系统搭建