Sentinel学习
sentinel是阿里巴巴研发的一款微服务组件,主要为用户提供服务保护,包括限流熔断等措施
(一)主要功能
流量控制(限流):比如限制1s内有多少请求能到达服务器,防止大量请求打崩服务器
熔断降级:当下级服务响应慢或者不可用时,熔断服务,快速失败,保护上游服务
(二)使用方法
去Releases · alibaba/Sentinel · GitHub下载对应的jar包
在jar包所在的目录cmd运行命令
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.8.jar
然后通过8080端口即可访问sentinel的控制台 ,账号密码均为sentinel
然后去项目中添加依赖
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>x.y.z</version>
</dependency>
同时修改服务的application.yml
spring:cloud:sentinel:transport:dashboard: localhost:8090 # 指定 Sentinel Dashboard 地址port: 8719 # 客户端监控端口,用于与 Sentinel Dashboard 通信
dashboard的地址必须和sentinel控制台的地址一致,连接控制台
port端口号是服务与sentinel的通信端口,是独立的,不能和运行服务的端口一样
在项目的代码中使用:
@SentinelResource注解
常用参数
value:指定资源名,在控制台中可看
blockHandler:触发限流规则时会调用哪个方法,一般会写一个兜底方法,方法参数要和设置了限流的方法一致,但可以加一个BlockException
fallback:触发异常时调用哪个兜底方法,和上面的很像,但是上面是用于触发限流后用的,这个是用于触发异常用的,方法参数可以加一个Throwable
(三)限流规则
限流主要是阻止大量请求同时打到服务器上
资源名 与@SentinelResource的value对应
针对来源 就是调用这个controller发送请求的来源,你要限流哪些来源的,默认全部
阈值类型:QPS每秒通过多少个(多少个就是单机阈值的数量),并发线程数通常配合线程池使用
是否集群:多服务器的情况下会用,也要设置一个阈值
比如,设置全局阈值12,比如进来100个请求,有三个服务器,它们总共只能处理12个请求
如果设置的单机均摊12,进来100个请求,就会每个服务器都能处理12个请求,总共36
继续看:
流控模式分为3种:直接、关联和链路
直接没什么好说的,就是对单一资源进行限流
关联就是a资源关联b资源,当b资源访问量大触发限流时,a也会被限流
链路就是当同一个方法会被多种渠道调用时,只对部分渠道进行限流
流控效果分三种:快速失败、warm up和排队等待
快速失败就是触发限流后,后面的请求全部丢弃,报错
warm up就是冷启动,需要设置启动时间n,前n秒内处理量大概为阈值的1/3,后面再逐步提高处理量达到阈值
排队等待就是触发限流后,后面的请求不会丢弃,而是排队等待前面的执行完后它再执行,需要设置排队时间,超过这个时间请求还未被处理的话,丢弃
ps:只有快速失败支持关联和链路,其它两种不支持
(四)熔断规则
当a服务调用b服务时,b服务可能会卡住执行很久,也可能会异常,这时a要及时熔断,切断与b的联系,保护自己
又有一个问题?怎么判断服务有问题去熔断呢?熔断之后怎么恢复连接呢?
答:判断熔断主要根据熔断策略,符合条件即熔断。恢复连接的话,当a、b服务间断开的时长达到熔断时长后,服务会切换到半开状态,a会向b发送一个或几个请求,如果这些请求正常执行,那就取消熔断恢复运行,如果这些请求有问题(满足熔断条件),就会继续保持熔断
熔断策略有三种:慢调用、异常比例和异常数
选择慢调用
最大RT:最大的响应时间,超过这个时间判定为慢调用
比例阈值:当n%的调用是慢调用时,触发熔断
熔断时长:熔断多久
最小请求数:要触发熔断起码要有多少个请求,低于这个数值不会熔断
统计时长:统计时长
选择异常比例
其他不变,没用最大RT,比例阈值改为当n%的调用是异常时触发熔断
选择异常数
其他不变,比例阈值改为异常数
(五)热点规则
就是可以对方法的具体参数进行限流
当用户调用这个方法,携带了3个参数,你可以设置热点来对具体的第几个参数进行限流
(六)总结
sentinel是服务保护的重要组件,起到限流、熔断等作用
首先下载sentinel的jar包,用命令运行,用浏览器打开sentinel的控制台
然后去项目中添加对应依赖,修改代码,添加@SentinelResource,并写对应的兜底方法
@RestController
public class UserController {@GetMapping("/user")@SentinelResource(value = "getUser", // 资源名,用于控制台设置规则fallback = "fallbackMethod", // 业务异常兜底方法blockHandler = "blockHandlerMethod" // 流控、熔断时的处理方法)public String getUser(@RequestParam(required = false) String name) {if ("error".equals(name)) {throw new RuntimeException("模拟业务异常");}return "用户:" + name;}// fallback 方法:处理业务异常(如运行时异常)public String fallbackMethod(String name, Throwable e) {return "fallback:业务处理异常,返回兜底用户";}// blockHandler 方法:处理被 Sentinel 限流、降级、熔断的情况public String blockHandlerMethod(String name, BlockException ex) {return "blockHandler:服务被限流或熔断,返回默认用户";}
}
其实代码部分很少,主要用控制台对限流规则、熔断规则进行配置即可