前言:随着微服务的流行,服务和服务之间的稳定性变得越来越重要。阿里开源的Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩”效应,为微服务系统提供了稳定性的解决方案。
一、服务降级和服务熔断的区别
一个分布式应用会依赖多个服务,每个服务可能会存在多个实例,服务依赖的中间件也可能是分布式的,当应用规模足够大,某个节点出现故障的概率也因此增加。在分布式系统中,应把故障当作应用的一部分,我们需要保证当某个节点出现故障时整个应用依然能正常运行,要避免服务雪崩。
-
服务雪崩:服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。为了防止服务雪崩,我们一般采用熔断降级的方式应对。
-
服务熔断:当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
-
服务降级:当系统负荷过载或响应慢,舍弃一些非核心业务,缓解系统压力,维持核心业务正常运行,保证整个系统的稳定性和可用性。
熔断和降级的到底有啥区别,我个人理解是: 服务降级有很多种降级方式,服务熔断属于降级方式的一种,服务降级是更广泛的方案。服务降级需要将服务按级别进行分类,优先对影响较小的服务进行降级。
服务降级方式:
-
页面拒绝服务:此服务暂停,页面提示由于服务繁忙。
-
服务接口拒绝服务:只读,对于增删改接口提示服务器繁忙。
-
延迟持久化:页面正常访问,涉及变更将数据记录到异步队列或log,服务恢复后执行。
-
随机拒绝服务:服务接口随机拒绝服务,让用户重试,用户体验不佳。
熔断降级的开源方案:Neflix的Hystrix和阿里巴巴的Sentinel,随着Hytrxi进入了维护期,推荐使用Sentinel。
二、Sentinel简介
2.1、什么是Sentinel
阿里开源的Sentinel组件,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩”效应,为微服务系统提供了稳定性的解决方案。随着Spring Cloud的Hytrxi进入了维护期,不再提供新功能,Sentinel是一个不错的替代方案。
通常情况,Hystrix采用线程池对服务的调用进行隔离,Sentinel才用了用户线程对接口进行隔离,二者相比,Hystrxi是服务级别的隔离,Sentinel提供了接口级别的隔离,Sentinel隔离级别更加精细,另外Sentinel直接使用用户线程进行限制,相比Hystrix的线程池隔离,减少了线程切换的开销。另外Sentinel的DashBoard提供了在线更改限流规则的配置,也更加的优化。
2.2、Sentinel 特征
-
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
-
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
-
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
-
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2.3、Sentinel 的主要特性
Sentinel 分为两个部分:
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
2.4、Sentinel主要功能:流量控制、熔断降级、系统负载保护
-
流量控制:流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:
-
熔断降级:Sentinel的熔断降级功能和Hystrix要解决的问题及设计原则是一致的,就是在分布式系统中某个依赖服务出现问题的时候,不要让问题蔓延到整个系统。但是Sentinel的设计思路和Hystrix不同,它采取了两种手段来实现这个目标——限制并发线程;通过响应时间对资源访问进行降级。
-
系统过载保护:当系统负载过高的时候,如果还持续让请求进入。则可能导致系统崩溃、无法响应。Sentinel提供了对应的保护机制,把系统处理请求的过程想象为一个水管,让系统的入口流量和系统的负载达到平衡,保证系统在能力范围之内处理更多请求。
三、Sentinel安装
Sentinel分为:服务端和客户端
服务端有可视化界面,便于操作,功能十分强大和实用。
客户端如果是maven项目,需引入jar后,大家都知道,既然分为服务端和客户端,客户端必须配置连接服务端的地址,即可和服务端通信并完成限流功能。
找到Sentinel服务端官方地址,下载jar,地址:https://github.com/alibaba/Sentinel/releases
启动jar即可,由于我是在windows搭建的,进入jar所在目录,在地址栏目输入 cmd,进入命令窗口,输入命令:java -jar sentinel-dashboard-1.8.2.jar
访问web地址:http://localhost:8080 默认用户名和密码都是sentinel/sentinel,然后进入首页
至此Sentinel服务端搭建完成,接下来使用微服务快速集成sentinel
四、Sentinel快速集成
4.1、pom.xml中引入依赖
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
4.2、order-service服务添加Sentinel配置项
# 应用名称
spring.application.name=order-service
server.port=9001
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# sentinel 配置
# Sentinel 控制台地址(启动Sentinel时可以指定端口,这里配置与之保持一致即可)
spring.cloud.sentinel.transport.dashboard=localhost:8080
#心跳发送周期,默认值null,但在SimpleHttpHeartbeatSender会用默认值10秒
spring.cloud.sentinel.transport.heartbeat-interval-ms=500
4.3、启动客户端服务order-service,调用OrderController的接口,可在Sentinel管理界面查看客户端信息,如图:
4.4、流量控制规则配置
给remoteProduct接口添加流控规则,它的QPS(每秒请求数)为1,如图:
通过频繁调用remoteProduct查询接口,通过监控可以看到如图信息:
发现刷新点快了,确实会被限流拒绝
4.5、熔断降级规则配置
给remoteProduct接口添加一个熔断降级规则配置,如果QPS大于1,且平均响应时间大于20ms,则接口下来接口在2秒钟无法访问,之后自动恢复。
热点,授权等操作,根据自己需求自行配置即可,至此集成完毕。
4.6、Sentinel 提供了@SentinelResource注解用于定义资源,并提供了AspectJ的扩展用于自定义资源,处理BlockException等。
现在我们了解到通过Sentinel
控制对Spring mvc接口层级的控制,那么在我们实际项目开发时不仅仅限于接口,可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。
参考链接: