优势: 1.单独一个组件,可以独立出来; 2.直接界面化的细粒度统一配置; 应用场景:秒杀,消息巅峰填谷,集群流量控制,实时熔断下游不可用应用;
下载安装: 下载地址:https://github.com/alibaba/Sentinel/releases 下载完成 java -jar命令即可 前提:java8环境ok,8080端口不能被占用 界面访问:http://localhost:8080 账户密码:均为sentinel 能解决的问题: 服务雪崩 服务降级 服务熔断 服务限流
Module pom:nacos-diacovery
<dependency> <groupId>com.alibabacloud<groupId> <artifactId>spring-cloud-starter-alibaba-sentinel<artifactId> <dependency> <dependency> <groupId>com.alibaba.csp<groupId> <artifactId>spring-datasource-nacos<artifactId> <dependency> <dependency> <groupId>org.springframework.cloud<groupId> <artifactId>spring-cloud-starter-alibaba-openfeign<artifactId> <dependency>yml:
server: port:8401 spring: application: name:cloudalibaba-sentinel-service cloud: nacos: discovery: server-addr:localhost:8348#nacos注册中心地址 sentinel: transport: dashboard:localhost:8080#配置Sentinel dashboard地址 #默认8719,加入 port:8719 management: endpoint: web: exposure: include: '*'sentinel采用懒加载模式:访问一次即可 界面配置流控规则: @1资源名限制也就是路径 @Qps限流 流控模式: 直接:qpi达到限流条件,直接限流 关联:当关联的资源达到阈值时,就限流自己 链路:只记录指定链路上的流量 流量效果: 快速失败,抛异常 warm Up:阈值 排队等待:匀速排队
Sentinel降级简介 Sentinel界面有 包含RT,异常比例异常数三种策略; RT(妙级):平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级窗口期后关闭断路器 RT最大4800(更大的需要通过-Dcsp.sentinel.statistic.max=xxxx才能生效) 异常比例 (秒级):QPS>=5且异常比例超过阈值,触发降级,时间窗口期结束后结束后关闭降级 异常数 (分钟级):异常数超过阈值时,触发降级,时间窗口期结束后,关闭降级;
Sentinel热点Key限流 仅支持QPS模式 界面配置 : java代码:
@GetMapping("/testHotKey") @**SentinelResource**(value = "testHotKey",blockHandler = "**deal_testHotKey**") public String testHotKey(@RequestParam(value = "p1",required = false)String p1,@RequestParam(value = "p2",required = false)String p2) { return"aaa" } public String **deal_testHotKey** (String p1,String p2,BlockException ex) { return "bbbb" }参数例外项限流:当p1=5时最大200 其他的超过5就限流
系统自适应限流 界面点击系统规则------>新增 系统最外层限流
@SentinelResource
客户自定义限流处理 1.创建CustomerBlockHandler类用于处理限流逻辑
public class CustomerBlockHandler { public static CommonResult handleException(BlockException exception) { return new CommonResult(555,"客户自定义,global handlerException---1") } public static CommonResult handleException2(BlockException exception) { return new CommonResult(555,"客户自定义,global handlerException---2") } }Controller层
@GetMapping("/rateLimit/customerBlockHandler") @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class blockHandler = "handlerException2") public CommonResult customerBlockHandler() { return new CommonResult(200,"按客户自定义") }服务熔断功能 sentinel 整合了ribbon+openFeign+fallback @SentinelResource(value = “fallback”, fallback = “handlerFallback”)
public CommonResult handlerFallback() { return new CommonResult(5555,“兜底异常”) }
若blockHandler和fallback都进行了配置。则被限流而抛出BlockException时只会进入blockHandler逻辑处理 服务熔断exceptionsToIgnore 异常忽略属性 @SentinelResource(value = “fallback”, exceptionsToIgnore = {IllegalArgumentException.class} #假如报该异常,不再有fallback方法兜底,没有降级效果 fallback = “handlerFallback”)
Sentinel 持久化配置 怎么玩: 将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上的sentinel上的流控规则持续有效;
pom:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId> sentinel-datasource-nacos<artifactId> <dependency>yml:
server: port:8401 spring: application: name:cloudalibaba-sentinel-service cloud: nacos: discovery: server-addr:localhost:8848 sentinel: transport: dashbord:localhost:8080 port:8719 datasource: dsl: nacos: server-addr:localhost:8848 dataId:cloudalibaba-sentinel-service groupId:DEFAULT_GROUP data-type:json rule-type:flow management: endpoints: web: exposure: include:'*' feign: sentinel: enabled:truenacos进行配置(多次调用)
配置列表: DataId: cloudalibaba-sentinel-service groupId: DEFAULT_GROUP 配置格式:JSON
[ { "resource" : "/rateLimit/byUrl",#资源名称 "limitApp":"default",#来源应用 "grade":1,#阈值类型,0表示线程数,1表示QPS "count":1,单机阈值 "strategy":0,流控模式,0表示直接,1表示关联,2表示链路 "controlBehavior":0,流控效果,0表示快速失败,1表示warmUp,2表示排队等待 "clusterMode":false,是否集群 } ]