Sentinel分布式系统的流量防卫兵

2023-11-12

Sentinel 是什么?官网:https://github.com/alibaba/Sentinel/wiki/介绍

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

Sentinel 的主要特性:

Sentinel 基本概念:

资源:

  资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则:

  围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

Sentinel 功能和设计理念:

流量控制:

  流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

流量控制设计理念,流量控制有以下几个角度:

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
  • 运行指标,例如 QPS、线程池、系统负载等;
  • 控制的效果,例如直接限流、冷启动、排队等。

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级:

  除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。

熔断降级设计理念:

  在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。Hystrix 通过 线程池隔离 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。

Sentinel 对这个问题采取了两种手段:

  1. 通过并发线程数进行限制 : 和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
  2. 通过响应时间对资源进行降级 : 除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

系统负载保护:

  Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求

Sentinel 的开源生态:

Sentinel 分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

Sentinel 基本使用:

1.首先,我们需要导入依赖:

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

2.定义资源限流规则:

  资源 是 Sentinel 中的核心概念之一。最常用的资源是我们代码中的 Java 方法。 当然,您也可以更灵活的定义你的资源

//初始化规则
    private static void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>(); //限流规则的集合
        FlowRule flowRule = new FlowRule();//限流规则
        flowRule.setResource("ruleTest");//资源(可以是方法名称、接口)
        //线程数(FLOW_GRADE_THREAD)与QPS (FLOW_GRADE_QPS)
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); //限流的阈值的类型
        flowRule.setCount(18);// QPS数
        rules.add(flowRule);
        FlowRuleManager.loadRules(rules);
    }

3.启动测试类,官网提供了以下代码做演示:

public static void main(String[] args) {
        initFlowRules(); //初始化一个规则
        while(true){
            Entry entry=null;
            try{
                entry= SphU.entry("ruleTest");
                System.out.println("Hello Word");
            }catch (BlockException e){//如果被限流了,那么会抛出这个异常
                e.printStackTrace();
            }finally {
                if(entry!=null){
                    entry.exit();// 释放
                }
            }
        }
}

  Demo 运行之后,我们可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的输出:

  其中 p 代表通过的请求, block 代表被阻止的请求, s 代表成功执行完成的请求个数, e 代表用户自定义的异常, rt 代表平均响应时长。可以看到,这个程序每秒稳定输出 "hello world" 18 次,和规则中预先设定的阈值是一样的。

Sentinel 控制台:

  下载 https://github.com/alibaba/Sentinel/releases ,下载 sentinel-dashboard-1.6.3.jar 。(启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。)

  启动控制台:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

  其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel

客户端接入控制台:

  将刚刚演示的Demo 接入控制台,首秀按要导入依赖:

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.6.3</version>
</dependency>

  启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。其他配置项见:https://github.com/alibaba/Sentinel/wiki/%E5%90%AF%E5%8A%A8%E9%85%8D%E7%BD%AE%E9%A1%B9 配置如下:

-Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-demo

  这样子启动Demo就能再控制台上看到效果如下:

  其他具体相关可以查看github介绍。

Sentinel 整合SpringBoot:

  Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。首先需要导入依赖:

<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-core</artifactId>
  <version>1.6.3</version>
</dependency>
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-transport-simple-http</artifactId>
  <version>1.6.3</version>
</dependency>
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-annotation-aspectj</artifactId>
  <version>1.6.3</version>
</dependency>

  在主启动类中添加规则:

@SpringBootApplication
public class SentinelDemoApplication {

    public static void main(String[] args) {
        initFlowRules();
        SpringApplication.run(SentinelDemoApplication.class, args);
    }

    //初始化规则
    private static void initFlowRules(){
        List<FlowRule> rules=new ArrayList<>(); //限流规则的集合
        FlowRule flowRule=new FlowRule();
        flowRule.setResource("sayHello");//资源(方法名称、接口)
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); //限流的阈值的类型
        flowRule.setCount(2);
        rules.add(flowRule);
        FlowRuleManager.loadRules(rules);
    }

}

  还需要通过配置的方式将 SentinelResourceAspect 注册为一个 Spring Bean:

@Configuration
public class AopConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
    }
}

  此刻我们可以通过注解 @SentinelResource 来定义资源 :

@RestController
public class SentinelController {

    @SentinelResource(value = "sayHello") //针对方法级别的限流
    @GetMapping("/say")
    public String sayHello(){
        System.out.println("hello world");
        return "hello world";
    }

}

  启动服务就可以看到效果了。这里需要加入到Sentinel-dashboard中:-Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-demo

 

转载于:https://www.cnblogs.com/wuzhenzhao/p/11445469.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sentinel分布式系统的流量防卫兵 的相关文章

随机推荐

  • SpringBoot报错Unable to start embedded container; nested exception is java.lang.NoSuchMethodError

    SpringBoot启动报错如下 Unable to start embedded container nested exception is java lang NoSuchMethodError org apache tomcat ut
  • CloudCompare和PCL体素滤波:优化点云数据处理

    CloudCompare和PCL体素滤波 优化点云数据处理 介绍 点云数据处理在计算机视觉和机器人领域扮演着重要角色 然而 原始的点云数据可能包含噪声 离群点和冗余信息 这可能对后续的分析和应用造成负面影响 为了解决这些问题 我们可以使用体
  • [BJDCTF2020]Mark loves cat(解决githack无法下载源码&&githack无法获取文件)

    写在前面 考察知识点 1 git泄露 点击这里下载 选择安装路径后 在该文件夹下路径输入cmd 在命令行中输入 python Githack py 127 0 0 1 git 你的网址后面有 git就行 2 变量覆盖 这里有一题比较简单的变
  • 2022数模国赛C题思路详解-古代玻璃制品的成分分析与鉴别

    完整作品 含代码 文献 数据集 分类答案 正在为您运送作品详情 题目定位 数据分析题 数据量少 维度较多 参考往年题目 2021年国赛B题 一 题目背景分析 这几段主要是交代题目的背景 讲解了古代玻璃制品的特征 解释了其化学成分含量的差异性
  • 手动配置树莓派wifi联网连接热点手机热点

    手动配置树莓派wifi联网连接热点 修改wifi配置文件 运行命令 sudo nano etc wpa supplicant wpa supplicant conf 在文件中添加无线网配置信息 ctrl interface DIR var
  • 使用 Clang Tools —— ClangFormat

    ClangFormat 1 独立的工具 2 Vim 集成 3 Emacs 集成 4 BBEdit 集成 5 CLion 集成 6 Visual Studio 集成 7 用于补丁重新格式化的脚本 Script for patch reform
  • JavaScript中获取对象属性的不同方法

    JavaScript中获取对象属性的不同方法 文章目录 JavaScript中获取对象属性的不同方法 一 点记法 二 方括号记法 三 Object keys 方法 四 Object values 方法 五 Object entries 方法
  • uniapp路由传多个参数_VUE全局路由前置守卫:路由拦截登录校验

    点击右上方红色按钮关注 web秀 让你真正秀起来 前言 在任何一个平台中 如果需要增加用户黏度 除了用户需要的基本内容外 用户登录注册提交信息也是非常重要的一环 可以了解用户基本信息 用户喜欢等 抛出前后端混合开发外 vue可以轻松的实现路
  • Hyperf中RabbitMQ的使用

    1 简单的使用可以参照官方文档的AMQP组件 https hyperf wiki 2 1 zh cn amqp 2 安装过程参照 https www linuxprobe com install rabbitmq on centos 7 h
  • Qt实现点击按钮弹出(关闭)窗口,点击窗口外其他位置关闭窗口

    Qt实现点击按钮弹出 关闭 窗口 点击窗口外其他位置关闭窗口 方法一 在窗口实现类的构造函数中添加如下代码 this gt setWindowFlags Qt Popup 参数Qt Popup 表示 当点击窗口以外就关闭窗口 方法二 直接在
  • python 图片、文件 通过 request header 多线程下载

    写爬虫过程中发现图片下载比较慢 遂使用多线程下载来提速 import threading import requests class MulThreadDownload threading Thread def init self url
  • select回显注意问题

    span style font size 18px js代码 span span style font size 18px var roleName entity roleId 5 roleId val roleName span span
  • 网络安全应急响应预案培训

    应急响应预案的培训是为了更好地应对网络突发状况 实施演 练计划所做的每一项工作 其培训过程主要针对应急预案涉及的相 关内容进行培训学习 做好应急预案的培训工作能使各级人员明确 自身职责 是做好应急响应工作的基础与前提 应急响应预案的培 训分
  • 2024年java面试--mysql(3)

    系列文章目录 2024年java面试 一 spring篇 2024年java面试 二 spring篇 2024年java面试 三 spring篇 2024年java面试 四 spring篇 2024年java面试 集合篇 2024年java
  • Photoshop 之利用 "调整边缘" 抠图

    目录 1 首先 看如下图像 人物图像包含很多头发 2 利用魔棒工具 选中选区 并选择 反向 选中人物图像 3 选择选项栏中的 调整边缘 或者菜单栏中的选择 调整边缘 4 利用调整边缘 修复毛发中的空白部分扣除 5 通过拷贝的图层 将图像抠出
  • 如何安装和使用Android夜神模拟器

    夜神模拟器 是全新一代的安卓模拟器 能够让你在电脑上畅玩手机游戏 与传统安卓模拟器相比 基于Android7 1内核 同时向下兼容Android5 1内核以及X86 AMD 具备极高的兼容性和稳定性 加上超高帧率模式 能够在电脑上运行高性能
  • Antd的Upload+fetch+FormData上传Excel文件请求方式?

    let formData new FormData formData append file fileList 0 fetch 接口名称 method POST headers Content Type multipart form dat
  • 平均年薪60.8万,程序员拿下这个证书有多吃香?!

    互联网行业竞争一年比一年严峻 随着互联网的发展和进步 很多人都是想要进军到编程行业中去 作为工程师的我们唯有不停地学习 不断的提升自己才能保证自己的核心竞争力 打破内卷 从而拿到更好的薪水 进入心仪的企业 前些天 我的程序员哥们和我说 他转
  • Pycharm关闭项目卡住怎么办?

    突然有一天创建新项目的时候 Pycharm卡在了关闭项目上 通过网上查阅资料 不断试探 我最终这样解决了 1 在设置中的自然语言中添加了中文 2 更新了Pycharm由2023 1到2023 4 3 在文件中关闭项目 然后等待了较长时间后
  • Sentinel分布式系统的流量防卫兵

    Sentinel 是什么 官网 https github com alibaba Sentinel wiki 介绍 随着微服务的流行 服务和服务之间的稳定性变得越来越重要 Sentinel 以流量为切入点 从流量控制 熔断降级 系统负载保护