官网:https://github.com/alibaba/Sentinel、https://sentinelguard.io/zh-cn/
流量控制
隔离、降级
授权规则
服务A依赖于服务B、服务B依赖于服务C,如果服务B执行比较缓慢、阻塞,Tomcat资源就被占用了,导致所有依赖于服务B的服务都被牵制!
解决方案:
超时处理:超时就返回错误信息,不会无休止等待
舱壁模式:限定每个业务使用的线程数,避免tomcat资源被消耗,实现线程隔离
熔断降级:由断路器统计业务执行异常比例,如果超过限定值,就会拦截,不允许访问
流量控制:限制业务访问QPS,避免业务因流量突增而故障
上面都是服务保护的解决方案,
我们主要是使用Sentinel,Hystrix
去官网下载Sentinel- dashboard.jar 使用java -jar 即可,默认端口是8080 ,默认账号、密码都是sentienl
# 自行修改即可
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar XXXX.jar复制
访问 127.0.0.1:8080 输入账号密码即可
参考URL:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
项目引入Sentinel依赖(如果你准备网关接入,请引用其他网关-Sentinel的依赖)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>复制
项目配置文件添加配置信息
# 配置控制台地址,必须访问过我们当前服务才能触发sentinel的监控
spring.cloud.sentinel.transport.dashboard=localhost:9090复制
必须要去访问一下我们的任意一个接口才能触发Sentinel监控
以后我们就可以通过Sentinel实现服务的熔断了。
直接:对当前资源进行限流
关联:高级优先级资源出发阈值,对低优先级资源限流
链路:阈值统计时,只统计A资源进入当前资源的请求,对来源A资源进行限流,其他资源访问当前资源就不受到限制
快速失败:达到流控模式的规则,直接失败,抛出异常,拒绝请求。
Warm Up:冷启动(设置warm up时要求设置个预热时长),在项目启动的预热时长内,最大qps逐步增加。项目初始时最高qps=流控模式设定最大的qps/3,然后在预热时间内,逐步提高最大qps,直到最大设定的qps。避免了项目刚启动来了大量并发导致服务宕机。如果达到当时的最大qps也是抛出异常,拒绝请求。
排队等待:超过qps,快速失败与warm ip会抛出异常,但排队等待会将请求放入一个队列中,针对阈值允许的时间间隔一次执行。后来的请求必须等前面完成,如果请求预期的时间超过最大时长(设置排队等待时,要求输入一个超时时间),则会被拒绝
登陆服务需要查询账号是否存在,注册服务也要查询账号是否存在,那么查询账号是否存在的方法我们就无法进行流量控制,因为请求入口都是从Controller进入的。但我们要限流的是方法,我们就需要修改一些配置以实现对方法对控制
Sentinel默认会标记Controller中的方法作context上下文整合,就会导致链路模式失效,我们可以在配置文件关闭配置即可,同时针对我们的Service的方法加入注解
# 关闭context整合spring.cloud.sentinel.web-context-unify=false复制
方法加入注解
@SentinelResource("checkAccountExist")
public String checkAccountExist() {
return "Server执行中...";
}复制
我们自己触发一下相关Login、Register接口,我们就可以在Sentinel看到此配置了
这样就可以实现对Login、Register调用Checking方法进行限流!
场景:我们有一个高并发的秒杀功能,我们对不同额度优惠券的领取有不同的限制,比如3元优惠券,我们可以放行到每秒10个。优惠券10元的,每秒1个。我们优惠券种类通过id来区分。我们可以针对领取优惠券接口进行限流。
注意热点规则对默认SpringMVC资源无效,我们通过加入注解实现@SentinelResource
@SentinelResource("hot")
@RequestMapping("/register")
public String hello(long id) {
System.out.println("Server执行中...");
return "Server执行中...";
}复制
添加热点规则
从找到DashBoard,热点规则,点击 新增热点规则。(如果你从簇点链路- 热点创建的,创建完成后,点击热点规则才能设定参数例外项)
FeignClient整合Sentinel
配置文件开启
feign.sentinel.enabled=true复制
编写Feign因调用失败的降级逻辑
使用需要注入Bean
然后在@FeignClient注解内部指定fallbackFactory
线程隔离
熔断降级
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!