文章目录
一、Sentinel简介
Sentinel是阿里巴巴开源的一款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html
1. 使用背景
在微服务系统中存在雪崩问题。为了解决雪崩问题出现了微服务保护组件-Sentinel。
什么是雪崩问题?:
由于微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。
雪崩问题的形成演示:
- 在某个微服务系统中,服务A依赖服务D。
- 在某一时刻服务D故障,导致服务A调用服务D的请求无法及时返回。
- 随着时间的积累,服务A的tomcat连接数被故障的请求占满,最终导致服务A也不可用。
- 以此类推,导致微服务系统中此链路的所有服务都不可用,形成雪崩。
2. 解决方案
为了解决雪崩问题,有四种方案:
- 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待。
- 舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
- 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
- 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
3. 服务保护技术对比
Sentinel和Hystrix都是微服务保护组件,实现了上面的方案。
下面是这两种技术的对比 :
4. 安装 Sentinel 控制台
5. 微服务整合Sentinel
- 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 修改配置文件
sentinel:
transport:
dashboard: localhost:8080
访问微服务的任意接口,触发Sentinel监控
我这里有个/test的接口
在浏览器调用后,再查看sentinel控制台,就可以看到
二、流控规则
在添加流控规则前,需要明白簇点链路、资源在Sentinel指代的什么?
簇点链路就是项目内的调用链路,链路中被监控的每个接口就是一个资源。后续我们就是对这些资源添加流控规则。
默认情况下Sentinel会监控SpringMVC的每一个端点,也就是Controller中的接口都会被Sentinel当做资源。
除了Controller下的,也可以使用注解@SentinelResource("资源名")
将方法标记为资源,让sentinel来监控。
例如 : 我的项目中有这样一个调用链路,有两个资源 /test
和 service方法
在sentinel控制台中,以树状视图展示为:
2. 流控规则
现在我要给/test
接口添加流控规则,
可以点击进入侧边栏中的簇点链路,找到你要添加流控规则的接口,通过后面的流控按钮添加流控规则。
操作非常简单,包括后面要讲的熔断规则、热点规则、授权规则都是如此添加,我就不啰嗦了。
下面先看看流控规则都要配置哪些东西?
资源名: 要给哪个接口添加流控规则
针对来源: 值有三种,default、other
阈值类型:
单机阈值:
是否集群:
流控模式: 直接、关联、链路
流控效果: 快速失败、Warm Up、排队等待
流控有三种模式:直接、关联、链路。
2.1 直接模式
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式。
例如:下面给’‘/test’'资源添加流控规则,每秒最多只能请求5次,超过的部分直接失败。
2.2 关联模式
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。
例如:shenma-admin服务中有两个资源 /update
/query
,这里认为/update
操作比/query
操作更重要,要优先保证/update
。因此给/query
设置关联模式的流控,当/update
请求数达到阈值后要限制/query
的操作,将资源优先给/update
请求。
注:这两个请求必须在一个服务中。sentinel是无法跨服务进行流控的,其中针对来源的配置不是写成另一个服务名就会生效的,针对来源配置的说明。
2.3 链路模式
链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流。
例如: 这里访问service的方法就有两条链路。
注意:需要在配置文件中增加web-context-unify: false
,关闭将SpringMVC作为统一的根节点,
这样不同的链路才区分开。
查看控制台:
这里两条链路中都有"service方法"
资源,给其中的任意一个添加即可,因为它们是同一个。
树状视图为了显示出调用关系,展示成两个;也可以切换为列表试图就可以看到service方法
只有一个
添加流控规则:
3. 流控效果
流控效果是指请求达到流控阈值时应该采取的措施,包括三种:快速失败、Warm Up、排队等待
3.1 快速失败
达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
3.2 Warm Up
Warm Up也叫预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
预热模式是服务冷启动的一种方案。请求阈值初始值是 threshold / coldFactor(最大阈值/冷启动因子),持续指定时长后,逐渐提高到threshold值。而coldFactor的默认值是3.
例如: 下面的流控配置,初始阈值是10/3 就是3,10秒预热时长后阈值达到最大10。
3.3 排队等待
当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
3. 热点参数限流
之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。
有这样一个接口
添加热点规则
注意事项
- 资源名要避免重复,sentinel没有做限制,重复了程序也不会报错。