Spring Cloud Alibaba 快速入门(四):Sentinel接口限流和熔断降级

本文介绍了Sentinel在微服务中的关键作用,比较了服务降级和熔断的区别,并详细阐述了Sentinel的功能、安装和SpringBoot集成过程。重点讲解了如何配置流量控制规则和熔断降级策略,以及如何快速集成Sentinel以提升系统稳定性。
摘要由CSDN通过智能技术生成

前言:随着微服务的流行,服务和服务之间的稳定性变得越来越重要。阿里开源的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 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

bd29d078ac6c8ec201dde13ad36c74e9.png

  • 熔断降级:Sentinel的熔断降级功能和Hystrix要解决的问题及设计原则是一致的,就是在分布式系统中某个依赖服务出现问题的时候,不要让问题蔓延到整个系统。但是Sentinel的设计思路和Hystrix不同,它采取了两种手段来实现这个目标——限制并发线程;通过响应时间对资源访问进行降级。

  • 系统过载保护:当系统负载过高的时候,如果还持续让请求进入。则可能导致系统崩溃、无法响应。Sentinel提供了对应的保护机制,把系统处理请求的过程想象为一个水管,让系统的入口流量和系统的负载达到平衡,保证系统在能力范围之内处理更多请求。

9064f29d083b8b40f543abe67f61f474.png


三、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接口层级的控制,那么在我们实际项目开发时不仅仅限于接口,可能对于某个方法的调用限流,对于某个外部资源的调用限流等都希望做到控制。


 参考链接:

服务降级和服务熔断的区别

Spring Boot2 集成 Sentinel 实现接口流制和降级

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构何哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值