微服务-- Sentinel的使用

打印 上一主题 下一主题

主题 1051|帖子 1051|积分 3153

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目次
Sentinel:微服务的哨兵
生态体系景观
sentinel与spring cloud Hystrix 对比
Sentinel 主要分为两部分
Sentinel安装与使用
Sentinel的控制规则
流控规则
流控规则的属性阐明
新增流控规则
关联流控模式
@SentinelResource注解的使用 
@SentinelResource 的主要属性
代码示例
熔断规则
慢调用比例 (SLOW_REQUEST_RATIO)
非常比例 (ERROR_RATIO)
非常数 (ERROR_COUNT)
代码示例
热点规则
热点参数限流规则的属性
代码示例
体系规则
体系规则的几种策略
代码示例


Sentinel:微服务的哨兵


随着分布式体系的普及,服务间的可靠性变得比以往更加告急。Sentinel 以“流”为切入点,从流量控制流量整形、 并发限制熔断体系自顺应过载掩护等多个方面进行研究,为微服务提供可靠性和弹性保障。
Sentinel 具有以下功能:


  • 丰富的应用场景:Sentinel 在阿里巴巴内部被广泛应用,几乎覆盖了近 10 年双十一的所有核心场景,好比必要限制突发流量以到达体系容量要求的秒杀、消息削峰填谷、针对卑鄙不可靠服务的熔断、集群流控等。
  • 实时监控:Sentinel 也提供了实时监控能力,可以实时看到单台机器的运行时信息,以及 500 个节点以下集群的聚合运行时信息。
  • 广泛的开源生态体系:Sentinel 提供与常用框架和库(如 Spring Cloud、gRPC、Apache Dubbo 和 Quarkus)的开箱即用集成。您只需将适配器依靠项添加到您的服务中即可轻松使用 Sentinel。
  • 多语言支持:Sentinel 为 Java、 Go、C++和Rust提供了原生支持。
  • 多种SPI扩展:Sentinel提供了简单易用的SPI扩展接口,可以让你快速定制自己的逻辑,比方自定义规则管理,适配数据源等等。
功能概述:

   生态体系景观

  

  Sentinel 的应用场景


  • 秒杀场景:限流防止瞬时流量冲击。
  • 服务熔断与降级:当服务不可用时,快速失败,制止级联故障。
  • 体系掩护:预防由于高负载引发的体系崩溃。
sentinel与spring cloud Hystrix 对比

SentinelSpring Cloud Hystrix 都是用于微服务架构中的服务容错、熔断降级、流量控制等功能的库。
特性SentinelHystrix隔离策略信号量隔离(Semaphore)线程池隔离(Thread Pool)和信号量隔离(Semaphore)熔断降级策略基于相应时间或失败比率基于失败比率实时指标实现滑动窗口,基于时间维度监控滑动窗口(基于 RxJava),但更多依靠于变乱流规则配置支持多种动态数据源,如文件、Nacos、Apollo 等支持多种数据源,但集成较少扩展性多个扩展点,便于用户定制插件情势的扩展,灵活性较低基于注解的支持支持,如 @SentinelResource支持,如 @HystrixCommand限流基于 QPS,支持基于调用链路的限流基础的限流支持流量整形支持慢启动、匀速器模式不支持体系负载掩护支持,能根据体系负载(如 CPU 使用率)动态调整策略不支持控制台开箱即用,提供规则配置、秒级监控、机器发现等功能控制台不美满,只提供简单的监控和查看常见框架的适配适配多种框架,如 Servlet、Spring Cloud、Dubbo、gRPC适配 Spring Cloud Netflix 和基础框架 Sentinel 主要分为两部分

核心库(Java 客户端)


  • Sentinel 的核心库是一种轻量级的流量控制、熔断降级、体系掩护解决方案,计划目的是不依靠任何特定的框架或库。因此,Sentinel 的核心库可以在所有 Java 运行时情况中独立运行,而且不必要特定的容器或基础办法。
  • 主要功能:

    • 限流:基于 QPS 的限流机制,可以掩护服务免受突发流量的影响。
    • 熔断降级:根据相应时间、失败比率等触发熔断,防止故障扩展。
    • 体系掩护:根据体系的负载(如 CPU 使用率)动态调整限流或熔断策略。
    • 集成支持:核心库可以轻松与各种微服务框架进行集成,如 DubboSpring Cloud,也能与现有的服务架构无缝适配。

控制台(Dashboard)


  • Sentinel 控制台是基于 Spring Boot 开发的一个独立应用,用于可视化的监控和管理。
  • 运行方式:它打包成一个可以直接运行的可实行 JAR 包,不必要额外的 Tomcat 或其他应用容器支持,使用非常便捷。
  • 主要功能:

    • 实时监控:可以查看每个微服务的实时哀求、QPS、相应时间等指标,并展示在控制台中。
    • 规则管理:支持限流、熔断降级、体系掩护等规则的动态添加、修改和删除。
    • 机器发现:自动发现并展示 Sentinel 监控的所有服务节点。

Sentinel安装与使用

Sentinel控制台的下载
下载地址:Releases · alibaba/Sentinel · GitHub
我们选择1.8.8版本,直接下载jar包

Sentinel控制台的启动
 cmd 启动jar包
   java -jar sentinel-dashboard-1.8.3.jar(jar包地址)
   

访问
浏览器输入:localhost:8080
账号暗码 默认都是 sentinel

   注意:构建或运行仪表板必要 Java 8。
  为服务打开sentinel的监控
  在每个子服务的 pom.xml 文件中,添加 Sentinel 相干的依靠:
  1.         <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
  2.         <dependency>
  3.             <groupId>com.alibaba.cloud</groupId>
  4.             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5.             <version>2023.0.1.0</version>
  6.         </dependency>
复制代码
配置 application.properties 以启用 Sentinel
  1. # 服务端口
  2. server.port=8081
  3. # 启用 Sentinel,并连接 Sentinel Dashboard
  4. spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
  5. spring.cloud.sentinel.transport.port=8719  # 本地 Sentinel 客户端的监控端口
  6. # 启用 Sentinel
  7. spring.cloud.sentinel.enabled=true
复制代码
Sentinel的控制规则

  为了后续学习,写个随机生成订单号的订单接口
  1. package cloud.service1.service;
  2. public interface UserService {
  3.     String generateOrder(String userId, String tenantId);
  4. }
复制代码
  1. package cloud.service1.service.impl;
  2. import cloud.service1.service.UserService;
  3. import org.springframework.stereotype.Service;
  4. import java.util.UUID;
  5. @Service
  6. public class UserServiceImpl implements UserService {
  7.     @Override
  8.     public String generateOrder(String userId, String tenantId) {
  9.         // 使用UUID生成随机订单号
  10.         String orderNo = generateRandomOrderNo();
  11.         return "生成订单号: " + orderNo + ", 用户ID: " + userId + ", 租户ID: " + tenantId;
  12.     }
  13.     // 生成随机订单号的方法
  14.     private String generateRandomOrderNo() {
  15.         // 使用UUID随机生成订单号
  16.         return "ORD-" + UUID.randomUUID().toString().replace("-", "").substring(0, 12).toUpperCase();
  17.     }
  18. }
复制代码
  1. package cloud.service1.controller;
  2. import cloud.service1.service.UserService;
  3. import jakarta.servlet.http.HttpServletRequest;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. @RestController
  9. @RequestMapping("/user")
  10. public class UserController {
  11.     @Autowired
  12.     private UserService userService;
  13.     // 随机生成订单号接口
  14.     @GetMapping("generateOrder")
  15.     public String generateOrder(String userId, String tenantId, HttpServletRequest request) {
  16.         return userService.generateOrder(userId, tenantId);
  17.     }
  18. }
复制代码
测试接口:
  可以通过以下 URL 调用接口生成随机订单号:
  1. http://localhost:8081/user/generateOrder?userId=12345&tenantId=67890
复制代码
流控规则

  流控规则的属性阐明

  资源名:资源名是必要限流的唯一标识,可以是方法名、API哀求路径等。通过资源名,Sentinel能够对流量进行管理与控制。
  针对来源:可以针对特定的调用方进行限流。比方,服务A调用服务B时,可以针对服务A的调用进行限流。默认为 default,表示不区分调用来源。
  阈值类型/单机阈值:
  

  • QPS(每秒哀求数):如果某个资源的每秒哀求数凌驾设定的阈值,则会触发限流。
  • 线程数:当访问该资源的并发线程数到达设定的阈值时,触发限流。
  是否集群:
  

  • 如果不必要集群模式限流,默认选择“不必要集群”。否则,可以开启集群限流。
  流控模式:
  

  • 直接限流:一旦到达阈值,直接限流当前的哀求。
  • 关联限流:当关联的其他资源到达限流条件时,限流当前的资源。比方:当/resourceA到达阈值时,/resourceB也被限流。
  • 链路限流:对入口资源进行链路限流,限制从指定入口进入的资源访问。当链路上的访问量到达阈值时,限制链路上的流量。常用于链路掩护。
  流控效果:
  

  • 快速失败:当到达限流条件时,直接抛出非常,返回失败效果。
  • Warm Up(预热):在一段时间内,渐渐增加允许通过的流量,直至到达设定的 QPS 阈值。适合应用在高峰期流量突增的场景。
  • 排队期待:哀求不会立即失败,而是进入排队状态,匀速通过。适用于平滑处理哀求的场景,雷同于“漏斗效应”。阈值类型必须为 QPS,否则无效。
  新增流控规则

  

  资源名称就是我们的接口访问路径
然后我们一秒一次访问一下接口(正常)
  

  接下来我们快速哀求接口后,发现已经被限流了
  

  关联流控模式

  关联流控 适用于多个接口之间的关联,当一个接口的流量到达限流条件时,关联的其他接口也会被限流。适合有相干依靠关系的接口。
  创建接口:/user/sentinel(关联接口)
  1. @GetMapping("sentinel")
  2. public String sentinel() {
  3.     return "我是关联接口";
  4. }
复制代码
在 Sentinel 控制台中,设置 /user/getOrderNo 的限流模式为 关联模式,关联资源设置为 /user/sentinel。
  

  使用压力测试工具(如 JMeter),发送大量哀求至 /user/sentinel,使其到达限流条件。
  

  在关联流控触发时,访问 /user/getOrderNo,即使该接口自己没有超出 QPS 阈值,也会被限流。
  @SentinelResource注解的使用 

@SentinelResource 注解在 Spring Cloud Alibaba 中用于定义资源的限流、熔断、降级策略,它提供了多种属性来处理差别的非常和限流场景。
@SentinelResource 的主要属性

value:资源名称,必填。定义必要进行掩护的资源标识,好比接口名或方法名。
entryType:流量类型,默认是 OUT,可选 IN 和 OUT。IN 用于标记入口流量,OUT 用于标记出口流量。通常情况下,不必要显式指定,默认为 OUT。
blockHandler:处理限流或降级时的逻辑,方法名必须是 public,返回类型与原方法一致,且参数类型必要与原方法匹配,方法最后要加上 BlockException 参数。可以处理流控、熔断等情况触发的 BlockException。可以指定与原方法同类或通过 blockHandlerClass 在其他类中定义处理逻辑。
blockHandlerClass:指定限流处理方法所在的类,方法必须是 static,否则无法解析。
fallback:用于处理程序运行时发生的非常。fallback 方法处理除 exceptionsToIgnore 清除的非常外的所有非常。


  • 方法要求返回类型与原方法一致,参数与原方法匹配,或者可以在最后加上 Throwable 参数(捕获非常信息)。
  • 可以和原方法在同一个类,或通过 fallbackClass 指定其他类中的方法。
fallbackClass:指定 fallback 方法所在的类,方法必须是 static。
defaultFallback:全局通用的 fallback 方法。当未指定详细的 fallback 方法时触发,处理所有未清除的非常。
方法必须与原方法返回类型一致,而且没有参数或只有一个 Throwable 参数。
exceptionsToIgnore:指定不走 fallback 逻辑的非常,这些非常不会计入统计,直接抛出。
exceptionsToTrace:指定必要追踪的非常类型。
代码示例

要按照资源名称的方式对接口进行限流,并对限流后的哀求进行友好处理,可以使用 Sentinel 中的 @SentinelResource 注解来实现。
在 generateOrder 接口上添加 @SentinelResource 注解,并提供限流后的友好处理方法 handleBlock.
  1. package cloud.service1.controller;
  2. import cloud.service1.service.UserService;
  3. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. @RestController
  11. @RequestMapping("/user")
  12. public class UserController {
  13.     @Autowired
  14.     private UserService userService;
  15.     // 随机生成订单号接口,限流资源名为 "generateOrder"
  16.     @GetMapping("generateOrder")
  17.     @SentinelResource(value = "generateOrder", blockHandler = "handleBlock")
  18.     public String generateOrder(String userId, String tenantId, HttpServletRequest request) {
  19.         return userService.generateOrder(userId, tenantId);
  20.     }
  21.     // 处理限流的逻辑
  22.     public String handleBlock(String userId, String tenantId, HttpServletRequest request, BlockException ex) {
  23.         // 当接口被限流时返回友好的提示信息
  24.         return "订单生成服务繁忙,请稍后再试。";
  25.     }
  26. }
复制代码

在 Sentinel 控制台设置如下规则:


  • 资源名: generateOrder
  • 流控模式: 直接
  • 阈值类型: QPS
  • 单机阈值: 好比 1(表示每秒最多允许 1 次哀求)
  • 流控效果: 快速失败(即限流时直接失败)
在配置了限流规则后,调用 generateOrder 接口。如果哀求超出限流阈值(好比每秒凌驾 1 次哀求),则会触发限流,并返回友好提示 "订单生成服务繁忙,请稍后再试"。

熔断规则

Sentinel 的熔断规则主要分为三种策略,分别是 慢调用比例 (SLOW_REQUEST_RATIO)、非常比例 (ERROR_RATIO) 和 非常数 (ERROR_COUNT)。这些策略用于掩护服务免于过载或连续的失败。
慢调用比例 (SLOW_REQUEST_RATIO)

该策略会根据哀求相应的时间来判断是否进行熔断,适适用于防止因某些哀求相应过慢而拖垮整个体系。


  • RT(Response Time):表示体系中允许的最大相应时间,如果一个哀求的相应时间凌驾这个设定值,就会被判断为“慢调用”。
  • 最小哀求数量:在统计周期内,只有哀求数凌驾设定的最小哀求数,才会触发熔断逻辑。
  • 熔断条件:当单位时间内(statIntervalMs)内的慢调用比例凌驾设定的阈值时,触发熔断,进入熔断状态。
  • 恢复机制:在熔断时长过后,进入半开状态,如果后续哀求正常则关闭熔断器,如果再发生慢调用则继承熔断。
非常比例 (ERROR_RATIO)

该策略会根据非常的比例来判断是否进行熔断,适适用于当哀求的失败率忽然增加时,自动进行掩护。


  • 最小哀求数量:同样必要单位时间内的哀求数到达设定的最小值,才会盘算非常比例。
  • 熔断条件:当单位时间内(statIntervalMs)内的非常比例大于设定的阈值时,触发熔断,进入熔断状态。
  • 恢复机制:在熔断时长过后,进入半开状态,如果后续哀求成功,则关闭熔断器,否则继承熔断。
非常数 (ERROR_COUNT)

该策略根据单位时间内的非常数量来判断是否熔断,适适用于体系中发生大量非常时的掩护机制。


  • 熔断条件:当单位时间内(statIntervalMs)非常的数量凌驾设定的阈值后,自动熔断。
  • 恢复机制:与非常比例策略雷同,熔断时长过后进入半开状态,后续哀求成功关闭熔断器,失败则继承熔断。
代码示例

  1. package cloud.service1.controller;
  2. import cloud.service1.service.UserService;
  3. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/user")
  11. public class UserController {
  12.     @Autowired
  13.     private UserService userService;
  14.     // 使用Sentinel进行熔断和限流的接口
  15.     @GetMapping("/generateOrder")
  16.     @SentinelResource(value = "generateOrder", blockHandler = "handleBlock", fallback = "handleFallback")
  17.     public String generateOrder(String userId, String tenantId) {
  18.         // 调用服务生成订单号
  19.         return userService.generateOrder(userId, tenantId);
  20.     }
  21.     // 限流或者熔断时的处理方法
  22.     public String handleBlock(String userId, String tenantId, BlockException ex) {
  23.         System.out.println("系统繁忙,请稍后再试。");
  24.         return "系统繁忙,请稍后再试。";
  25.     }
  26.     // 出现异常时的处理方法
  27.     public String handleFallback(String userId, String tenantId, Throwable throwable) {
  28.         System.out.println("订单生成失败,服务暂不可用,请稍后重试。");
  29.         return "订单生成失败,服务暂不可用,请稍后重试。";
  30.     }
  31. }
复制代码
  1. package cloud.service1.service.impl;
  2. import cloud.service1.service.UserService;
  3. import org.springframework.stereotype.Service;
  4. import java.util.UUID;
  5. @Service
  6. public class UserServiceImpl implements UserService {
  7.     @Override
  8.     public String generateOrder(String userId, String tenantId) {
  9.         // 模拟可能出现的业务异常
  10.         if (Math.random() < 0.3) {
  11.             throw new RuntimeException("模拟的异常");
  12.         }
  13.         // 使用UUID生成随机订单号
  14.         String orderNo = generateRandomOrderNo();
  15.         return "订单生成成功: " + orderNo + ", 用户ID: " + userId + ", 租户ID: " + tenantId;
  16.     }
  17.     // 生成随机订单号
  18.     private String generateRandomOrderNo() {
  19.         return "ORD-" + UUID.randomUUID().toString().replace("-", "").substring(0, 12).toUpperCase();
  20.     }
  21. }
复制代码




  • 正常情况下,调用 /user/generateOrder 接口将会生成随机订单号并返回。
  • 当哀求过多时(凌驾QPS设置的阈值),接口会限流并返回 "体系繁忙,请稍后再试"。
  • 当服务抛出非常时(如模仿的业务非常),接口会实行降级并返回 "订单生成失败,服务暂不可用,请稍后重试"。
热点规则

热点规则(Hotspot Rule)是 Sentinel 中的一种限流机制,用于应对一些高频访问的资源。它根据传入参数的值来做限流,好比同一个接口如果频繁使用某个参数,导致资源过载,可以为此参数单独设置限流规则。
热点参数限流规则的属性

资源名:必要掩护的接口或方法名,即 Sentinel 掩护的资源。
参数索引位置:用于限流的热点参数的索引。对于多参数方法,通常指定参数的位置,从 0 开始。
阈值类型:


  • QPS(每秒哀求数):当特定参数的哀求数到达设定的 QPS 阈值时,进行限流。
  • 线程数:当调用线程数到达设定阈值时,进行限流。
限流模式:


  • 直接限流:直接对热点参数的哀求进行限流。
  • 关联限流:如果某个关联的资源到达了限流条件,则对当前资源进行限流。
流控效果:


  • 快速失败:到达限流条件时,立即失败,抛出非常。
  • 排队期待:哀求以匀速方式进行处理,凌驾的哀求将排队期待。
  • Warm Up:随着时间渐渐增加限流阈值,适用于体系刚启动时的掩护机制。
代码示例

  1. package cloud.service1.service;
  2. public interface UserService {
  3.     // 生成订单号
  4.     String generateOrder(String userId, String tenantId);
  5. }
复制代码
  1. package cloud.service1.service.impl;
  2. import cloud.service1.service.UserService;
  3. import org.springframework.stereotype.Service;
  4. import java.util.UUID;
  5. @Service
  6. public class UserServiceImpl implements UserService {
  7.     @Override
  8.     public String generateOrder(String userId, String tenantId) {
  9.         // 生成随机订单号
  10.         String orderNo = generateRandomOrderNo();
  11.         return "订单号: " + orderNo + ", 用户ID: " + userId + ", 租户ID: " + tenantId;
  12.     }
  13.     // 生成随机订单号的方法
  14.     private String generateRandomOrderNo() {
  15.         return "ORD-" + UUID.randomUUID().toString().replace("-", "").substring(0, 12).toUpperCase();
  16.     }
  17. }
复制代码
  1. package cloud.service1.controller;
  2. import cloud.service1.service.UserService;
  3. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.bind.annotation.RestController;
  9. @RestController
  10. @RequestMapping("/user")
  11. public class UserController {
  12.     @Autowired
  13.     private UserService userService;
  14.     // 获取订单号的接口
  15.     @GetMapping("generateOrder")
  16.     @SentinelResource(value = "generateOrder", blockHandler = "handleGetOrderNoBlock")
  17.     public String generateOrder(@RequestParam String userId, @RequestParam String tenantId) {
  18.         return userService.generateOrder(userId, tenantId);
  19.     }
  20.     // 当触发限流规则时的处理方法
  21.     public String handleGetOrderNoBlock(String userId, String tenantId, com.alibaba.csp.sentinel.slots.block.BlockException ex) {
  22.         System.out.println("触发热点限流,用户ID: " + userId + " 的请求被限流");
  23.         return "触发热点限流,用户ID: " + userId + " 的请求被限流";
  24.     }
  25. }
复制代码

 

体系规则

Sentinel 中,体系规则 是一种特殊的流量控制规则,用于掩护团体体系的稳固性。它主要从体系负载角度来防止流量过载,制止体系崩溃。通过对体系入口流量、体系平均相应时间等维度进行监控和限制,保障体系资源的合理使用。
体系规则的几种策略

1.LOAD (体系负载)


  • 作用:仅适用于 Linux/Unix-like 操纵体系。用于限制体系的负载,防止体系超载。
  • 阈值:可以根据体系的 CPU 核心数设置,当体系的负载(即体系正在运行和期待的任务数量)凌驾指定阈值时,触发限流。
  • 典型设置:一样平常设置为 CPU 核心数的 0.7 ~ 0.9 倍。
  • 示例:如果机器是 4 核,负载阈值可以设为 3.0。
2.RT (平均相应时间)


  • 作用:限制哀求的平均相应时间。适用于对相应时间敏感的场景。
  • 阈值:当单位时间(默认为 1 秒)内,体系哀求的平均相应时间(Response Time, RT)凌驾某个阈值时,触发限流。
  • 示例:当平均相应时间凌驾 500 毫秒时,触发限流。
3. 线程数


  • 作用:控制体系的最大并发线程数。适用于掩护体系免于过多线程被占用,制止资源耗尽。
  • 阈值:当入口的并发线程数到达阈值时,触发限流。
  • 示例:设置最大并发线程数为 200,当凌驾该线程数时,触发限流。
4. 入口 QPS (每秒哀求数)


  • 作用:限制体系入口流量的最大 QPS(每秒查询数)。适用于限制外部流量,保障体系不被超负荷的流量攻击。
  • 阈值:当体系入口的 QPS 凌驾设定值时,触发限流。
  • 示例:当 QPS 凌驾 100 时,触发限流。
5. CPU 使用率


  • 作用:限制 CPU 使用率,防止 CPU 过载导致体系无法处理哀求。
  • 阈值:当 CPU 使用率凌驾某个阈值时,触发限流。
  • 注意:Sentinel 自己不直接通过配置项支持 CPU 使用率限流,但可以通过体系监控和自定义的方式配合 Sentinel 实现。
   注意:如果配置了体系规则,所有的接口都会被限流
  代码示例

  1. package cloud.service1.controller;
  2. import cloud.service1.service.UserService;
  3. import com.alibaba.csp.sentinel.annotation.SentinelResource;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. import org.springframework.web.bind.annotation.RestController;
  10. @RestController
  11. @RequestMapping("/user")
  12. public class UserController {
  13.     @Autowired
  14.     private UserService userService;
  15.     // 获取订单号的接口,受系统规则保护
  16.     @GetMapping("/generateOrder")
  17.     @SentinelResource(value = "generateOrder", blockHandler = "handleGenerateOrderBlock")
  18.     public String generateOrder(@RequestParam String userId, @RequestParam String tenantId) {
  19.         return userService.generateOrder(userId, tenantId);
  20.     }
  21.     // 当系统规则触发时的限流处理逻辑
  22.     public String handleGenerateOrderBlock(String userId, String tenantId, BlockException exception) {
  23.         // 处理被系统规则限流的情况,返回友好提示信息
  24.         System.out.println("系统过载,请稍后再试!");
  25.         return "系统过载,请稍后再试!";
  26.     }
  27. }
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

钜形不锈钢水箱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表