Sentinel

目录

一、Sentinel 简介

Sentinel 是阿里巴巴开源的分布式系统流量防卫组件,提供流量控制 、熔断降级 、系统自适应保护等功能。作为 Spring Cloud Alibaba 核心组件,广泛应用于电商秒杀、直播等高并发场景,防止系统因突发流量崩溃。

核心特性

  • 流量控制:基于 QPS/并发数/调用关系多维度限流
  • 熔断降级:自动检测慢调用/异常比例触发熔断
  • 热点防护:针对高频参数自动限流
  • 系统保护:根据系统负载动态调整流量
  • 实时监控:秒级监控数据可视化

二、环境准备

1. 控制台安装

bash 复制代码
# 下载最新版本(以 1.8.5 为例)
wget https://github.com/alibaba/Sentinel/releases/download/1.8.5/sentinel-dashboard-1.8.5.jar

# 启动控制台(默认端口 8080)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.5.jar

访问 http://localhost:8080(默认账号密码:sentinel/sentinel)

2. Spring Boot 集成

xml 复制代码
<!-- pom.xml -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2022.0.0.0</version>
</dependency>
yaml 复制代码
# application.yml
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      eager: true # 立即注册到控制台

三、核心功能实战

1. 流量控制

定义资源:

java 复制代码
@GetMapping("/order")
@SentinelResource(value = "createOrder", blockHandler = "handleFlowLimit")
public String createOrder() {
    return "订单创建成功";
}

// 流控处理函数
public String handleFlowLimit(BlockException ex) {
    return "系统繁忙,请稍后再试!";
}

控制台配置:

  1. 在控制台找到对应资源
  2. 新增流控规则:QPS=2(阈值类型选QPS,单机阈值=2)
  3. 使用 JMeter 压测验证效果

2. 熔断降级

java 复制代码
@SentinelResource(value = "paymentService", 
                  fallback = "paymentFallback",
                  exceptionsToIgnore = {IllegalArgumentException.class})
public String processPayment(String orderId) {
    // 业务逻辑
}

// 降级处理函数
public String paymentFallback(String orderId, Throwable t) {
    return "支付服务暂时不可用,请稍后重试";
}

熔断规则配置:

  • 熔断策略:慢调用比例
  • 最大 RT:500ms
  • 比例阈值:0.5(50%)
  • 熔断时长:5秒
  • 最小请求数:5

3. 热点参数限流

java 复制代码
@GetMapping("/product")
@SentinelResource(value = "queryProduct", blockHandler = "paramFlowHandler")
public String getProduct(@RequestParam("pid") String productId) {
    return "商品详情";
}

// 热点参数处理
public String paramFlowHandler(String productId, BlockException ex) {
    return "当前商品访问火爆,请稍后再试";
}

参数规则配置:

java 复制代码
ParamFlowRule rule = new ParamFlowRule("queryProduct")
    .setParamIdx(0) // 参数索引
    .setCount(10);  // 阈值
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));

四、高级配置

1. 规则持久化(Nacos 集成)

xml 复制代码
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
yaml 复制代码
spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: sentinel-rules
            groupId: DEFAULT_GROUP
            rule-type: flow

2. 集群流控

java 复制代码
// 启动 Token Server
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton("App-Cluster"));
yaml 复制代码
# token-server 配置
spring:
  cloud:
    sentinel:
      transport:
        client-ip: 192.168.1.10
        cluster-server:
          port: 18730

五、生产实践建议

  1. 压测基准 :通过 curl http://localhost:8719/tree?type=root 获取资源树
  2. 监控集成:对接 Prometheus + Grafana
  3. 动态调整:使用 Sentinel 的 HTTP API 实时修改规则
  4. 异常处理 :统一实现 BlockExceptionHandler 接口

完整示例代码:Sentinel Demo 项目

相关推荐
金銀銅鐵40 分钟前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
卡卡~~40 分钟前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
qq_406981031 小时前
大白话rust系列09 函数调用两次有什么错?
开发语言·python·rust
学逆向的1 小时前
C 多文件开发
c语言·开发语言·网络安全
布吉岛的石头1 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
benchmark_cc1 小时前
QuantDash 安装成功后,如何验证 Python 环境可以正常导入 SDK?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
大文说跨境1 小时前
防关联浏览器的指纹覆盖到什么程度:六类参数的实测与自检方法
java·指纹浏览器·tiktok运营
学逆向的2 小时前
C 内存属性
c语言·开发语言·算法·网络安全
Carol06302 小时前
上肢及肩肘关节
java·服务器·数据库
yliucherish2 小时前
Log4Shell 复现实录:我读 OpenJDK 源码,发现两道防线的默认值竟然相反
java