一、简介
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
避免大批量的瞬时请求都打到服务上,将服务压垮。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
二、如何使用
第一步:引入pom依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.1.0.RELEASE</version></dependency>
第二步:配置yml文件
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8858 #配置自己的服务器或本地路由
第三步:测试使用
service层定义一个方法
Boolean test();
impl实现这个方法
@SentinelResource(value = "test",blockHandler = "exceptionHandler")@Overridepublic Boolean test() {return true;}public ResultUtil exceptionHandler(BlockException ex){return ResultUtil.success("请求过于频繁");}
在要进行限流的方法上加上 @SentinelResource注解
编写controller测试
@GetMapping("/test")public ResultUtil test(){return ResultUtil.success(userService.test());}
@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 逻辑中,而是会原样抛出。
然后将项目部署到服务器上,启动
去调用刚写的测试接口
这里data为空是因为我进行了限流控制,设置为0,所以每次访问都是null,如果设为1就能访问到