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

news2024/12/25 1:10:31

源码地址: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);
    // 设置流控规则 QPS
    rule.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);
        // 设置流控规则 QPS
        rule.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.coloradmin.cn/o/108630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android常用布局总结之(FrameLayout、ConstraintLayout)

一、FrameLayout 帧布局 这种布局类似叠加的图片&#xff0c;没有任何的定位方式&#xff0c;当我们往里面添加组件的时候&#xff0c;会默认把他们放到容器的左上角。 上面的组件显示在底层&#xff0c;下面的组件显示在上层。 如下代码&#xff0c;视图1显示在最底层&#…

虹科案例 | 光纤传感器实现了新的核磁共振应用!

背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大&#xff08;3.0T是当今最高的标准&#xff09;&#xff0c;因此&#xff0c;组件的电磁透明度在每…

python---数据库操作

在python中&#xff0c;使用第三方库pymysql来执行数据库操作 命令行窗口输入 &#xff1a;pip install pymysql&#xff0c;下载第三方库 数据库查询操作 Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。 fetchone(): 该方法获取下一…

OpManager 网络管理软件

随着网络在有线、无线和虚拟 IT 环境中的扩展&#xff0c;网络管理只会变得越来越复杂&#xff0c;使网络管理员需要他们可以获得的所有帮助。市场上有无数的网络管理解决方案&#xff0c;因此将注意力集中在正确的解决方案上非常重要。网络管理工具通常可以帮助您将网络的各种…

一行python命令让手机读取电脑文件

本文讲解python的一个内置文件传输下载器&#xff0c;可以用来在局域网内进行文件传输&#xff0c;当然可能有人会问&#xff0c;我用微信QQ也能传&#xff0c;为什么还要用python来传输下载&#xff1f;在此&#xff0c;其实我个人感觉的是&#xff0c;这种操作更简单&#xf…

【Web开发】Python实现Web服务器(Ubuntu下打包Flask)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

安科瑞红外测温方案助力滁州某新能源光伏产业工厂安全用电

安科瑞 李亚俊 壹捌柒贰壹零玖捌柒伍柒 摘要&#xff1a; 近年来&#xff0c;在国家政策引导与技术革新驱动的双重作用下&#xff0c;光伏产业保持快速增长态势&#xff0c;产业规模持续扩大&#xff0c;技术迭代更新不断&#xff0c;目前已在全球市场取得优势。据统计&#…

数据结构C语言版——链式二叉树的基本操作实现

文章目录链式二叉树1. 概念2. 链式二叉树的基本操作前序遍历中序遍历后续遍历根据前序遍历构建二叉树层序遍历在二叉树中查找指定值获取二叉树节点个数获取叶子节点个数求二叉树的高度链式二叉树 1. 概念 设计不同的节点结构可构成不同形式的链式存储结构。由二叉树的定义可知…

用简单伪随机数发生器实现随机中点位移分形(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随机分形(random fractal)采用随机生成机制而得到的分形集.分形体不具有特征尺度(亦即大小尺度跨好几个量级)&#xff0c;却有…

5G无线技术基础自学系列 | 5G接入类KPI

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 接入类KPI反映了用户成功接入到网络中并…

李沐精读论文:Swin transformer: Hierarchical vision transformer using shifted windows

论文地址&#xff1a;Swin transformer: Hierarchical vision transformer using shifted windows 代码&#xff1a;官方源码 pytorch实现 SwinTransformerAPI 视频&#xff1a;Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili 本文注意参考&#xff1a;Swin Transfor…

MySql性能优化(四)索引

Index索引相关概念数据结构B树优点及用处优点用处分类技术名词回表覆盖索引最左匹配索引下推索引的匹配方式哈希索引特点代价案例组合索引案例聚簇索引与非聚簇索引聚簇索引非聚簇索引覆盖索引基本介绍优点判断参考索引相关概念 数据结构 B树 推荐一篇讲的很不错的文章&…

【小程序】wxss与rpx单位以及全局样式和局部样式

目录 WXSS 1. 什么是 WXSS 2. WXSS 和 CSS 的关系 rpx 1. 什么是 rpx 尺寸单位 2. rpx 的实现原理 3. rpx 与 px 之间的单位换算* 样式导入 1. 什么是样式导入 2. import 的语法格式 全局样式和局部样式 1. 全局样式 2. 局部样式 WXSS 1. 什么是 WXSS WXSS (We…

Linux网络与数据封装

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 Linux网络与数据封装1. 网络应用程序的设计模式&#xff08;1&#xff09;C/S架构&#xff08;2&#…

VRTK4 入门指南

VRTK4 说明文档VRTK Farm Yard 示例 - Virtual Reality Toolkit要求使用 Unity 2020.3.24f1.Beta 免责声明简介入门下载项目在 Unity 中打开下载的项目使用 Unity Hub在 Unity 中打开项目运行示例场景Made With VRTK贡献第三方包许可证VRTK Farm Yard 示例 - Virtual Reality T…

家居建材行业数字化重构,依靠CRM打通全流程

国家十四五规划提出大力推进产业数字化转型&#xff0c;如今各行各业数字化进程如火如荼&#xff0c;传统行业将数字化转型视为重塑产业竞争力的重要途径。因此&#xff0c;即便是数字化率平均只有10%的家具建材业&#xff0c;也在积极进行全生命周期的产品数字化、全域营销数字…

加载速度提升 15%,关于 Python 启动加速探索与实践的解析 | 龙蜥技术

编者按&#xff1a;在刚刚结束的 PyCon China 2022 大会上&#xff0c;龙蜥社区开发者严懿宸分享了主题为《Python 启动加速的探索与实践》的技术演讲。本次演讲&#xff0c;作者将从 CPython 社区相关工作、本方案的设计及实现&#xff0c;以及业务层面的集成等方面进行介绍。…

Python基础知识入门(四)

Python基础知识入门&#xff08;一&#xff09; Python基础知识入门&#xff08;二&#xff09; Python基础知识入门&#xff08;三&#xff09; 一、条件控制 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者False&#xff09;来决定执行的代码块。 注意&…

使用CMake编译基于OpenCV开发的程序的方法

方法 使用CMake编译OpenCV开发的程序分为以下几个步骤&#xff1a; 安装编译器和代码编辑器。 Windows安装Visual Studio社区版&#xff0c;集成了编译器和代码编辑器。Ubuntu安装gcc、g和VSCode&#xff1a; sudo apt install gcc gcmacOS安装XCode Commandline Tools和VS…

R语言应用xgboost进行机器学习(1)

XGBoost 机器学习模型是一种高效且可扩的展的机器学习分类器&#xff0c;由 Chen 和 Guestrin 在 2016 年推广。XGBoost原理是是在决策树的基础上产生迭代&#xff0c;它以 boosting 的方式结合了多个决策树。通常创建每棵新树是为了通过梯度提升来减少先前模型的误差&#xff…