1)隔离方案
它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相互独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不涉及其他模块,不影响整体的系统服务。常见的隔离方式有:线程隔离 和信号量隔离:
2)超时方案
在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间下游服务还没响应,那么就断开连接,释放掉线程。
3)限流方案
限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到需要限制的阈值,就需要限制流量并采用少量措施完成限制流量的目的
4)熔断方案
在互联网系统中,当下游服务因访问压力过大而相应变慢或失败的时候,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
其中熔断有分为三种状态:
熔断关闭状态(Closed)
服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
熔断开启状态(Open)
后续对该服务接口的调用不再经过网络,直接执行本地的 fallback 方法
半熔断状态(Half-Open)
尝试恢复服务调用,允许有限的流量调用该服务,并监控成功率。如果成功率达到预期,则说明服务已经恢复,进入熔断关闭状态;如果成功率依然很低,则重新进入熔断关闭状态
5)降级方案
服务降级一般是指在服务器压力剧增的时候,根据实际业务使用情况以及流量,对一些服务和页面有策略的不处理或者用一种简单的方式进行处理,从而释放服务器资源的资源以保证核心业务的正常高效运行。
1)Hystrix
Hystrix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提升系统的可用性和容错性
2)Resilience4J
Resilience4J是一款非常轻量,简单,并且文档非常清晰,丰富的熔断工具,这是 Hystrix 官方推荐的替代品。它支持 SpringBoot 1.x/2.x 版本,而且监控也支持和 prometheus 等多款主流产品进行整合
3)Sentinel
Sentinel 是阿里开源的一款断路器的实现,在阿里巴巴内部也已经大规模采用,可以说是非常稳定
功能 | Sentinel | Hystrix | resilience4j |
---|---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 | 信号量隔离 |
熔断降级策略 | 基于响应时间,异常比率,异常数 | 基于异常比率 | 基于异常比率,响应时间 |
实时统计实现 | 时间滑动窗口(LeapArray) | 时间滑动窗口(基于Rxjava) | Ring Bit Buffer |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 多个扩展点 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | Rate LImiter |
流量整形 | 支持预热模式,匀速器模式,预热排队模式 | 不支持 | 简单的 Rate Limiter模式 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 | 提供即用的控制台,可配置规则,查看秒级监控,机器发现等 | 简单的监控查看 | 不提供控制台,可对接其他监控系统 |
sentinel官网地址
1)什么是Sentinel
Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于 服务容错 的综合性解决方案。它以流量为切入点,从 流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
2)特性
丰富的应用场景:Sentinel 承接了阿里巴巴近10年的双十一大促的流量的核心场景。在秒杀、消息削峰填谷,集群流量控制、实时熔断下游不可用应用等场景游刃有余
完备的实时监控: Sentinel 提供了实时的监控功能。通过控制台可以看到接入应用的单台机器的数据,甚至500台以下规模的集群的汇总情况
广泛的开源生态: Sentinel 提供开箱即用的与其他开源框架整合模块,只需要引入相关的依赖进行简单的配置即可快速接入
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展接口。可以通过扩展接口来快速定制逻辑。例如定制规则管理,适配动态数据源等
3)组成部分
核心库(Java客户端):不依赖任何框架/库,能够运行于所有的Java运行环境,同时对 Dubbo和SpringCloud 有很好的支持
控制台(Dashboard):基于SpringBoot开发, 打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
重要属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,资源名是限流规则的作用对象 | |
count | 限流阈值 | |
grade | 限流阈值类型,QPS 或线程数模式 | QPS 模式 |
limitApp | 流控针对的调用来源 | default,代表不区分调用来源 |
strategy | 调用关系限流策略:直接、链路、关联 | 根据资源本身(直接) |
controlBehavior | 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 | 直接拒绝 |
其中 流控模式 分为 三种:
1、直接(默认):接口达到限流条件时,开启限流
2、关联:当关联的资源达到限流条件是,开启限流(适合做应用让步)
3、链路: 当从某个接口过来的资源达到限流条件时,开启限流
流控效果有如下三种:
1、快速失败: 该方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝。
2、Warm Up: 预热模式,该效果是随着设置的预热时长慢慢的增加限流阈值,直到设置的阈值。
3、排队等待: 匀速排队访问接口。
Sentinel 提供以下几种熔断策略:
1、慢调用比例:
当资源的平均相应时间超过阈值(单位 ms)之后,资源进入准降级的状态。如果接下来1s内持续进入5个请求,它们的RT都持续超过这个阈值,那么在接下来的时间窗口(单位 s)之内,就会对这个方法进行降级。
2、异常比例:
当资源的每秒异常总数/占通过量的比率超过阈值之后,资源就会进入降低状态,即在接下的时间窗口(单位 s)之内,对这个方法的调用都会自动的返回。异常比率的赋值范围为 [0.0, 1.0]
3、异常数:
当资源近1分钟的异常数目超过阈值之后就会直接进行降级。但是这里需要注意的是,由于统计时间窗口是分钟级别的,若时间窗口小于60s,则结束熔断状态后仍可能再进入熔断状态。
熔断包含一下重要属性:
Field | 说明 | 默认值 |
---|---|---|
resource | 资源名,即规则的作用对象 | |
grad | e 熔断策略,支持慢调用比例/异常比例/异常数策略 | 慢调用比例 |
coun | t 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 | |
timeWindow | 熔断时长,单位为 s | |
minRequestAmount | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) | 5 |
statIntervalMs | 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) | 00 |
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
下图表示:对索引为0的参数,QPS大于1进行限流,限流阈值为1,若参数值为123则限流阈值为5。
热点规则属性如下所示:
属性 | 说明 | 默认值 |
---|---|---|
resource | 资源名,必填 | |
count | 限流阈值,必填 | |
grade 限流模式 | QPS 模式 | |
durationInSec | 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 | 1s |
controlBehavior | 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 | 快速失败 |
maxQueueingTimeMs | 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 | 0ms |
paramIdx | 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置 | |
paramFlowItemList | 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限 | 制。仅支持基本类型和字符串类型 |
clusterMode | 是否是集群参数流控规则 | false |
clusterConfig | 集群流控相关配置 |
黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:
**resource:**资源名,即限流规则的作用对象
**limitApp:**对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
**strategy:**限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式
系统保护规则是从应用级别的入口流量进行控制,从单台机器总体的 Load、RT、线程数、入口QPS、CPU 使用率五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
该注解的作用就是用来定义资源点。当我们定义了资源点之后,就可以通过 Sentinel 控制台来设置限流和降级策略来对资源点进行保护。同时还可以通过该注解来指定出现异常时候的处理策略。
主要属性如下所示:
以nacos为例进行持久化,如下配置文件:
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
enabled: true
server-addr: 192.168.149.139:5555
sentinel:
filter:
enabled: true
transport:
#配置Sentinel dashboard地址
dashboard: 127.0.0.1:8080
#默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
port: 8719
datasource:
ds1:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
dataId: ${spring.application.name}-flow
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow #流控规则
ds2:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
dataId: ${spring.application.name}-degrade
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade #降级规则
ds3:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
dataId: ${spring.application.name}-paramFlow
groupId: DEFAULT_GROUP
data-type: json
rule-type: param-flow #热点参数限流规则
ds4:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
dataId: ${spring.application.name}-system
groupId: DEFAULT_GROUP
data-type: json
rule-type: system #系统规则
ds5:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
dataId: ${spring.application.name}-authority
groupId: DEFAULT_GROUP
data-type: json
rule-type: authority #系统规则
management:
endpoints:
web:
exposure:
include: '*'
feign:
sentinel:
enabled: true