目录
一、Sentinel中间件简单介绍
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
避免大批量的瞬时请求都打到服务上,将服务压垮。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
1.1、大致流程
无论是限流、降级、负载等控制手段,大致流程如下:
- StatisticSlot 则用于记录、统计不同维度的 runtime 指标监控信息
- 责任链依次触发后续 slot 的 entry 方法,如 SystemSlot、FlowSlot、DegradeSlot 等的规则校验;
- 当后续的 slot 通过,没有抛出 BlockException 异常,说明该资源被成功调用,则增加执行线程数和通过的请求数等信息。
关于数据统计,主要会牵扯到 ArrayMetric、BucketLeapArray、MetricBucket、WindowWrap 等类。
二、Sentinel中间件的使用方法
2.1、引入pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
2.2、配置application.yml文件
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8888 #配置自己的服务器或本地路由
2.3、测试使用
1、service层定义一个方法:
public interface ITestService {
Boolean test();
}
2、impl层实现这个方法:
在要进行限流的方法上加上 @SentinelResource注解
@SentinelResource(value = "test",blockHandler = "exceptionHandler")
@Override
public Boolean test() {
return true;
}
public ResultUtil exceptionHandler(BlockException ex){
return ResultUtil.success("请求过于频繁");
}
3、编写controller测试
@GetMapping("/test")
public ResultUtil test(){
return ResultUtil.success(userService.test());
}
然后将项目部署到服务器上,启动,使用postman去调用刚写的测试接口
2.4、@SentinelResource注解属性
@SentinelResource注解包含一下属性:
(1)vale
资源名称,必需项,因为需要通过resource name找到对应的规则,这个是必须配置的。 定义资源名,该名称将会显示在控制台中,并且在定义流控以及熔断降级规则时,指定资源名称。
(2)entryType
入口类型,可选项: EntryType.IN和EntryType.OUT(默认为 EntryType.OUT)
(3)blockHandler对应处理 BlockException 的函数名称,可选项。
(4)blockHandlerClass
blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
(5)fallback
函数名称,可选项,仅针对降级功能生效(DegradeException)。fallback 函数的访问范围需要是 public,参数类型和返回类型都需要与原方法相匹配,并且需要和原方法在同一个类中。业务异常不会进入 fallback 逻辑。
(6)fallbackClass
fallbackClass的应用和blockHandlerClass类似,fallback 函数默认需要和原方法在同一个类中。 若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
(7)defaultFallback
如果没有配置defaultFallback方法,默认都会走到这里来,默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑,默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理,若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
(8)exceptionsToIgnore
用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。