SpringCloudAlibaba-服务容错Sentinel(入门)
一:高并发带来的问题?
在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会
出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。
由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩效应” 。
雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问
题,不会影响到其它服务的正常运行。也就是"雪落而不雪崩"。
二:解决方式引入服务容错机制
常见的容错思路有隔离、超时、限流、熔断、降级这几种,下面分别介绍一下。
- 隔离:它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务。常见的隔离方式有:线程池隔离和信号量隔离.
- 超时:在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程。
- 限流:限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的。
- 熔断:在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
三:常见的容错组件
- Hystrix:由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。
- Resilience4J:一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品。不仅如此,Resilicence4j还原生支持Spring Boot 1.x/2.x,而且监控也支持和prometheus等多款主流产品进行整合
- Sentinel: 是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定。
三者之间的区别
Sentinel | Hystrix | resilience4j | |
隔离策略 | 信号量隔离(并发线程数限流) |
线程池隔离/信号量隔离 |
信号量隔离 |
熔断降级策略 |
基于响应时间、异常比率、异常数 | 基于异常比率 |
基于异常比率、响应时间 |
实时统计实现 |
滑动窗口(LeapArray) |
滑动窗口(基于 RxJava) |
Ring Bit Buffer |
动态规则配置 |
支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 多个扩展点 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
流量整形 |
支持预热模式、匀速器模式、预热排队模式 |
不支持 |
简单的 Rate Limiter模式 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 |
提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 |
简单的监控查看 |
不提供控制台,可对接其它监控系统 |
四:Sentinel入门
Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景, 例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 提供了实时的监控功能。通过控制台可以看到接入应用的单台机器秒级数据, 甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块, 例如与 SpringCloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 分为两个部分:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
五:微服务集成Sentinel
1: pom.xml引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2:修改application.yml
spring: cloud: sentinel: transport: dashboard: localhost:8080 # 指定控制台服务的地址 port: 9999
2:测试Controller
@Slf4j @RestController @RequestMapping("/sentinel") public class SentinelController { @RequestMapping("/mesg1") public String message1(){ return "message1"; } @RequestMapping("/mesg2") public String message2(){ return "message2"; } }
六:安装Sentinel控制台
Sentinel 提供一个轻量级的控制台, 它提供机器发现、单机资源实时监控以及规则管理等功能。
1:下载jar包(本例版本1.7.0)
https://github.com/alibaba/Sentinel/releases
2:启动控制台
# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目) java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar
3:启动成功后如图(localhost:8080 用户、密码:sentinel)
注意点:sentinel默认是懒加载、所以启动成功后其实页面是没有我们集成的微服务信息,当我们随便访问一个接口时才能看到。
简单测试一个限流功能,针对/sentinel/mesg1做个流控 如下每秒只能调用2次,超出则访问失败
在浏览器快速刷新多次/sentinel/mesg1效果如图
Sentinel集成的一个简单应用到此就实现了,因为Sentinel的功能不单单如此 写在一篇篇幅感觉过长,所以接下来再写一篇进行更进一步的学习。