Spring Cloud Alibaba Sentinel(一)简介、docker部署sentinel dashboard、项目配置
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
一、什么是sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
二、Sentinel 具有以下特征:
-
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
-
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
-
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
-
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
Sentinel 的开源生态:
三、sentinel与Hystrix 对比
Sentinel 和 Hystrix 都是基于熔断器模式。都支持基于异常比率来进行熔断,但 Sentinel 更强大,可以基于响应时间、异常比率和异常数来进行熔断降级。
1、隔离设计上对比
Hystrix
Hystrix 提供两种隔离策略,线程池隔离和信号量隔离。
Hystrix 中最推荐的也是最常用的是线程池隔离。线程池隔离的好处是隔离度很高,不会影响其他资源,但是线程本身也有自己的问题,线程上下文切换时比较耗 CPU 资源的,如果对低延时要求比较高,影响还是挺大的,而且创建线程是需要分配内存的,创建的线程越多,需要分配的内存也会更多。而且如果对每个资源都创建一个线程池,那线程切换会带来更大的损耗。
而 Hystrix 的信号量隔离,可以对某个资源调用的并发数进行限制,轻量级的,不用显式创建线程池,但缺点是不能对慢调用进行自动降级,只能等客户端那边超时,还是有可能出现级联阻塞的情形。
Sentinel
Sentinel 可以通过并发线程数模式的流量控制来提供信号量隔离的功能,而且它还具备响应时间的熔断降级模式,防止过多的慢调用占满并发数而影响整个系统。
2、熔断降级的对比
Sentinel 和 Hystrix 都是基于熔断器模式。都支持基于异常比率来进行熔断,但 Sentinel 更强大,可以基于响应时间、异常比率和异常数来进行熔断降级。
3、实时统计的对比
Sentinel 和 Hystrix 都是基于滑动窗口进行实时统计,但 Hystrix 是基于 RxJava 的事件驱动模型,在服务调用成功/失败/超时的时候发布响应的事件,通过一系列的变换和聚合最终得到实时的指标统计数据流,可以被熔断器或 Dashboard 消费。而 Sentinel 是基于 LeapArray 的滑动窗口。
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 不支持 |
流量整形 | 支持慢启动、匀速器模式 | 不支持 |
系统负载保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC | Servlet、Spring Cloud Netflix |
四、部署sentinel dashboard
我这里启动镜像是
docker pull bladex/sentinel-dashboard:1.8.0
端口如下图查看
docker run --name sentinelDashboard -d -p 8858:8858 镜像id
部署成功后:http://localhost:8858,帐号密码登陆
五、Springcloud项目配置
-
jar包
- 父工程引入alibaba cloud
版本对应关系<!-- 版本根据cloud版本来决定 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring.cloud.alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency>
- 子工程
<!-- 阿里巴巴流量卫兵 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
- 父工程引入alibaba cloud
-
配置文件,直接配置dashboard项目地址
spring: cloud: sentinel: transport: dashboard: localhost:8858
- 实时监控:时时显示qps信息
- 簇点链路:所有接口信息,及常用规则设置
- 规则需要在对应的方法上设置后才会限制到规则列表中
六、sentinel保护说明
-
sentinel starter 依赖默认情况下就会为所有的HTTP服务提供埋点,就是把请求的url 加入到sentinel监控中
所以在springboot 中的Controller都可以受到Sentinel的保护; -
可以通过如下配置关闭对微服务的保护:
#关闭sentinel对controller的url的保护
spring.cloud.sentinel.filter.enabled=false -
可以通过@SentinelResource(value = “app”)注解保护应用;
属性 作用 是否必须 value 资源名称 是 entryType entry类型,标记流量的方向,取值IN/OUT,默认是OUT 否 blockHandler 处理BlockException的函数名称。函数要求:1. 必须是 public;2.返回类型与原方法一致;3. 参数类型需要和原方法相匹配,并在最后加 BlockException 类型的参数。;4. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定blockHandlerClass里面的方法。 否 blockHandlerClass 存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同blockHandler。 否 fallback 用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求: 1. 返回类型与原方法一致;2. 参数类型需要和原方法相匹配,Sentinel 1.6开始,也可在方法最后加 Throwable 类型的参数;3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定fallbackClass里面的方法。 否 fallbackClass 存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。 否 defaultFallback 用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求: 1. 返回类型与原方法一致 ;2. 方法参数列表为空,或者有一个 Throwable 类型的参数;3. 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。 否 exceptionsToIgnore 指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。 否 exceptionsToTrace 需要trace的异常 Throwable
更多内容请关注下一章节
!!!!SpringCloudAlibaba项目集成代码示例!!!
更多推荐
所有评论(0)