Sentinel: 分布式系统的流量防卫兵

Sentinel: 分布式系统的流量防卫兵

一、介绍
1.1 Sentinel是什么
面向分布式服务架构的轻量级流量控制产品。

阿里巴巴“大中台、小前台”架构中的基础模块之一。

以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

1.2 Sentinel 组成
核心库(Java客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
1.3 Sentinel 特征
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的生源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的SPI扩展点:Sentinel 提供简单易用、完善的 SPI 扩展点。可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
1.4 Sentinel 特性
在这里插入图片描述

1.5 Sentinel 生态
在这里插入图片描述

1.6 Sentinel核心概念
1.6.1 资源
只要通过 Sentinel API 定义的代码,就是资源。

一段代码
由应用程序提供的服务
由应用程序调用的其他应用提供的服务
资源名:用来标识资源,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

1.6.2 规则
围绕资源的实时状态设定的规则。

流量控制规则
熔断降级规则
系统保护规则
所有规则可以动态实时调整。

1.6.3 理念
定义资源:资源埋点,考虑哪些代码、方法、服务需要保护,调用api、框架flter、aop等方式
定义规则:资源规则,根据业务场景随时添加、修改、删除规则,调用api、DataSource接口等方式
1.7 Sentinel 工作流程
在Sentinel 中,所有资源都对应一个资源名称以及一个Entry。Entry通过主流框架的适配自动创建,也可以通过注解方式或调用 SphU API显式创建。每一个Entry创建的时候,同事也会创建一系统插槽Slot。每个Slot有不同职责。

总体框架如下:
在这里插入图片描述
二、Sentinel 控制台
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。
在这里插入图片描述
2.1 功能列表
2.1.1 实时监控
实时查看集群中每个资源的实时访问以及流控情况。

仅存储5分钟以内的数据,持久化需要定制开发

2.1.2 簇点链路
展示资源调用链路,方便设置流控,降级规则。

内存中,仅展示启动后调用过的资源

2.1.3 流控规则
流控骨折的增删改查

2.1.4 降级规则
降级规则的增删改查

2.1.5 热点规则
热点规则的增删改查

2.1.6 系统规则
系统规则的增删改查

2.1.7 授权规则
授权规则的增删改查

2.1.8 集群流控
集群流控规则的增删改查

2.1.9 机器列表
提供机器自发现功能,方便查看集群机器数量和机器健康状况

若应用已退出,过5分钟没有收到心跳,控制台就会标记对应机器为失联状态,但不会将对应应用从列表中移除

三、快速开始
3.1 手动接入Sentinel
3.1.1 在应用中引入Sentinel Jar包
如果应用使用 pom 工程,则在 pom.xml 文件中加入以下代码即可:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.1</version>
</dependency>

注:Sentinel仅支持JDK1.8或者以上版本

3.1.2 定义资源
把需要控制流量的代码用 Sentinel API SphU.entry(“HelloWorld”) 和 entry.exit() 包围起来即可。在下面的例子中,将 System.out.println(“hello world”); 这端代码作为资源,用 API 包围起来(埋点)。参考代码如下:

public static void main(String[] args) {
    initFlowRules();
    while (true) {
        Entry entry = null;
        try {
	    entry = SphU.entry("HelloWorld");
            /*您的业务逻辑 - 开始*/
            System.out.println("hello world");
            /*您的业务逻辑 - 结束*/
	} catch (BlockException e1) {
            /*流控逻辑处理 - 开始*/
	    System.out.println("block!");
            /*流控逻辑处理 - 结束*/
	} finally {
	   if (entry != null) {
	       entry.exit();
	   }
	}
}

3.1.3 定义规则
通过规则来指定允许该资源通过的请求次数,例如下面的代码定义了资源 HelloWorld 每秒最多只能通过 20 个请求。

private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}

3.1.4 检查效果
Demo 运行之后,可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的输出:

|–timestamp-|------date time----|-resource-|p |block|s |e|rt
1529998904000|2018-06-26 15:41:44|HelloWorld|20|0 |20|0|0
1529998905000|2018-06-26 15:41:45|HelloWorld|20|5579 |20|0|728
1529998906000|2018-06-26 15:41:46|HelloWorld|20|15698|20|0|0
1529998907000|2018-06-26 15:41:47|HelloWorld|20|19262|20|0|0
1529998908000|2018-06-26 15:41:48|HelloWorld|20|19502|20|0|0
1529998909000|2018-06-26 15:41:49|HelloWorld|20|18386|20|0|0
其中 p 代表通过的请求, block 代表被阻止的请求, s 代表成功执行完成的请求个数, e 代表用户自定义的异常, rt 代表平均响应时长。

可以看到,这个程序每秒稳定输出 “hello world” 20 次,和规则中预先设定的阈值是一样的。

3.2 启动Sentinel控制台
3.2.1 获取Sentinel 控制台
可以从最新版本的源码自行构建 Sentinel 控制台:

下载 控制台 工程
使用以下命令将代码打包成一个 fat jar: mvn clean package
3.2.2 启动
使用如下命令启动控制台:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。

从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。

注:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。

3.3 客户端接入控制台
3.3.1 引入JAR包
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。可以通过 pom.xml 引入 JAR 包:

com.alibaba.csp sentinel-transport-simple-http x.y.z 3.3.2 配置启动参数 启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。

从 1.6.3 版本开始,控制台支持网关流控规则管理。需要在接入端添加 -Dcsp.sentinel.app.type=1 启动参数以将服务标记为 API Gateway,在接入控制台时服务会自动注册为网关类型,然后即可在控制台配置网关规则和 API 分组。

3.3.3 触发客户端初始化
确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。

注:需要根据应用类型和接入方式引入对应的 适配依赖,否则即使有访问量也不能被 Sentinel 统计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值