1. 流量控制&熔断降级的实现方案
2. 3种方案对比
3. Sentinel
3.1 Sentinel介绍
阿里巴巴出品面向分布式服务架构的轻量级流量控制组件
主要以
流量为切入点;
从限流、流量整形、熔断降级、系统负载均衡
保护等多个维度;
来保障微服务的稳定性
GitHub地址:https://github.com/alibaba/Sentinel
中文文档:https://github.com/alibaba/Sentinel/wiki/介绍
3.2 Sentinel组成
Sentinel使用主要分为两个部分:
-
核心库:主要指java客户端,不依赖任何框架/库,能运行在java7及以上版本的环境中,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
-
控制台:控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
3.3 Sentinel特征
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
4. Sentinel入门
4.1 本地demo
1.创建springboot工程
2.在pom.xml中引入sentinel-core依赖
<!--sentinel-core依赖-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.1</version>
</dependency>
3.定义controller
@RestController
public class TestController {
/**
* 资源 是 Sentinel 中的核心概念之一。最常用的资源是我们代码中的 Java 方法。
* 当然,您也可以更灵活的定义你的资源,
* 例如,把需要控制流量的代码用 Sentinel API SphU.entry("HelloWorld") 和 entry.exit() 包围起来即可。
* 在下面的例子中,我们将 System.out.println("hello world"); 作为资源(被保护的逻辑)
* 用 API 包装起来。参考代码如下:
* @return
*/
@RequestMapping("/hello")
public String hello(){
// 配置规则.
initFlowRules();
// 1.5.0 版本开始可以直接利用 try-with-resources 特性,自动 exit entry
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
return "hello world";
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("系统繁忙,请稍后重试!");
return "系统繁忙,请稍后重试!";
}
}
/**
* 定义规则
*
* 接下来,通过流控规则来指定允许该资源通过的请求次数;
* 例如下面的代码定义了资源 HelloWorld
* 每秒最多只能通过 20 个请求。
*/
@PostConstruct//当前类的构造函数执行之后执行
private void initFlowRules() {
//1.创建存放限流规则的集合
List<FlowRule> rules = new ArrayList<>();
//2.创建限流规则
FlowRule rule = new FlowRule();
//定义资源,表示Sentinel会对哪个资源生效
rule.setResource("HelloWorld");
//定义限流的类型(此处使用QPS作为限流类型)
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//定义资源 HelloWorld 每秒最多只能通过2个请求。
rule.setCount(2);
//3.将限流规则存放到集合中
rules.add(rule);
//4.加载限流规则
FlowRuleManager.loadRules(rules);
}
}
4.测试,
正常
:控制台打印hello world
当请求短时间内,超过2次
:控制台打印:系统繁忙,请稍后重试!
4.2 Sentinel 控制台
概述
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及
健康情况管理
、监控(单机和集群),规则管理和推送的功能。
Sentinel 控制台包含如下功能:
- 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
- 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
- 规则管理和推送:统一管理推送规则。
- 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
4.3 启动控制台
4.3.1 获取 Sentinel 控制台
1.下载https://github.com/alibaba/Sentinel/releases
4.3.2 启动
注意
:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
创建一个文件夹,
E:\develop\Sentinel
将sentinel-dashboard-1.8.1.jar移入Sentinel文件夹
创建一个start.bat
文件
start.bat文件中的内容为:
java -Dserver.port=9870 -jar sentinel-dashboard-1.8.1.jar
其中
-Dserver.port=9870
用于指定 Sentinel 控制台端口为9870
注意
: 从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的 登录 功能,默认用户名和密码都是 sentinel
点击start.bat启动
由于本地应用没有接入控制台,所以是空白…
4.4 本地服务接入控制台
本地服务是以客户端的身份来接入控制台,具体步骤如下:
4.4.1 导入依赖
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。您可以通过 pom.xml 引入 JAR 包:
<!--本地应用接入控制台的依赖-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.1</version>
</dependency>
4.4.2 在本地应用添加JVM启动参数
-Dcsp.sentinel.dashboard.server=localhost:9870 Sentinel控制台的主机地址和端口号
-Dproject.name=FirstDemo 本地应用在控制台中的名称