随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
Sentinel 具有以下特征:
功能 | Sentinel | Hystrix |
---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) |
动态规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持预热模式、匀速器模式、预热排队模式(流量规则处可配置) | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 |
安装Sentinel的俩种方式
<dependencies>
<!--sentinel nacos-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.2</version>
</dependency>
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!--spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
server:
port: 8005
spring:
application:
name: sentinel-nacos
cloud:
nacos:
discovery:
server-addr: 192.168.31.100:8848 #这里是我linux地址
sentinel:
transport:
#配置sentinel地址,端口
dashboard: 192.168.31.100:8858 #这里是我linux地址
#客户端IP(sentinel dashboard进行实时监控的主机ip地址)
# 默认端口8719端口假如被占用会自动从8719开始依次+1扫描,直到找到未被占用的端口
port: 8719
client-ip: 172.100.20.220 #这里是我windows地址
# 取消控制台懒加载
eager: true
enabled: true
#暴露自己的端点
management:
endpoints:
web:
exposure:
include: '*'
@RestController
@Slf4j
public class SentinelController {
@GetMapping("/sentinel/test")
public String test(){
log.info("sentinel test");
return "sentinel test ";
}
@GetMapping("/sentinel/test1")
public String test1(){
log.info("sentinel test1");
return "sentinel test1 ";
}
}
@SpringBootApplication
@EnableDiscoveryClient
public class SentinelApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelApplication.class, args);
}
}
sentinel默认是采用懒加载的,需要访问controller的接口,才会显示。
http://127.0.0.1:8005/sentinel/test1
http://127.0.0.1:8005/sentinel/test
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
FlowSlot 会根据预设的规则,结合前面 NodeSelectorSlot、ClusterNodeBuilderSlot、StatisticSlot 统计出来的实时信息进行流量控制。
限流的直接表现是在执行 Entry nodeA = SphU.entry(resourceName) 的时候抛出 FlowException 异常。FlowException 是 BlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑。
同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
resource:资源名,即限流规则的作用对象
count: 限流阈值
grade: 限流阈值类型(QPS 或并发线程数)
limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
strategy: 调用关系限流策略
controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
在完成了上面的两节之后,我们在sentinel-nacos
服务下,点击簇点链路
菜单,可以看到如下界面:
其中/sentinel/test
接口,就是我们上一节中实现并调用过的接口。通过点击流控
按钮,来为该接口设置限流规则,比如:
这里做一个最简单的配置:
综合起来的配置效果就是,该接口的限流策略是每秒最多允许2个请求进入。
点击新增
按钮之后,可以看到如下界面:
其实就是左侧菜单中流控规则
的界面,这里可以看到当前设置的所有限流策略。
验证限流规则
在完成了上面所有内容之后,我们可以尝试一下快速的调用这个接口,看看是否会触发限流控制,
当关联的资源达到阈值时,就限流自己
例:当接口/sentinel/test1
达到qps时会使/sentinel/test
无法访问
postman测试:
在postman测试期间访问a接口:
当postman测试完:
Sentinel的Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。warm up冷启动主要用于启动需要额外开销的场景,例如建立数据库连接等。
默认 coldFactor为3,即请求QPS从 threshold/3开始,经预热时长逐渐升至设定的QPS阈值。
配置:/sentinel/test
接口5秒后qps会达到10,开始qps为3 (10/3)
开始快速访问:
后续快速访问:
匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。
设置含义: a接口每秒1次请求,超过的话就排队等待,等待的超时时间为5毫秒。
Sentinel在1.8.0版本对熔断降级做了大的调整,可以定义任意时长的熔断时间,引入了半开启恢复支持。下面梳理下相关特性。
熔断有三种状态,分别为OPEN、HALF_OPEN、CLOSED
熔断降级支持慢调用比例、异常比例、异常数三种熔断策略。
慢调用:指耗时大于阈值RT的请求称为慢调用,阈值RT由用户设置
最小请求数:允许通过的最小请求数量,在最小请求数量内不发生熔断,由用户设置
慢调用比例:当资源的响应时间超过最大RT(以ms为单位,最大RT即最大响应时间)之后,资源进入准降级状态。如果接下来1s内持续进入5个请求(最小请求数),它们的RT都持续超过这个阈值,那么在接下来的熔断时长之内,就会对这个方法进行服务降级。其中的“比例阈值”我设置发现无效,下次编辑会重置成1
注意Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置
异常比例:当资源的每秒请求数大于等于最小请求数,并且异常总数占通过量的比例超过比例阈值时,资源进入降级状态。
异常数:当资源近1分钟的异常数目超过阈值(异常数)之后会进行服务降级。注意由于统计时间窗口是分钟级别的,若熔断时长小于60s,则结束熔断状态后仍可能再次进入熔断状态。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43296313/article/details/121011283
内容来源于网络,如有侵权,请联系作者删除!