Sentinel基础
# Sentinel基础
# 1.雪崩
雪崩问题:微服务链路中某个服务故障,引起整个链路中的所有微服务都不可用
- 设定超时时间,超过一定时间没有响应则返回错误信息。但是不能从根本上解决问题,如果在请求等待的时间内发送过来更多的客户请求,则当前服务A的资源还是会被耗尽。
- 舱壁模式:限定每个业务能使用的线程数量。
- 熔断降级:由断路器统计当前服务的业务执行异常比例,超出与之则会熔断改业务。拦截访问该业务的一切请求。
- 流量控制:限制业务访问的QPS。是一种预防的措施。
微服务整合sentinel控制台,在响应微服务引入maven依赖,yaml文件导入sentinel坐标。
# 2.限流规则
每一个端点都是调用链路的一个资源,每个资源可以进行①流控②降级③热点④授权
# 流控模式
- 直接:当前资源触发阈值,则对当前资源进行限流
- 关联:统计和当前资源A相关联的另一个资源B的访问量,触发阈值则对当前资源A限流。(当前是读操作,关联写操作,当写操作QPS高时,对读操作进行限流)
- 链路:统计从指定该链路访问到本资源的请求,触发阈值则对指定链路限流。orderController中两个方法都会调用Service中的一个查询方法,可以指定限流其中某一个方法调用service的QPS。
- sentinel默认只会标记controller方法作为资源,要标记service中的方法为资源,需要使用@SentinelResource注解
- sentinel默认会将同一个controller方法做context整合(这些不同方法都属于同一个controller根),需要修改yaml文件把web-context-unify设置为false。
# 流控效果
请求达到阈值采取的措施。
- 快速失效:新的请求立刻被拒绝并抛出FlowException异常
- warm up:超出阈值的请求也会立刻拒绝。但是请求阈值初始值为阈值/冷启动因子,然后在预热时间内持续提高到阈值大小。目的是为了应对微服务冷启动,服务器启动减少请求数量。
- 排队等待:所有的请求进入一个队列中,然后按照阈值允许的时间间隔执行,如果请求预期的等待时间(这里是指预先排队计算好的)超出最大时长则会被拒绝。比如QPS为10,超时时长为5s,所有请求都会进入排队队列按照每100ms执行完毕跳出队列的速度进行,队列等待时长超过5s的请求才会被拒绝。好处在于每次可以流量削峰,控制每秒QPS的同时又尽可能的响应请求。
# 热点参数限流
前面的限流资源针对的是同一个controller的方法,而热点参数限流会统计请求参数值相同的请求,相当于对数据库的某条确切数据的访问。
仅有@SentinelResource注解的方法生效,在sentinel控制台点击热点规则设置。"参数索引"代表方法args参数的下标,第一个参数默认从0开始。
场景:给热点数据设置较大的限流QPS
# 3.降级隔离
# Feign整合Sentinel
在order微服务的yaml文件Feign客户端位置添加sentinel.enabled,设置为true。
在FeignClient接口编写FallbackFactory类,并在config类中注册为Bean
将FallbackFactory配置到FeignClient
对Feign客户端资源进行限流,超出阈值时不会拒绝会执行降级逻辑。
# 4.线程隔离
# 线程池隔离
给微服务每个业务设置一个线程池,当该业务请求过多导致当前线程池内的所有线程都被用尽,那么该业务后续的请求就会被拒绝,此时不会影响到整个微服务资源的使用,每个业务对应的线程池都是独立的。
优缺点:支持不同服务之间的异步调用,但是线程上下文切换额外开销大。适用于低扇出场景(依赖的服务越多扇出越高)

# 信号量隔离
通过一个计数器来控制用户的请求数,每一个请求过来计数器就减一,处理完业务后归还计数器。
优缺点:轻量级,适用于高扇出。
# 5.熔断降级
由断路器统计服务调用的异常比例和慢请求比例,超出阈值则会熔断该服务,熔断时间结束后会进入Half-Open状态,然后尝试放行一次请求,如果通过则解除熔断恢复正常状态。

熔断策略:
- 慢调用:如果业务响应时长大于指定时长的请求则认定为慢调用。降级规则:响应时长超过500ms的调用是慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例超过0.5,则触发熔断,熔断时长为5s,5s过后进入半开状态放行一次请求做测试。

- 异常比例&异常数:抛出异常的业务请求数量超过指定异常数。
# 6.授权规则
用于验证请求是从哪里过来的,只允许从gateway网关过来的请求访问。可以通过和网关约定校验规则,比如网关通过过滤器default-filters向请求头添加"origin"字段的键值对,然后sentinel通过RequestOriginParser接口获取请求来源信息进行判断。
@Component
public class HeaderOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
String origin = httpServletRequest.getHeader("origin");
if (StringUtils.isEmpty(origin)) {
origin = "blank";
}
return origin;
}
}
2
3
4
5
6
7
8
9
10
11
在sentinel中资源点击授权->流控应用->白名单
- 自定义异常接口,默认情况下发生限流、降级、授权拦截时都会抛出异常到调用方,实现BlockExceptionHandle接口可以自定义异常。
# 7.规则持久化
原始模式:保存在内存,重启服务会丢失
pull模式:保存在本体文件或者数据库,定时去读取。
push模式:控制台会将配置规则推送到远程配置中心Nacos,Sentinel客户端会监听Nacos,获取配置变更的推送消息。