目录
2.3 使用Sentinel DashBoard实现流量控制
2.3.2 将自己的项目与Sentinel DashBoard关联
2.3.7 在Sentinel DashBoard中定义规则
1 Sentinel介绍
1.1 Sentinel是什么
当前互联网环境中,应用服务器需要处理的请求与数据量快速增长,在高并发与大数据量的场景下确保服务的稳定变得尤为重要。因此,需要从多个维度保护服务的稳定性。
Alibaba的Sentinel就是这样的一个开源组件。Sentinel翻译过来是哨兵,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel作为Alibaba开源的技术,承接了Alibaba近10年双十一大促流量的核心场景,比如将突发流量控制在系统可以承受的范围、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
从使用的角度来说,Sentinel提供了可视化界面设置相关的控制规则。同时,也提供了简单易用、完善的SPI扩展接口,用户可以通过实现扩展接口快速地定制逻辑,比如定制规则管理、适配动态数据源等。
Sentinel还提供实时监控的功能,可以从可视化界面中获取到秒级内的实时数据。同时,它也可以非常方便地与我们常用的框架进行整合,如:Spring Cloud、Dubbo、gRPC、Service Mesh等。
1.2 组成
在使用上,Sentinel由核心库与控制台这两大部分组成。
核心库是就在我们自己的项目中引入的Sentinel依赖,Sentinel核心库可以运行于Java7及以上的版本,并且不依赖其他框架或者库,对Spring Cloud与Dubbo也有不错的支持。
控制台,或者说Dash Board,是一个Spring Boot的项目,该项目已经打成jar包放在了Sentinel的Github上,下载后可以直接运行,提供了包括查看机器列表、监控、规则管理与推送、鉴权等功能。
1.3 关键概念
使用Sentinel必须清楚的两个关键概念是资源与规则。
通过Sentinel API定义的代码,就是资源,能够被Sentinel保护起来。它可以是Java应用程序中的任何内容,例如:服务,服务中的方法,甚至可以是一段代码。同时,通过注解声明资源是比较常见的用法。
规则是保护服务稳定的准则,是围绕资源的实时状态设定的规则。如:服务中某一个具体的接口每秒可以访问多少次、何时触发服务熔断等。Sentinel的所有规则都可以在内存中动态地查询及修改,所有规则可以动态实时调整。同时Sentinel也提供相关API,让用户制定自己所需的规则。Sentinel支持包括流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则、热点参数规则。本文主要描述的是流量控制相关的内容,熔断相关内容后面再写。
2 Sentinel流量控制案例
使用Sentinel有两种方式,一种是在代码中使用Sentinel提供的API,另一个种是在Sentinel提供的控制台中完成对资源的规则设置。接下来就在一个Spirng Boot测试项目中对两种方式进的使用进行详细的记录。
2.1 引入依赖
无论是使用在代码中调用Sentinel提供的API进行编码或者是使用Sentinel提供的Dash Board控制台,都需要在项目引入Sentinel的依赖,下面这些依赖包含了使用Sentinel流量控制的所有功能,包括有核心库、注解、指定来源访问控制、热点参数访问控制等。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.7.2</version>
</dependency>
<!-- 使用Sentinel注解相关依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.7.2</version>
</dependency>
<!-- Sentinel指定来源限流相关依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>1.7.2</version>
</dependency>
<!-- 热点参数限流相关依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.7.2</version>
</dependency>
2.2 使用Sentinel提供的API实现流量控制
2.2.1 写一个有返回值的接口
这里写一个接口,直接返回“Hello Sentinel”字符串。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/useApi")
public class UseApiController {
@GetMapping(value = "/hello")
public String hello() {
return "Hello Sentinel";
}
}
2.2.2 声明资源与定义规则
前面记录过Sentinel两个核心概念,资源与规则。在这里,资源就是将hello这一个方法声明为Sentinel的资源,且资源的名称也同样定义为hello。
定义规则就是给hello这一资源定义流控规则。本例中,设定的阈值类型为QPS,阈值为2,针对的来源请求