Spring Boot整合流控组件Sentinel的场景分析

目录
  • 一、百度百科
    • 1、Sentinel 特性
    • 2、Sentinel 的开源生态
  • 二、Sentinel 的历史
  • 三、Sentinel 基本概念
    • 1、资源
    • 2、规则
  • 四、sentinel的优势
  • 五、Sentinel 功能和设计理念
    • 1、什么是流量控制
    • 2、流量控制设计理念
    • 3、什么是熔断降级
    • 4、熔断降级设计理念
    • 5、系统自适应保护
    • 6、Sentinel 是如何工作的
    • 7、竞品对比
  • 六、SpringBoot整合sentinel
    • 1、加入pom
    • 2、编写sentinel规则
    • 3、测试
  • 七、springboot整合sentinel dashboard
    • 1、安装sentinel dashboard
    • 2、springboot整合sentinel dashboard
    • 3、用sentinel dashboard配置流控
  • 八、sentinel中其它定义资源的方式
    • 1、抛出异常的方式定义资源
    • 2、返回布尔值方式定义资源
    • 3、sentinel支持异步调用链路的统计
    • 4、注解形式定义资源

一、百度百科

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。

1、Sentinel 特性

丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。

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

2、Sentinel 的开源生态

二、Sentinel 的历史

2012 年,Sentinel 诞生,主要功能为入口流量控制。

2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。

2018 年,Sentinel 开源,并持续演进。

2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出C++原生版本,同时针对 Service Mesh 场景也推出了Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。

2020 年,推出Sentinel Go 版本,继续朝着云原生方向演进。

三、Sentinel 基本概念

1、资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

2、规则

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

四、sentinel的优势

友好的控制面板
支持实时监控
支持多种限流,比如QPS限流,线程数以及多种限流策略
支持多种降级模式,支持按平均返回时间降级,按多种异常数降级,按异常比例降级等
方便扩展开发,支持SPI模式对chain进行扩展
支持链路的关联,可以实现按链路统计限流,系统保护,热门资源保护等等

五、Sentinel 功能和设计理念

1、什么是流量控制

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

2、流量控制设计理念

流量控制有以下几个角度:

资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
运行指标,例如 QPS、线程池、系统负载等;
控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

3、什么是熔断降级

除了流量控制以外,及时对调用链路中的不稳定因素进行熔断也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。

Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。

这里是引用Hystrix源自Netflix API团队于2011年开始的弹性工程工作。2012年Hystrix不断发展和成熟,Netflix内的许多团队都采用了它。如今,每天在Netflix执行数以千亿计的线程隔离和数以千计的信号隔离调用,这大大的提高了运行时间和弹性。

4、熔断降级设计理念

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

Hystrix 通过线程池隔离的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配,并且对于一些使用了 ThreadLocal 的场景来说会有问题(如 Spring 事务)。

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

(1)通过并发线程数进行限制

和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。

(2)针对慢调用和异常对资源进行降级

除了对并发线程数进行控制以外,Sentinel 还可以根据响应时间和异常等不稳定因素来快速对不稳定的调用进行熔断。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新渐进式地恢复。

5、系统自适应保护

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

针对这个情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

6、Sentinel 是如何工作的

Sentinel 的主要工作机制如下:

对主流框架提供适配或者显示的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。

根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel 提供开放的接口,方便您定义及改变规则。

Sentinel 提供实时的监控系统,方便您快速了解目前系统的状态。

7、竞品对比

六、SpringBoot整合sentinel

1、加入pom

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>0.2.1.RELEASE</version>
</dependency>

2、编写sentinel规则

@PostConstruct
public void initFlowRules(){
    //1.创建存放限流规则的集合
    List<FlowRule> rules = new ArrayList<>();
    //2.创建限流规则
    FlowRule rule = new FlowRule();
    //定义资源,表示sentinel会对这个资源生效
    rule.setResource("helloSentinel");
    //定义限流规则类型
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    //定义QPS每秒能通过的请求个数
    rule.setCount(2);
    //3.将限流规则放入集合中
    rules.add(rule);
    //4.加载限流规则
    FlowRuleManager.loadRules(rules);
}
@GetMapping("/helloSentinel")
public String hello(){
    try{
        Entry entry = SphU.entry("helloSentinel");
        return "helloSentinel success.";
    }catch (Exception e){
        log.error(e.getMessage());
        return "helloSentinel error";
    }
}

3、测试

(1)频率小于1秒两次时,访问成功

(2)频率大于1秒两次时,由于限流规则的设立,故失败

七、springboot整合sentinel dashboard

1、安装sentinel dashboard

(1)下载jar包

sentinel-1.7.1jar包下载链接

链接: https://pan.baidu.com/s/1MSwFNSaE_3gRxe6nsNXNDQ

提取码: e5j2 

(2)启动jar包

java -Dserver.port=9000 -jar sentinel-dashboard.jar

2、springboot整合sentinel dashboard

(1)引入pom

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

(2)配置启动类

-Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=GooReeyProject

(3)通过调用接口,使其在dashboard显示出来

3、用sentinel dashboard配置流控

(1)注释掉代码中的流控设置代码

(2)用控制台的配置取代代码

八、sentinel中其它定义资源的方式

1、抛出异常的方式定义资源

@GetMapping("/helloSentinel")
public String hello(){
    try{
        Entry entry = SphU.entry("helloSentinel");
        return "helloSentinel success.";
    }catch (Exception e){
        log.error(e.getMessage());
        return "helloSentinel error";
    }
}

2、返回布尔值方式定义资源

代码示例:

@GetMapping("/sentinelBoolean")
public boolean sentinelBoolean(){
    if(SphO.entry("sentinelBoolean")){
        try {
            log.info("sentinelBoolean success.");
            return true;
        }finally {
            SphO.exit();
        }
    }else{
        log.warn("sentinelBoolean error.");
        return false;
    }
}

3、sentinel支持异步调用链路的统计

在异步调用中,需要通过SphU.asynvEntry(xxx)方法定义资源,并通常需要在异步的回调函数中调用exit()方法。

代码编写:

(1)启动类加入@EnableAsync注解

@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = "com.guor")
@MapperScan("com.guor.management.dao")
@RefreshScope
@EnableAsync
public class ManagementApplication {

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

}

(3)控制层

@GetMapping("/sentinelAsync")
public void sentinelAsync(){
    AsyncEntry asyncEntry = null;
    try {
        asyncEntry = SphU.asyncEntry("sentinelAsync");
        userService.sentinelAsync();
        log.info("sentinelAsync success.");
    }catch (BlockException e){
        log.error("sentinelAsync error.");
    }finally {
        if(asyncEntry != null){
            asyncEntry.exit();
        }
    }
}

sentinel dashboard未定义时:

sentinel dashboard定义后:流控成功!

4、注解形式定义资源

(1)pom文件

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.7.2</version>
</dependency>

(2)配置类

package com.guor.management.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;

@Configuration
public class SentinelAspectConfig {

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

(3)控制类

@SentinelResource(value = "sentinel_Annotation", blockHandler = "exceptionHandler")
@GetMapping("/annotation")
public String sentinelAnnotation(){
    return "sentinelAnnotation";
}

public String exceptionHandler(BlockException e){
    e.printStackTrace();
    return "系统繁忙,请稍后";
}

(4)定义流控规则

到此这篇关于Spring Boot整合流控组件Sentinel的文章就介绍到这了,更多相关Spring Boot流控组件Sentinel内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot基于Sentinel在服务上实现接口限流

    Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面. 在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数:或者按照某种规则进行限流,如限制ip的单位时间访问次数等. 之前我们已经讲过接口限流的工具类ratelimter可以实现令牌桶的限流,很明显sentinel的功能更为全面和完善.来看一下sentinel的简介: https://github.com/spring-cloud-incubator/spring-cloud-alibab

  • 详解Springboot集成sentinel实现接口限流入门

    Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面. 在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数:或者按照某种规则进行限流,如限制ip的单位时间访问次数等. 之前我们已经讲过接口限流的工具类ratelimter可以实现令牌桶的限流,很明显sentinel的功能更为全面和完善.来看一下sentinel的简介: https://github.com/spring-cloud-incubator/spring-cloud-alibab

  • 详解SpringBoot Redis自适应配置(Cluster Standalone Sentinel)

    核心代码段 提供一个JedisConnectionFactory  根据配置来判断 单点 集群 还是哨兵 @Bean @ConditionalOnMissingBean public JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory factory = null; String[] split = node.split(","); Set<HostAndPort> nodes =

  • springboot集成与使用Sentinel的方法

    前言 在上一篇中,我们初步了解了Sentinel的基本概念,以及其有关限流方面的基础理论,本篇将通过简单的与框架进行整合,看看Sentinel如何在实际项目中进行使用 控制台安装与部署 在实际的小微服务中,使用Sentinel做限流还有另一个强大的利器,就是其提供的dashboard,尽管我们可以通过编写Sentinel提供的一些API限流规则封装一些通用的方法,但是这对于很多初次接触Sentinel的同学来说,学习成本仍然不小,而提供的dashboard可以很方便的通过界面配置的方式达到上一篇

  • SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentinel 具有以下特征: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围).消息削峰填谷.集群流量控制.实时熔断下游不可用应用等. 完备的实时监控:Sentinel 同时提供实时的监控功能.您可以在控制台中看到接入应用的

  • Spring Boot整合流控组件Sentinel的场景分析

    目录 一.百度百科 1.Sentinel 特性 2.Sentinel 的开源生态 二.Sentinel 的历史 三.Sentinel 基本概念 1.资源 2.规则 四.sentinel的优势 五.Sentinel 功能和设计理念 1.什么是流量控制 2.流量控制设计理念 3.什么是熔断降级 4.熔断降级设计理念 5.系统自适应保护 6.Sentinel 是如何工作的 7.竞品对比 六.SpringBoot整合sentinel 1.加入pom 2.编写sentinel规则 3.测试 七.sprin

  • Spring Boot配置线程池拒绝策略的场景分析(妥善处理好溢出的任务)

    目录 场景重现 配置拒绝策略 代码示例 通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务.为异步任务配置线程池.使用多个线程池隔离不同的异步任务.今天这篇,我们继续对上面的知识进行完善和优化! 如果你已经看过上面几篇内容并已经掌握之后,一起来思考下面这个问题: 假设,线程池配置为核心线程数2.最大线程数2.缓冲队列长度2.此时,有5个异步任务同时开始,会发生什么? 场景重现 我们先来把上面的假设用代码实现一下: 第一步:创建Spring Boot

  • spring boot 动态生成接口实现类的场景分析

    目录 一: 定义注解 二: 建立动态代理类 三: 注入spring容器 四: 编写拦截器 五: 新建测试类 在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应的注解,并不需要实现对应的逻辑. 比如 mybatis和feign: 在 mybatis 中,我们只需要定义对应的mapper接口:在 feign 中,我们只需要定义对应业务系统中的接口即可. 那么在这种场景下,具体的业务逻辑时怎么执行的呢,其实原理都是动态代理. 我们这里不具体介绍动态代理,主要看一下它在springboot项目

  • Spring Boot整合Zookeeper实现分布式锁的场景分析

    目录 一.Java当中关于锁的概念 1.1.什么是锁 1.2.锁的使用场景 1.3.什么是分布式锁 1.4.分布式锁的使用场景 二.zk实现分布式锁 2.1.zk中锁的种类: 2.2.zk如何上读锁 2.3.zk如何上写锁 2.4.⽺群效应 三.springboot整合分布式锁 温馨提示:本篇文章要求掌握zk的数据结构,以及临时序号节点! zk实现分布式锁完全是依靠zk节点类型当中的临时序号节点来实现的 一.Java当中关于锁的概念 1.1.什么是锁 锁是用来控制多个线程访问共享资源的方式,一般

  • Spring Cloud Alibaba微服务组件Sentinel实现熔断限流

    目录 Sentinel简介 Sentinel具有如下特性: 安装Sentinel控制台 创建sentinel-service模块 限流功能 创建RateLimitController类 根据URL限流 自定义限流处理逻辑 熔断功能 与Feign结合使用 使用Nacos存储规则 原理示意图 功能演示 Sentinel简介 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,Sentinel 作为其核心组件之一,具有熔断与限流等一系列服务保护功能,本文将对其用法进行详细介

  • spring boot 项目中使用thymeleaf模板的案例分析

    准备 MySql数据库,表Prereg,IDEA 数据库中的表如下所示: IDEA目录结构如下: 添加thymeleaf依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 开始添加代码: 在controller包添加类"

  • Spring Boot应用通过Docker发布部署的流程分析

    目录 手动部署 1.idea创建spring boot项目 2.项目打成 Jar 包 3.构建 docker image 4.查看并运行镜像 插件部署 运行推送命令 将Spring Boot项目部署到docker中有两种方法,手动部署和插件部署 手动部署 1.idea创建spring boot项目 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/

  • 基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析

    之前有分享一个vue2.x移动端弹框组件,今天给大家带来的是Vue3实现自定义弹框组件. V3Popup 基于vue3.x实现的移动端弹出框组件,集合msg.alert.dialog.modal.actionSheet.toast等多种效果.支持20+种自定义参数配置,旨在通过极简的布局.精简的调用方式解决多样化的弹框场景. v3popup 在开发之初参考借鉴了Vant3.ElementPlus等组件化思想.并且功能效果和之前vue2.0保持一致. ◆ 快速引入 在main.js中全局引入v3p

  • 详解Spring Boot下Druid连接池的使用配置分析

    引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连接池,在连接池之外,还提供了非常优秀的监控功能,这里讲解如何与Spring Boot实现集成. 1.  环境描述 spring Boot 1.4.0.RELEASE,  JDK 1.8 2.   Druid介绍 Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource 高效可管理的数据

  • Spring Boot实现微信扫码登录功能流程分析

    目录 1. 授权流程说明 第一步:请求CODE 第二步:通过code获取access_token 第三步:通过access_token调用接口 2. 授权流程代码 3. 用户登录和登出 4. Spring AOP校验用户有没有登录 5. 拦截登录校验不通过抛出的异常 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1. 授权

随机推荐