Sentine
1.背景
Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。这里大家可能会问:Sentinel 和之前常用的熔断降级库 Netflix Hystrix 有什么异同呢?Sentinel官网有一个对比和Hystrix迁移到sentinel的文章,这里摘抄一个总结的表格,具体的对比可以点此 链接查看。
功能对比
从对比的表格可以明显看到,Sentinel比Hystrix在功能性上还要强大一些。
2.功能
Sentinel 功能主要体现在三个方面
2.1 流量控制
对于系统来说,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
控制角度如下:
资源的调用关系,例如资源的调用链路,资源和资源之间的关系
运行指标,例如 QPS、线程池、系统负载等
控制的效果,例如直接限流、冷启动、排队等
2.2 熔断降级
当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。手段如下
通过并发线程数进行限制 :当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
通过响应时间对资源进行降级:当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
2.3 系统负载保护
Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果 这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。
针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
3.使用
3.1 依赖
这里我使用sentinel 是基于gradle配置,兼容spring clould alibaba,所以添加如下依赖
compile'com.alibaba.cloud:spring-cloud-starter-alibaba-sentinel:2.1.0.RELEASE'
compile group: 'com.alibaba.csp', name: 'sentinel-transport-simple-http', version: '1.6.3'
3.2 注解
Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException等,当然也支持使用aop的方式,这里演示使用aop的方式,添加如下配置类
@Configurationpublic classSentinelAspectConfiguration {
@BeanpublicSentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();
}
}
@SentinelResource用于定义资源,并提供可选的异常处理和 fallback 配置项 。该注解包含以下属性
value:资源名称,必需项(不能为空)
entryType:entry 类型,可选项EntryType.OUT/EntryType.IN(默认为 EntryType.OUT),对应入口控制/出口控制
blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称。
fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理
返回值类型必须与原函数返回值类型一致
fllback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class