一、什么是Sentinel
Sentinel,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳定性的解决方案。随着Hystrix进入了维护期,不再提供新功能,Sentinel是一个不错的替代方案。通常情况下,Hystrix采用线程池对服务的调用进行隔离,Sentinel采用了用户线程对接口进行隔离,二者相比,Hystrix是服务级别的隔离,Sentinel提供了接口级别的隔离,Sentinel隔离级别更加精细,另外Sentinel直接使用用户线程提供限制,相比Hystrix的线程池隔离,减少了线程切换的开销。另外Sentinel的DashBoard提供了在线更改限流规则的配置,也更加的优化。
二、开源生态
Sentinel和Hystrix
功能 | Sentinel | Hystrix |
---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于RxJava) |
动态规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持预热模式、匀速器模式、预热排队模式 | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 |
三、Sentinel特性
1、丰富的应用场景
Sentinel承接了阿里巴巴近十年双十一大促流量的核心场景,例如秒杀(突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
2、完备的实时监控
Sentinel同时提供实时的监控功能。我们可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总进行情况。
3、广泛的开源生态
Sentinel提供开箱即用的与其它开源框架的整合模块,例如与spring cloud、dubbo、grpc的整合。我们只需要引入响应的依赖并进行简单的配置即可快速的接入Sentinel。
4、完美的SPI扩展点
Sentinel提供简单易用、完善的SPI扩展点。我们可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
四、资源和规则
资源是Sentinel的关键概念。它可以是java应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只是通过Sentinel API定义的代码,就是资源,能够被Sentinel保护起来,大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来表示资源。
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
Sentinel中调用SphU或者SphO的entry方法获取限流资源,不同的是前者获取限流资源失败时会跑BlockException异常,后者返回false,二者的实现都是基于CtSph类完成的。
五、核心概念
1、Resource
resource是Sentinel中最重要的一个概念,Sentine