一、基本介绍
- 什么是熔断和降级
服务的稳定是公司可持续发展的重要基石,随着业务量的快速发展,一些平时正常运行的服务,会出现各种突发状况,而且在分布式系统中,每个服务本身又存在很多不可控的因素,比如线程池处理缓慢,导致请求超时,资源不足,导致请求被拒绝,又甚至直接服务不可用、宕机、数据库挂了、缓存挂了、消息系统挂了…对于一些非核心服务,如果出现大量的异常,可以通过技术手段,对服务进行降级并提供有损服务,保证服务的柔性可用,避免引起雪崩效应。
服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施。
服务降级是在服务器压力陡增的情况下,利用有限资源,根据当前业务情况,关闭某些服务接口或者页面,以此释放服务器资源以保证核心任务的正常运行。
- 为什么要使用熔断和降级
在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败,比如超时、异常等,需要保证在一个依赖出问题的情况下,不会导致整体服务失败。
- sentinel 熔断和降级
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel
是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
sentinel具有以下特征:
丰富的应用场景: Sentinel承接了阿里巴巴近十年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围),消息削峰填谷,集群流量控制,实时熔断下游不可用应用等
完美的实时监控: Sentinel同时提供实时的监控功能,您可以在控制台看到接入应用的单台机器秒级数据,甚至500台一下规模的集群的汇总运行情况
广泛的开源生态: Sentinel提供开箱即用的与其他框架/库的整合模块,例如与SpringCloud,Dubbo,gRPC的整合,您只需要引入响应的依赖并进行简单的配置即可快速接入Sentinel
完美的SPI扩展点: Sentinel提供简单易用的,完美的SPI扩展接口,可以通过实现扩展接口来快速定制逻辑,例如定制规则管理,适配动态数据源等
下面是sentinel
的架构图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlaUqZGZ-1680441582288)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
- 核心概念
sentinel
的使用可以分为两个部分
核心库不依赖任何框架/库,能够允许在jdk7
以上的版本运行时环境,同时对Dubbo、SpringCloud等框架也有比较好的支持。
控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等
二、下载方式
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
- Windows平台安装包下载
可以从https://github.com/alibaba/Sentinel/releases
下载sentinel-dashboard-$version.jar
包。
使用如下命令启动控制台:
java -Dserver.port=8718 -Dcsp.sentinel.dashboard.server=localhost:8718 -Dproject.name=sentinel-dashboard -Dcsp.sentinel.api.port=8719 -jar G:\software\java\sentinel\sentinel-dashboard-1.8.0.jar
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ibq8tkvs-1680441582289)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
其中-Dserver.port=8718
用于指定Sentinel
控制台端口为8718
,F:\software\sentinel\sentinel-dashboard-1.8.0.jar
为下载的包路径地址。
提示
如果觉得官网下载慢,可以使用我分享的网盘地址: 百度网盘 请输入提取码 提取码: vneh
- 打开控制台
Sentinel
提供了一个可视化的操作平台,安装好之后,在浏览器中输入(http://localhost:8718 (opens new window))就可以访问了,默认的用户名和密码都是sentinel
(我使用的是1.8.0版本)
三、如何使用
1、添加依赖
<!-- springcloud alibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、添加Sentinel配置
spring:
application:
# 应用名称
name: ruoyi-xxxx
cloud:
sentinel:
# 取消控制台懒加载
eager: true
transport:
# 控制台地址
dashboard: 127.0.0.1:8718
3、添加TestUserController.java
,模拟接口返回用户信息。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestUserController
{
@GetMapping("/user/info")
public Object info()
{
return "{\"username\":\"admin\",\"password\":\"admin123\"}";
}
}
4、在Application
启动类加入注解@SpringBootApplication
。
@SpringBootApplication
public class RuoYiXxxxApplication
{
public static void main(String[] args)
{
SpringApplication.run(RuoYiXxxxApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ Xxxx启动成功 ლ(´ڡ`ლ)゙ \n" +
" .-------. ____ __ \n" +
" | _ _ \\ \\ \\ / / \n" +
" | ( ' ) | \\ _. / ' \n" +
" |(_ o _) / _( )_ .' \n" +
" | (_,_).' __ ___(_ o _)' \n" +
" | |\\ \\ | || |(_,_)' \n" +
" | | \\ `' /| `-' / \n" +
" | | \\ / \\ / \n" +
" ''-' `'-' `-..-' "