Spring Cloud Alibaba Sentinel - - >流控规则初体验

news/2024/10/25 3:21:32/

源码地址:https://github.com/alibaba/Sentinel
新手指南:https://github.com/alibaba/Sentinel/wiki/新手指南#公网-demo
官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html
注解支持文档:https://github.com/alibaba/Sentinel/wiki/注解支持

源代码地址:Spring Cloud Alibaba Sentinel - - >流控规则 (快速使用案例),主要看Sentinel8040这个moudle

文章目录

      • Sentinel 介绍
      • 🔗 Sentinel 与 Hystrix 的对比
      • 🔗 使用简介
      • Sentinel 快速使用
        • 🔗 1. 添加依赖关系
        • 🔗 2. 定义资源
        • 🔗 3. 定义规则
        • 🔗 4. 检查效果

Sentinel 介绍

  Sentinel 是阿里巴巴开源的,面向分布式服务架构的高可用组件 / 流量控制组件 (分布式系统的流量防卫兵)。随着微服务的流行,服务与服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制 (限流)、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。
在这里插入图片描述

Sentinel 具有以下特征:
cd
cd

  • 丰富的应用场景

Sentinel 承接了 Alibaba 近十年的双十一大促流量的核心场景,例如秒杀 (即突增流量控制在系统容器可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用服务等。

  • 完备的实时监控

Sentinel 提供实时的监控功能。你可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

  • 广泛的开源生态

Sentinel 提供开箱即用,与其它开源框架/库的整合模块,例如Spring Cloud、Dubble、gRPC的整合。你只需引入相关的依赖并进行简单的配置即可快速地接入 Sentinel。

  • 完善的 SPI 扩展点

Sentinel 提供简单易用、完善的 SPI 扩展点。你可以通过实现扩展点,快速的定制逻辑。例如定制规则管理,适配数据源等。


阿里巴巴开源的 Sentinel 是基础版,而双十一使用的是它们的内部版本。但阿里云提供了企业级的 Sentinel 服务 - - > 应用高可用服务 AHAS,也就是付费版本。其实开源的基础版本对于中小型互联网公司而言已经足够用了,而对于大型互联网公司则需要在 Sentinel 的基础上进行扩展)


🔗 Sentinel 与 Hystrix 的对比

Sentinel
Hystrix (已停更)
隔离策略信号量隔离线程池隔离/信号量隔离
熔断降级策略基于响应时间或失败比率基于失败比率
实施指标实现滑动窗口 滑动窗口 (基于RxJava)
规则配置支持多种数据源支持多种数据源
扩展性多个扩展点插件形式
基于注解的支持支持支持
限流基于QPS、支持基于调用关系的限流有限的支持
流量整形支持慢启动、匀速器模式不支持
系统负载保护支持不支持
控制台开箱即用、可配置规则、查看秒级监控、机器发现等不完善
常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC等Servlet、Spring Cloud Netflix
配置持久化可以配过nacos配置中心进行持久化通过Git文件来持久化

cd

🔗 使用简介

Sentinel 可以简单的分为 Sentinel 核心库 (sentinel-core依赖) 和 Dashboard (Sentinel控制台)。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果 (因为通过Sentinel控制台,我们可以更方便的设置规则,不仅效率提高了,还能进行实时监控,而无需编写java代码来设置规则)。 - - > 当然学习中还是以代码方式为准。

这篇文章主要介绍 Sentinel 核心库的使用。如果希望有一个最快最直接的了解,可以参考 新手指南 来获取一个最直观的感受。

我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

先把可能需要保护的资源定义好(埋点),之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。

对于主流的框架,我们提供适配,只需要按照适配中的说明配置,Sentinel 就会默认定义提供的服务,方法等为资源。


注意:Sentinel 需要 JDK 1.8 或更高版本。

需要注意的是,Sentinel 并不是一定要在 Spring Cloud Alibaba 上使用的,我们可以单纯的去使用 Sentinel 核心库。它可以在分布式架构中使用,而不是一定要在微服务架构中使用。



Sentinel 快速使用

下面是一个简单的演示 - - - > demo地址 (运行 sentinel8040 这个moudle),指导新用户只需 3 个步骤即可使用 Sentinel。它还演示如何使用仪表板监视此演示。


🔗 1. 添加依赖关系

如果您使用的是 Maven,只需在pom.xml中添加以下依赖项。

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId>
</dependency>

Sentinel 的流控规则、降级规则等都是针对项目中的接口来进行设置的,需要依赖 web 接口,需要引入 web场景启动器 spring-boot-starter-web 依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

🔗 2. 定义资源

创建一个接口,在接口中定义资源,资源名称一般和接口地址一致。

@GetMapping("/hello")public String hello(){Entry entry = null;try {// sentinel 针对资源进行限制的,通常这个资源名称会跟接口的地址名称保持一致entry = SphU.entry(RESOURCE_NAME);// 被保护的业务逻辑String str = "hello word";log.info("- - -> " + str + " <- - -");return str;} catch (BlockException e) {// 资源访问阻止,被限流 或 被降级// 进行相应的处理操作log.info("block");return "被流控了";} catch (Exception e) {// 若需要配置降级规则,需要通过这种方式记录业务异常Tracer.traceEntry(e, entry);}finally {if(entry != null){entry.exit();}}return null;}

🔗 3. 定义规则

接下来,通过流控规则来指定允许该资源通过的请求次数,例如下面的代码定义了资源 HelloWorld 每秒最多只能通过 1 个请求。

@PostConstruct // Spring的初始化方法
private static void initFlowRules(){// 流控规则List<FlowRule> rules = new ArrayList<>();// 流控FlowRule rule = new FlowRule();// 设置受保护的资源(即为哪个资源进行流量控制)rule.setResource(RESOURCE_NAME);// 设置流控规则 QPSrule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置受保护的资源阈值// Set limit QPS to 20,设置每秒的访问数为20,超过20的部分就会进行限流//rule.setCount(20);// Set limit QPS to 1,设置每秒的访问数为1,超过1的部分就会到catch(BlockException e)里去rule.setCount(1);rules.add(rule);// 加载配置好的规则FlowRuleManager.loadRules(rules);
}

完成上面 3 步,Sentinel 就能够正常工作了。更多的信息可以参考 使用文档。


完整代码

@RestController
@Slf4j
public class HelloController {private static final String RESOURCE_NAME = "hello";private static final String USER_RESOURCE_NAME = "user";private static final String DEGRADE_RESOURCE_NAME = "degrade";/*** 进行Sentinel流控规则** Sentinel 所有的规则都是针对于接口来的,准确点说是针对资源来设置的*/@GetMapping("/hello")public String hello(){Entry entry = null;try {// sentinel 针对资源进行限制的,通常这个资源名称会跟接口的地址名称保持一致entry = SphU.entry(RESOURCE_NAME);// 被保护的业务逻辑,如果是RPC调用远程服务的接口,那么这里被保护的就是RPC远程服务接口String str = "hello word";log.info("- - -> " + str + " <- - -");// 如果没有被流控,则正常返回return str;} catch (BlockException e) {// 资源访问阻止,被限流 或 被降级// 进行相应的处理操作log.info("block");// 如果被流控了,则返回被流控了return "被流控了";} catch (Exception e) {// 若需要配置降级规则,需要通过这种方式记录业务异常Tracer.traceEntry(e, entry);}finally {if(entry != null){entry.exit();}}return null;}@PostConstruct // Spring的初始化方法private static void initFlowRules(){// 流控规则List<FlowRule> rules = new ArrayList<>();// 流控FlowRule rule = new FlowRule();// 设置受保护的资源(即为哪个资源进行流量控制)rule.setResource(RESOURCE_NAME);// 设置流控规则 QPSrule.setGrade(RuleConstant.FLOW_GRADE_QPS);// 设置受保护的资源阈值// Set limit QPS to 20,设置每秒的访问数为20,超过20的部分就会进行限流//rule.setCount(20);// Set limit QPS to 1,设置每秒的访问数为1,超过1的部分就会到catch(BlockException e)里去rule.setCount(1);rules.add(rule);// 加载配置好的规则FlowRuleManager.loadRules(rules);}}

🔗 4. 检查效果

在这里插入图片描述


http://www.ppmy.cn/news/5811.html

相关文章

Android---Banner轮播图

轮播图是一种很常见的UI。Banner框架能够帮助我们快速开发&#xff0c;完成首页轮播图效果的需求。 1、导入Banner依赖 implementation io.github.youth5201314:banner:2.2.2 2、activity_main.xml布局。 banner_loop_time: 设置轮播间隔时间&#xff0c;默认3000&#xff…

基于注解方式Spring Security忽略拦截

文章目录1.Spring Security忽略拦截配置2.基于配置文件注入2.1.添加配置2.2.修改Spring Security配置类2.3. 测试3.基于注解的方式过滤接口3.1.添加注解3.2.获取所有使用了IgnoreWebSecurity注解的接口访问路径3.3.测试1.Spring Security忽略拦截配置 关于Spring Securite的使…

Flarum部署:从源码到docker到放弃

警告&#xff1a; 此篇文章前半段记录了我用代码部署flarum遇到的一些问题和解决办法&#xff0c;但是可能是由于我是在不熟悉php的框架结构&#xff0c;最终我还是选择了使用docker进行部署&#xff0c;请斟酌是否继续阅读本文。 Hello&#xff0c;大家好&#xff0c;我是内网…

IU酒店释放轻中端投资活力,开启曲靖酒店新篇章

曲靖位于云南省东北部&#xff0c;是云南连接内地的重要陆路通道&#xff0c;素有“滇黔锁钥”、“入滇门户”、“云南咽喉”之称&#xff0c;是仅次于昆明的云南第二大城市。曾入选“中国十佳宜居城市”榜单10次的城市&#xff0c;拥有3000多年的文明史&#xff0c;早在三国魏…

通过脚手架vue-cli创建一个vue项目

我需要在vue-demo文件下新建vue项目 步骤一 ①在该文件夹下打开集成终端 输入创建命令 命令 vue create 项目名称 &#xff0c;注意不要使用驼峰命名法 如果是第一次配置&#xff0c;有面的提示&#xff0c;这里说你这样速度会很慢的&#xff0c;用不用镜像啊&#xff0c;这…

基于HOG、LBP完成特征工程,基于SVM/RF/XGBOOST/GBDT/CNN/DNN完成人脸识别+表情识别

在我之前的文章中写过很多关于人脸识别和表情识别的文章&#xff0c;今天有一个项目的需求就是需要做两种或者是多种任务&#xff0c;我在开发完对应的模型之后就突然想到了之前做过的人脸识别和表情识别的项目&#xff0c;就想着是否可以基于机器学习/深度学习等方式来同时实现…

打造飞一样的前端:vue3应用打包优化

目录前言优化vue3构建的几点措施采用CDN压缩JS按需加载按需加载vxe-table按需加载element-plus总结前言 vue3应用上线后&#xff0c;一直受困于加载过慢&#xff0c;昨天终于坐下来做些优化。本想切换到webpack打包&#xff0c;但还是坚持了vite。 优化vue3构建的几点措施 采…

Hook原理

对于会Hook的人来说,Hook其实也就那么回事.对于没有Hook过的人来说,会感觉Hook很高大上(其实也没毛病). 那么今天我们就来探讨一些Hook的原理是什么. 我认为任何Hook都可以分为以下三步(简称WFH): 需要Hook的是什么,在哪里(后面简称Where). 寻找到Hook的地方.(后面简称Find)…