【Spring Cloud Alibaba Sentinel 实现熔断与限流】 —— 每天一点小知识(下)

6. 热点key限流

💧除了针对整个接口的限流,Sentinel还支持对特定的热点key进行限流,以应对热点数据的访问。

6.1 创建热点key规则

💧在Sentinel控制台中,点击左侧导航栏的”热点参数限流”,然后点击右上角的”新增”按钮。

💧在弹出的对话框中,填写规则信息。例如,我们设置一个参数名称为hotParam的规则,限制该参数的QPS阈值为5。

6.2 验证热点key规则

💧在浏览器中访问http://localhost:8080/hello?hotParam=1,你将看到接口返回的数据。继续访问接口,并在URL中修改hotParam参数的值,当访问超过规则中设置的QPS阈值时,将会触发热点key的限流。

7. 系统规则

💧Sentinel还提供了系统规则,用于限制整个系统的访问流量。

7.1 创建系统规则

💧在Sentinel控制台中,点击左侧导航栏的”系统规则”,然后点击右上角的”新增”按钮。

💧在弹出的对话框中,填写规则信息。例如,我们设置一个QPS阈值为20的规则。

7.2 验证系统规则

💧在浏览器中访问http://localhost:8080/hello,你将看到接口返回的数据。继续刷新页面,当访问超过系统规则中设置的QPS阈值时,将会触发系统的限流,接口将无法正常访问。

8. @SentinelResource

💧除了在代码中使用@SentinelResource注解来保护接口,我们还可以使用它来定义自定义的熔断、降级、限流逻辑。

8.1 定义自定义逻辑

💧DemoController类中添加一个新的方法,并使用@SentinelResource注解来定义自定义的逻辑。例如:

@GetMapping("/custom")
@SentinelResource(value = "custom", fallback = "handleFallback", blockHandler = "handleBlock")
public String custom() {
    // 自定义业务逻辑
    return "Custom Logic";
}
// 降级处理方法
public String handleFallback() {
    return "Fallback Logic";
}
// 限流处理方法
public String handleBlock(BlockException ex) {
    return "Block Logic";
}

8.2 验证自定义逻辑

💧在浏览器中访问http://localhost:8080/custom,你将看到接口返回的数据是自定义逻辑中定义的结果。你还可以在Sentinel控制台中配置相应的熔断、降级、限流规则,以触发相应的逻辑。

9. 服务熔断功能规则持久化

💧默认情况下,Sentinel控制台中的规则只在内存中生效,并不会持久化到磁盘。如果希望规则持久化,以防止控制台重启导致规则丢失,可以进行如下配置。

9.1 创建数据库表

💧在你的MySQL数据库中执行以下SQL语句,创建Sentinel控制台的规则持久化表:

CREATE TABLE sentinel_rule (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  app_name VARCHAR(128) NOT NULL,
  resource VARCHAR(255) NOT NULL,
  limit_app VARCHAR(128),
  limit_type INT NOT NULL,
  count INT NOT NULL,
  strategy INT NOT NULL,
  ref_resource VARCHAR(255),
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

9.2 配置数据源

💧在Sentinel控制台的application.properties文件中,添加以下配置,配置数据库的连接信息:

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/sentinel?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

💧jdbc:mysql://localhost:3306/sentinel替换为你的MySQL数据库连接信息。

9.3 配置规则持久化

💧在Sentinel控制台的application.properties文件中,添加以下配置,启用规则持久化:

# 规则持久化配置
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel_rule
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

💧localhost:8848替换为你的Nacos配置中心的地址和端口。

9.4 重启Sentinel控制台

💧重启Sentinel控制台,配置的规则将会自动从数据库加载。

https://liangxr.blog.csdn.net/article/details/131432152?spm=1001.2014.3001.5502

发表评论