Sentinel

2022-08-24 16:56:11 浏览数 (1)

官网: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

代码语言:javascript复制
# 自行修改即可
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar XXXX.jar复制

访问 127.0.0.1:8080 输入账号密码即可

微服务整合Sentinel

参考URL:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

项目引入Sentinel依赖(如果你准备网关接入,请引用其他网关-Sentinel的依赖)

代码语言:javascript复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>复制

项目配置文件添加配置信息

代码语言:javascript复制
# 配置控制台地址,必须访问过我们当前服务才能触发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会抛出异常,但排队等待会将请求放入一个队列中,针对阈值允许的时间间隔一次执行。后来的请求必须等前面完成,如果请求预期的时间超过最大时长(设置排队等待时,要求输入一个超时时间),则会被拒绝

模拟限流

Sentinel应用实际开发解决方案

登陆服务需要查询账号是否存在,注册服务也要查询账号是否存在,那么查询账号是否存在的方法我们就无法进行流量控制,因为请求入口都是从Controller进入的。但我们要限流的是方法,我们就需要修改一些配置以实现对方法对控制

Sentinel默认会标记Controller中的方法作context上下文整合,就会导致链路模式失效,我们可以在配置文件关闭配置即可,同时针对我们的Service的方法加入注解

代码语言:javascript复制
# 关闭context整合spring.cloud.sentinel.web-context-unify=false复制

方法加入注解

代码语言:javascript复制
    @SentinelResource("checkAccountExist")
    public String checkAccountExist() {
        return "Server执行中...";
    }复制

我们自己触发一下相关Login、Register接口,我们就可以在Sentinel看到此配置了

这样就可以实现对Login、Register调用Checking方法进行限流!

热点规则

场景:我们有一个高并发的秒杀功能,我们对不同额度优惠券的领取有不同的限制,比如3元优惠券,我们可以放行到每秒10个。优惠券10元的,每秒1个。我们优惠券种类通过id来区分。我们可以针对领取优惠券接口进行限流。

注意热点规则对默认SpringMVC资源无效,我们通过加入注解实现@SentinelResource

代码语言:javascript复制
    @SentinelResource("hot")
    @RequestMapping("/register")
    public String hello(long id) { 
        System.out.println("Server执行中...");
        return "Server执行中...";
    }复制

添加热点规则

从找到DashBoard,热点规则,点击 新增热点规则。(如果你从簇点链路- 热点创建的,创建完成后,点击热点规则才能设定参数例外项)

隔离与降级

FeignClient整合Sentinel

配置文件开启

代码语言:javascript复制
feign.sentinel.enabled=true复制

编写Feign因调用失败的降级逻辑

  • FallbackClass 无法对远程调用的异常作处理
  • FallbackFactory 可以对远程调用的异常作处理,我们使用这个

使用需要注入Bean

然后在@FeignClient注解内部指定fallbackFactory

线程隔离

熔断降级

特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源

0 人点赞