我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringCloud中使用Sentinel实现限流的实战

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringCloud中使用Sentinel实现限流的实战

前言

在分布式的项目中经常会遇到那种高并发的场景,为了保证系统不会被突然激增的请求导致宕机,我们常常会使用一种服务降级的手段来保护我们的系统,本篇博客将介绍如何使用SpringCloud中使用Sentinel实现限流,从而达到服务降级的目的。

正文 Sentinel

Sentinel 是面向微服务的轻量级流量控制框架,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel可以作为Hystrix的替代品,为系统提供服务熔断和服务降级的功能。

  • 服务熔断:根据保险丝的熔断是一个原理,当调用目标服务大量超时和失败,这时候应该熔断掉该服务的调用,从而快速释放资源,这段时间所有对其调用都是快速返回,保证整体服务系统的稳定
  • 服务降级:针对核心业务服务的压力剧增,根据当前业务场景和流量对其他非核心服务进行降级处理,可以进行限流,快速返回等处理,释放资源保证核心任务的正常运行。

Sentinel的限流原理

  • SentinelBucket(桶)为单位记录一个时间窗口内的请求总数、异常总数、总耗时等指标数据。
  • 而一个Bucket可以是记录一秒内的数据,也可以是10毫秒内的数据,我们称这个时间窗口为Bucket的统计单位,由使用者自定义。

所以Sentinel是基于滑动窗口算法来实现的。

设置Sentinel的阈值指标:

线程数模式
线程数的模式采用信号隔离的方式来防止线程池被占用。
用于防止线程池被占用,一般有两种方式:

  • 线程池隔离:为应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢,这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 overhead 比较大,特别是对低延时的调用有比较大的影响。
  • 信号隔离sentinel采用的是信号隔离的方案,简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝。

所以业务处理是多线程的情况下使用线程数模式。

Sentinel采用信号隔离的方式,通过并发线程数模式,并结合基于响应时间的熔断降级模式,可以在不稳定的平均相应时间比较高的时候自动降级,防止过多的慢调用占满并发数,影响整个系统,避免慢调用引起依赖雪崩的现象。

QPS模式
QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
QPS模式适合单读线程情况(如servlet请求),这种模式下提供了三种更加精确的流控方式:

  • 直接拒绝 :直接失败
  • Warm Up: 即请求 QPSthreshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值,通常用于秒杀系统。
  • 匀速排队:设置一个等待时间, 匀速处理请求,保证服务的均匀性,不能处理QPS>1000的场景。

Sentinel 两种计算阈值的模式:

  • 集群总体模式:即限制整个集群内的某个资源的总体 qps 不超过此阈值。
  • 单机均摊模式:单机均摊模式下配置的阈值等同于单机能够承受的限额,token server 会根据连接数来计算总的阈值(比如独立模式下有 3个 client 连接到了 token server,然后配的单机均摊阈值为 10,则计算出的集群总量就为30),按照计算出的总的阈值来进行限制。这种方式根据当前的连接数实时计算总的阈值,对于机器经常进行变更的环境非常适合。

这里要说明的是:qps是每秒查询数, tps是每秒内的事务数, pv 是指页面被浏览的次数。

Sentinel流控模式

  • 直接模式: 接口达到限流条件时,开启限流
  • 关联模式: 当关联的资源达到限流条件时,开启限流
  • 链路模式:当从某个接口过来的资源达到限流条件时,开启限流

Sentinel限流的方式

  • Sentinel控制台中根据url进行限流设置
  • 通过注解的方式进行自定义限流,又可以分为:自定义url限流和自定义资源限流。

第一步:部署sentinel-dashboard

sentinel-dashboard(点击下载jar包)是一个单独的应用,通过spring-boot进行启动,主要提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。
这里可以理解为sentinel服务治理中心。

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

在这里插入图片描述

第二步:在项目中整合sentinel

注入依赖

<!--springCloud-Alibaba-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  <version>2.2.0.RELEASE</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>

<!--sentinel限流-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  <version>2.2.1.RELEASE</version>
</dependency>

在application.properties中的相关配置

spring.application.name=imagerepair
server.port=8080
spring.cloud.sentinel.transport.dashboard=127.0.0.1:18080
spring.cloud.sentinel.eager=true

Controller层

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping("/hello")
    public String hello(){
      return userService.sayHello();
    }
}

Service

@Service
public class UserService {

    @SentinelResource(value = "sayHello",fallback = "sayHellofail")
    public String sayHello(){
        return "Hello,World";
    }

    public  String sayHellofail(){
        return "I'am sorry";
    }

}

在这里插入图片描述

设置限流,快速访问,从而触发服务降级

设置Sentinel的资源

在这里插入图片描述

当请求超过设定的阈值,启动限流降级,展示如下:

在这里插入图片描述

项目源码

该项目源码可从我的github中获取。

到此这篇关于SpringCloud中使用Sentinel实现限流的实战的文章就介绍到这了,更多相关SpringCloud Sentinel限流内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringCloud中使用Sentinel实现限流的实战

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringCloud中如何使用Sentinel实现限流

这篇文章主要介绍了SpringCloud中如何使用Sentinel实现限流的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud中如何使用Sentinel实现限流文章都会有所收获,下面我们一起来看
2023-06-26

Spring Cloud Alibaba之Sentinel实现熔断限流功能的方法

这篇文章主要介绍Spring Cloud Alibaba之Sentinel实现熔断限流功能的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!sentinel简介这个在阿里云有企业级的商用版本 应用高可用服务 AHA
2023-06-14

SpringBoot中怎么利用Sentinel实现接口流量控制

这期内容当中小编将会给大家带来有关SpringBoot中怎么利用Sentinel实现接口流量控制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。项目搭建首先我们来创建一个测试项目,这里初始化项目的url建议
2023-06-15

java怎么使用Semaphore实现限流器

这篇文章主要讲解了“java怎么使用Semaphore实现限流器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java怎么使用Semaphore实现限流器”吧!概念1、Semaphore可以
2023-06-30

SpringCloud使用Feign实现远程调用流程详细介绍

OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成
2023-02-15

React SSR中的限流怎么实现

这篇文章主要介绍“React SSR中的限流怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React SSR中的限流怎么实现”文章能帮助大家解决问题。为什么要限流如下所示是一个简单的 nod
2023-07-02

如何使用SpringBoot + Redis实现接口限流

本篇内容介绍了“如何使用SpringBoot + Redis实现接口限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!配置首先我们创建一个
2023-06-30

Springboot使用redis实现接口Api限流的方法

这篇文章主要介绍“Springboot使用redis实现接口Api限流的方法”,在日常操作中,相信很多人在Springboot使用redis实现接口Api限流的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录