【转】 SpringCloudAlibaba之Sentinel流量控制
一、认识下Sentinel
Sentinel使用流程:微服务会集成Sentinel客户端,从官方下载jar启动作为服务端,在有配置变更和添加的时候Sentinel会发送消息给客户端,进行变更应用。
Sentinel 分为两个部分:
核⼼库:(Java 客户端)不依赖任何框架/库,能够运⾏于所有 Java 运⾏时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的⽀持。
控制台:(Dashboard)基于 Spring Boot 开发,打包后可以直接运⾏,不需要额外的 Tomcat 等应⽤容器。
丰富的应⽤场景:Sentinel 承接了阿⾥巴巴近 10 年的双⼗⼀⼤促流量的核⼼场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填⾕、集群流量控制、实时熔断下游不可⽤应⽤等。 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接⼊应⽤的单台机器秒级数据,甚⾄ 500 台以下规模的集群的汇总运⾏情况。 ⼴泛的开源⽣态:Sentinel 提供开箱即⽤的与其它开源框架/库的整合模块,例如与 SpringCloud、Dubbo的整合。您只需要引⼊相应的依赖并进⾏简单的配置即可快速地接⼊ Sentinel。 完善的 SPI 扩展点:Sentinel 提供简单易⽤、完善的 SPI 扩展接⼝。您可以通过实现扩展接⼝来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
二、Sentinel简单实战
Sentinel官方版本下载地址: https://github.com/alibaba/Sentinel/releases
快速下载启动开发环境:国内朋友可以考虑使用docker配置国内镜像源,
直接执行:docker run --name sentinel -p 8858:8858 -d bladex/sentinel-dashboard
1、搭建Sentinel服务端
如下下载的jar包直接执行以下命令即可启动服务。
java -jar sentinel-dashboard-1.7.1.jar &
jar命令启动完成,登录地址 http://localhost:8080, ⽤户名/密码:sentinel/sentinel
docker启动完成,登录地址 http://localhost:8858, ⽤户名/密码:sentinel/sentinel
2、搭建Sentinel客户端
第一步、先引入pom文件,注意没有使用maven统一管理版本号的,需要指定version字段
<!--借用监控开放端口--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--sentinel 核⼼环境 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
第二步、修改配置文件
注意:dashboard 为sentinel服务的客户端,port为客户端自己开发端口,用于接收服务端发送的限流数据,port可以随意更改。
spring: sentinel: transport: #sentinel dashboard/console 地址 dashboard: 127.0.0.1:8858 # sentinel会在该端⼝启动http server,那么这样的话,控制台定义的⼀些限流等规则才能发送传递过来, port: 8719 #暴露出来健康检查和检测的接口 management: endpoints: web: exposure: include: "*" endpoint: health: show-details: always
第三步、启动项目访问Sentenl即可生效
三、Sentinel高级应用
1、流控规则
在Sentinel服务的管理台,会列出服务的菜单,点击服务-->簇点链路-->流控,出现下图页面。
重点属性介绍
资源名: 默认请求路径 针对来源: Sentinel可以针对调⽤者进⾏限流,填写微服务名称,默认default(不区分来源) 阈值类型/单机阈值 QPS:(每秒钟请求数量)当调⽤该资源的QPS达到阈值时进⾏限流 线程数:当调⽤该资源的线程数达到阈值的时候进⾏限流(线程处理请求的时候,如果说业务逻辑执⾏时间很⻓,流量洪峰来临时,会耗费很多线程资源,这些线程资源会堆积,最终可能造成服务不可⽤,进⼀步上游服务不可⽤,最终可能服务雪崩) 是否集群: 是否集群限流 流控模式: 直接:资源调⽤达到限流条件时,直接限流 关联:关联的资源调⽤达到阈值时候限流⾃⼰ 链路:只记录指定链路上的流量 流控效果: 快速失败:直接失败,抛出异常 Warm Up:根据冷加载因⼦(默认3)的值,从阈值/冷加载因⼦,经过预热时⻓,才达到设置的QPS阈值 排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则⽆效
2、Sentinel 降级规则模块
RT(平均响应时间 ) 当 1s 内持续进⼊ >=5 个请求,平均响应时间超过阈值(RT以 ms 为单位),那么在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调⽤都会⾃动地熔断(抛出 DegradeException)。注意Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。 异常⽐例 当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的⽐值超过阈值之后,资源进⼊降级状态,即在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调⽤都会⾃动地返回。异常⽐率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。 异常数 当资源近 1 分钟的异常数⽬超过阈值之后会进⾏熔断。注意由于统计时间窗⼝是分钟级别的,若timeWindow ⼩于 60s,则结束熔断状态后仍可能再进⼊熔断状态。
3、Sentinel ⾃定义兜底逻辑
注意:兜底⽅法非本类需要为static静态⽅法,同时指定资源类,可以为当前类的非静态方法,blockHandler保持返回值与参数一致的同时在添加com.alibaba.csp.sentinel.slots.block.BlockException类型的参数,用于接收sentinel异常,fallback方法为java异常返回方法
@SentinelResource注解类似于Hystrix中的@HystrixCommand注解
@SentinelResource 注解常用属性
value:定义资源名唯一或共享(针对接口级别线程池)
blockHandlerClass:指定Sentinel规则异常兜底逻辑所在class类
blockHandler:指定Sentinel规则异常兜底逻辑具体哪个⽅法
fallbackClass:指定Java运⾏时异常兜底逻辑所在class类
fallback:指定Java运⾏时异常兜底逻辑具体哪个⽅法
https://www.jianshu.com/p/d36f55ef2688?utm_campaign=haruki