【博学谷学习记录】超强总结,用心分享 。Sentinel相关知识。
一、Sentinel
1.引入。雪崩问题
雪崩问题就是微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。
解决雪崩问题
1.超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待(服务故障解决方法)
2.船壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离(资源损耗大)
3.熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
4.流量控制:限制业务访问的QPS。避免服务因流量的突增而故障(避免因瞬间高并发流量而导致服务故障的解决方法)
2.认识Sentinel
Sentinel是阿里巴巴开源的一款微服务流量控制组件
Sentinel具有一下特征:
1.丰富的应用场景:Sentinel承接了阿里巴巴近十年的双十一促流量的核心场景,如秒杀,消息削峰填谷、集群流浪控制、实时熔断下游不可用应用等。、
2.完备的实时监控:Sentinel同时提供实时的监控功能,可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
3.广泛的开源生态:Sentinel提供开箱即用的与其他开源框架的整合模块。
4.完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。可以用过实现扩展接口来快速地定制逻辑。
启动方式
<!-- 引入sentinel依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
sentinel:
transport:
dashboard: localhost:8080 #sentinel控制台地址
3.登录sentinel控制台
4,访问微服务的任意端点,触发sentinel监控
4.流控模式
在添加限流规则时,点击高级选项,可以选择三种流控模式
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
5.流控模式-关联
满足下面条件可以使用关联模式:
1.两个有竞争关系的资源
2.一个优先级高,一个优先级低
流控谁就限流谁,关联的资源不被限流。
6.流控模式-链路
使用场景:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流
7.流控效果
1.快速失败:QPS超过阈值时,拒绝新的请求
2.warm up:QPS超过阈值时,拒绝新的请求,QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机
3.排队等待:请求会进入队列,按照阈值允许的时间间隔一次执行请求,如果请求预期等待时长大于超时时间,直接拒绝。
8.
热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值
注意:热点参数限流对默认的SpringMVC资源无效,因此要添加SentinelResource()才可以。
9.
feign: sentinel: enabled: true #开启feign对sentinel的支持
@Slf4j public class UserClientFallbackFactory implements FallbackFactory<UserClient> { @Override public UserClient create(Throwable throwable) { //创建UserClient接口实现类,实现其中的方法,编写失败降级的处理逻辑 return new UserClient() { @Override public User findById(Long id) { //记录异常信息 log.error("查询用户异常",throwable); //根据业务需求返回默认的数据,这里是控用户 return new User(); } }; } }
@Bean public UserClientFallbackFactory userClientFallbackFactory(){ return new UserClientFallbackFactory(); }
@FeignClient(value = "userservice",fallbackFactory = UserClientFallbackFactory.class)
10、线程隔离
两种手段:
1.(Sentinel默认的手段)信号量隔离: 用户请求会直接到FeignClient中,然后直接调用对应的服务,但是会有一个信号量,通过计数器来限制一个访问的次数。
2.线程池隔离: 用户发起请求,需要服务A,B提供服务,服务A,B会自动创建对应的线程池,用户请求自动选择线程池的线程到Feign客户端,然后访问对应的服务,这样两个服务就会被隔离。
特点:
基于计数器模式,简单、开销小
线程池隔离的特点?
支持异步调用,每一次请求都会创建线程池,支持主动超时,因为是独立的线程。适合用于低扇出的服务(就是服务支持少的服务)
基于线程池模式,有额外开销,但隔离控制更强
11.熔断降级
原理是:如果该服务是成功状态,就会关闭断路器,如果达到失败阈值,就会开启熔断,快速失败就是拦截访问该服务的请求。当熔断时间结束,就会到half-open状态,尝试放行一次请求,如果成功就会关闭断路器,失败就会打开断路器。
12.熔断策略
断路器熔断有三种:
慢调用:业务的响应市场(RT) 大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则会触发熔断。
异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断
13.授权规则
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式
设置授权规则
1.Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的
package cn.itcast.order.sentinel; import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; @Component public class HeaderOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request ) { //1.获取请求头 String origin = request.getHeader("origin"); //2,非空判断 if(StringUtils.isEmpty(origin)){ origin="blank"; } return origin; } }
2.需要在gateway服务中,利用网关的过滤器添加名为gateway的origin的头:
default-filters: - AddRequestHeader=Truth,Itcast is freaking awesome! - AddRequestHeader=origin,gateway
14、自定义异常
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口
总结:
获取请求来源的接口是什么?
RequestOriginParse
处理BlockException的接口是什么?
BlockExceptionHandler
15、Sentinel的三种配置管理模式
1。原始模式:保存在内存
2.pull模式:保存在本地文件或数据库,定时去读取(时效性差)
3.push模式:保存在nacos,监听变更实时更新(推荐)

浙公网安备 33010602011771号