1.背景
1.1 简介
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
- 完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
1.2 学习参考
- sentinel官方文档:《官方文档地址》
- sentinel源码解析:《sentinel是如何限流的》
- sentinel常规知识点:《sentinel连环17问》
1.3 章节介绍
本文主要介绍以下知识点:
- 基于Spring boot 对接Sentinel;
- Nacos配置Sentinel规则信息;
- 测试流控规则,系统保护规则,熔断规则;
- Sentinel控制台数据展示问题;
- Nacos规则存储与Sentinel修改数据同步问题;
- Sentinel责任链模式分析
2.项目构建
2.1 pom配置
<!-- nacos配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.6.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.6.RELEASE</version> </dependency> <!-- sentinel配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.6.RELEASE</version> </dependency> <!-- sentinel 规则基于nacos存储--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.3</version> </dependency>
2.2 项目参数配置
server: servlet: context-path: /sentinel-nacos-demo spring: application: name: sentinel-nacos-demo profiles: active: local cloud: nacos: config: server-addr: xxx.xxx.xx.x:8848 #server-addr: xxx.xxx.xx.x:8848 group: ${spring.application.name} file-extension: yaml # 配置中心使用单独namespace namespace: "study" discovery: server-addr: xxx.xxx.xx.x:8848 namespace: "study" group: "sentinel-nocas-demo" sentinel: transport: dashboard: xxx.xxx.xx.x:8842 #启动本项目后需要请求一次才能向sentinel控制台注册 port: 8719 #当一个服务器部署多个应用时要配置不同port,单个应用可忽略 client-ip: 10.32.4.230 #指定本机ip地址,避免多个虚拟地址,导致数据获取失败 datasource: ## 配置流程控制 ## rule-type 配置表示该数据源中的规则属于哪种类型的规则(flow流控,degrade熔断降级,authority授权,system系统保护, param-flow热点参数限流, gw-flow, gw-api-group) flow: nacos: server-addr: xxx.xxx.xx.x:8848 namespace: "study" data-id: ${spring.application.name}-sentinel-flow-rules group-id: sentinel-group data-type: json rule-type: flow ## 配置降级规则 degrade: nacos: server-addr: xxx.xxx.xx.x:8848 namespace: "study" dataId: ${spring.application.name}-sentinel-degrade-rules groupId: sentinel-group data-type: json rule-type: degrade system: nacos: server-addr: xxx.xxx.xx.x:8848 namespace: "study" dataId: ${spring.application.name}-sentinel-system-rules groupId: sentinel-group data-type: json rule-type: system
2.3 规则配置
在Nacos配置中心中设置如下配置:
Sentinel 流控规则配置
[ { "resource": "/sentinel/rule/flow", "limitApp": "default", "grade": 1, "count": 1, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ]
Sentinel 熔断规则配置
[ { "resource": "/sentinel/rule/degrade", "count": 1, "grade": 0, "timeWindow": 10, "minRequestAmount": 1, "statIntervalMs": 1000, "slowRatioThreshold": 0.1 } ]
Sentinel 系统保护规则配置
[ { "avgRt":1, "highestCpuUsage":-1, "highestSystemLoad":-1, "maxThread":-1, "qps":1000 } ]