当前位置: 首页 > news >正文

SpringCloudAlibaba之Sentinel(一)流控篇

 前言:

为什么使用Sentinel,这是一个高可用组件,为了使我们的微服务高可用而生

我们的服务会因为什么被打垮?

一,流量激增    缓存未预热,线程池被占满 ,无法响应

二,被其他服务拖垮,比如第三方的接口响应慢

三,异常没有处理:缓存击穿,缓存穿透等等

总之而言:系统缺乏可用性防护,没有容错机制,尤其是针对流量的防护会降低服务的可用性

服务雪崩:首先是积分系统服务挂掉了,一个系统不可用,导致整个微服务系统都不可用

 限制流量

熔断

服务的降级   A计划-->B计划   积分服务就是一个弱依赖,和整体的流程关联不大,挂掉了也不会影响什么

有很多组件可以让我们进行流控、熔断、及降级,从中我们选择了SpringCloudAlibaba为我们提供的Sentinel这个组件作为我们项目中的保证服务高可用的组件。

https://github.com/alibaba/spring-cloud-alibaba/wiki

sentinel的说明文档

https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md

sentinel的控制台

https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0

先了解一下如何接入 Sentinel

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

1. 下载控制台 jar包

https://github.com/alibaba/Sentinel/releases  下载控制台 jar 包。此处下载的是1.8.5

2.启动控制台

Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。

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

注意:下载的版本的区别,不都是1.8.5

启动之后访问ip:8080

 user/pwd sentinel/sentinel

在代码端(客户端):

pom中:

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies>

 之后在application.yml文件中:主要是:spring.cloud.sentinel.transport.dashboard

server:port: 8087
spring:application:name: order_nacos-sentinelcloud:nacos:server-addr: 127.0.0.1:8848discovery:username: nacospassword: nacosnamespace: publicsentinel:transport:dashboard: localhost:8080

我们写的服务需要访问一次才能在dashboard中显示

访问了下列地址每个地址一次之后:

http://192.168.50.59:8087/order/getStock

http://192.168.50.59:8087/order/test1

http://192.168.50.59:8087/order/test2

http://192.168.50.59:8087/order/flow

之后,就可以发现:

3.流控(直接流控)

  (1) QPS流控

给getStock设置一个QPS流控:

 设置为1

我们继续访问http://192.168.50.59:8087/order/getStock,连续多点,会出现以下:

 怎么改这个页面呢?

指定的blockHandler方法要求:

1.必须是public的  2.方法返回值必须和源方法相同 3.方法参数和源方法相同,最后一个方法参数是BlockException

 继续快速访问

 这里出现了一个问题:我的程序每次重新启动的时候,流控规则都消失了,因为现在这些规则是存放在内存中的,没有做持久化

(2)线程数流控

也可以说是并发线程数流控

线程数流控和QPS流控有什么区别呢?

以一个为例:

qps为1的话代表每秒只允许有一个请求访问,

并发线程数为1的话,只要有一个线程访问,这个线程没有访问结束,那么其他线程就不能再次访问,测试的时候用睡眠的方式来测试。

@RequestMapping("/flow")@SentinelResource(value = "getStock",blockHandler = "flowBlockException")public String flow(){try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {throw new RuntimeException(e);}return "QPS流控";}public String flowBlockException(BlockException e){return "并发线程数流控";}

 

 如果不想用@SentinelResource

那么我们可以写一个类:实现:BlockExceptionHandler

@Component
@Slf4j
public class MyBlockException implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {if(e instanceof BlockException){log.error("被流控了" + e.getRule());}else if(e instanceof DegradeException){log.error("被降级了" + e.getRule());}httpServletResponse.getWriter().print(e.getRule());//        new ObjectMapper().writeValue(httpServletResponse.getWriter(),e.getRule());}

流控规则一般在服务的提供方,降级规则设置在服务的消费端。

4.关联流控

 当关联资源1被设置了以后限流以后,限制的不是自己,而是资源2的流控

这里会用到Jmeter这个测试工具,关于JMeter中文的设置(使用之前一定要配置好jdk)

性能测试(2): 测试工具 -- JMeter 安装和中文设置-腾讯云开发者社区-腾讯云

这里多写了一个简单的/add接口

 启动测试计划以后访问:http://127.0.0.1:8087/order/getStock

访问不了,显示被流控了

5.链路流控

   想要使用这个功能,配置文件中,必须设置:spring.cloud.sentinel.web-context-unify 这个属性值默认为true,表示收敛调用链路的。

spring.cloud.sentinel.web-context-unify=false

 要说明的是:进行流控的资源名不一定是controller中的接口,也有可能是service中的方法

controller中:

 service中:


@Service
@Slf4j
public class OrderService {@SentinelResource(value = "aa",blockHandler = "aaBlockException")public String aa(){log.info("测试链路流控...");System.out.println("测试链路流控...");return "测试链路流控...";}public String aaBlockException(BlockException e){log.error(e.getRule()+" ~~~");return "wawawawawwwawa";}
}

 

 测试的过程中会发现test3接口怎么测试都不会发生变化,test4访问速度过快就会显示wawawawawwwawa

6.流量效果

1.快速失败

2.warm up 预热

    针对激增流量突然涌入进来打垮冷系统,防止缓存击穿。刚开始QPS是(阈值/3) ,经过填写的预热时间增长到阈值

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量 突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐 增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。 冷加载因子: codeFactor 默认是3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

3.排队等待

    针对脉冲流量

 这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下 来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的 请求。

 

相关文章:

SpringCloudAlibaba之Sentinel(一)流控篇

前言&#xff1a; 为什么使用Sentinel&#xff0c;这是一个高可用组件&#xff0c;为了使我们的微服务高可用而生 我们的服务会因为什么被打垮&#xff1f; 一&#xff0c;流量激增 缓存未预热&#xff0c;线程池被占满 &#xff0c;无法响应 二&#xff0c;被其他服务拖…...

哪种模式ip更适合你的爬虫项目?

作为一名爬虫程序员&#xff0c;对于数据的采集和抓取有着浓厚的兴趣。当谈到爬虫ip时&#xff0c;你可能会听说过两种常见的爬虫ip类型&#xff1a;Socks5爬虫ip和HTTP爬虫ip。但到底哪一种在你的爬虫项目中更适合呢&#xff1f;本文将帮助你进行比较和选择。 首先&#xff0c…...

优维低代码实践:对接数据

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…...

docker 离线模式-部署容器

有网络的情况下下载需要的镜像 比如(下面以tomcat为例子&#xff0c;其他镜像类似) docker pull tomcat打包镜像文件到本地 docker save tomcat -o tomcat.tar将tomcat.tar 上传到内网服务器&#xff08;无外网环境&#xff09; 导入镜像 docker load -i tomcat.tar创建容器…...

MDN-HTTP

参考资料 文章目录 HTTP简介HTTP 和 HTTPSHTTP消息典型的HTTP会话HTTP响应状态HTTP安全HTTP CookieHTTP压缩 HTTP简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在计算机网络中传输超文本和其他资源的应用层协议。他是互联网的基础协议之一&#x…...

【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询

在PostgreSQL中&#xff0c;我们可以使用SELECT DISTINCT和SUBSTRING函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对resource_version字段的去重查询。 1. SELECT DISTINCT语句 SELECT DISTINCT语句用于从表中选择不重复的记录。如果没有指定列名&…...

笔记本WIFI连接无网络【实测有效,不用重启电脑】

笔记本Wifi连接无网络实测有效解决方案 问题描述&#xff1a; 笔记本买来一段时间后&#xff0c;WIFI网络连接开机一段时间还正常连接&#xff0c;但是过一段时间显示网络连接不上&#xff0c;重启电脑太麻烦&#xff0c;选择编写重启网络脚本解决。三步解决问题。 解决方案&a…...

Java课题笔记~ Spring 概述

Spring 框架 一、Spring 概述 1、Spring 框架是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架&#xff0c;它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转&#xff08;IoC&#xff09;和面向切面编程&#xff08;AOP&#xff09;。 Spring…...

2022 robocom 世界机器人开发者大赛-本科组(国赛)

RC-u1 智能红绿灯 题目描述&#xff1a; RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路&#xff0c;在某养老社区前&#xff0c;某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的&#xff1a; 路的两旁设置了一个按钮&#xff0c;老年人希望通行马路时会…...

【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块6

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…...

Typescript]基础篇之 tsc 命令解析

[Typescript]基础[TOC]([Typescript]基础篇之 tsc 命令解析 tsc 命令概览编译参数说明--declaration--watch 这里是对 tsc 的一个详细介绍 tsc 命令概览 安装 Typescript 后可以使用 tsc 编译 ts 文件,tsc 命令是否支持其它参数 如果需要查看 tsc 支持的命令&#xff0c;或者…...

测试人员简单使用Jenkins

一、测试人员使用jenkins干什么&#xff1f; 部署测试环境 二、相关配置说明 一般由开发人员进行具体配置 1.Repository URL&#xff1a;填写git地址 2.填写开发分支&#xff0c;测试人员可通过相应分支进行测试环境的构建部署 当多个版本并行时&#xff0c;开发人员可以通过…...

使用RecyclerView构建灵活的列表界面

使用RecyclerView构建灵活的列表界面 1. 引言 在现代移动应用中&#xff0c;列表界面是最常见的用户界面之一&#xff0c;它能够展示大量的数据&#xff0c;让用户可以浏览和操作。无论是社交媒体的动态流、商品展示、新闻列表还是任务清单&#xff0c;列表界面都扮演着不可或…...

linux ubuntu安装mysql

在 Ubuntu 上安装 MySQL 的步骤如下&#xff1a; 更新系统软件包列表&#xff1a; sudo apt update 安装 MySQL 服务器&#xff1a; sudo apt install mysql-server 安装完成&#xff0c;可以使用以下命令检查 MySQL 服务器是否正在运行: sudo systemctl status mysql 如果 MyS…...

计算机网络各层的功能以及常用协议

目录 1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 应用层&#xff08;Application Layer&#xff09; 计算机网…...

M. Minimal and Maximal XOR Sum 2023“钉耙编程”中国大学生算法设计超级联赛(7)hdu7359

Problem - 7359 题目大意&#xff1a;给出一个n个数的排列&#xff0c;可以将任意区间内的所有数头尾翻转&#xff0c;每次操作的费用等于区间长度&#xff0c;要求将其变成一个递增排列&#xff0c;求消耗费用的异或和的最小值和最大值 1<n<1e5 思路&#xff1a;操作…...

C++基础篇(五)内存模型及详细示例

目录 一、内存分区模型二、内存分区代码示例三、new 运算符详解 一、内存分区模型 C程序在运行时&#xff0c;将内存分为四个区域&#xff0c;不同的区域赋予不同的生命周期&#xff0c;以提供强大的灵活编程。 代码区&#xff1a;存储程序的二进制代码&#xff0c;通常是只读…...

基于 JMeter API 开发性能测试平台

目录 背景&#xff1a; 常用的 JMeter 类和功能的解释&#xff1a; JMeter 编写性能测试脚本的大致流程示意图&#xff1a; 源码实现方式&#xff1a; (1) 环境初始化 (2) 环境初始化 (3) 创建测试计划 (4) 创建 ThreadGroup (5) 创建循环控制器 (6) 创建 Sampler (…...

HBase-写流程

写流程顺序正如API编写顺序&#xff0c;首先创建HBase的重量级连接 &#xff08;1&#xff09;读取本地缓存中的Meta表信息&#xff1b;&#xff08;第一次启动客户端为空&#xff09; &#xff08;2&#xff09;向ZK发起读取Meta表所在位置的请求&#xff1b; &#xff08;…...

[mongo]应用场景及选型

应用场景及选型 MongoDB 数据库定位 OLTP 数据库横向扩展能力&#xff0c;数据量或并发量增加时候架构可以自动扩展灵活模型&#xff0c;适合迭代开发&#xff0c;数据模型多变场景JSON 数据结构&#xff0c;适合微服务/REST API基于功能选择 MongoDB 关系型数据库迁移 从基…...

linux c語言之crc16错误检测的使用

一、是什么? CRC16是循环冗余校验的一种,是一种根据数据产生校验码的方法。它是一种比较常用的校验算法,可以用于错误检测和纠正等方面。CRC16是16位的校验码,可以检测出32位以内的错误。在通信协议、网络传输等领域中,CRC16被广泛应用. 二、使用步骤 1.引入库 代码如…...

搭建本地开发服务器

搭建本地开发服务器 :::warning 注意 在上一个案例的基础上添加本地开发服务器&#xff0c;请保留上个案例的代码。如需要请查看 Webpack 使用。 ::: 搭建本地开发服务器这一个环节是非常有必要的&#xff0c;我们不可能每次修改源代码就重新打包一次。这样的操作是不是太繁琐…...

linux脚本

程序后台运行&#xff1a; nohup java -jar xxx.jar &>hello.log & 后台运行java-jar命令&#xff0c;并且将日志输出到hello.log文件 防火墙&#xff1a; 开启防火墙&#xff1a;systemctl start firewalld 开放指定端口&#xff1a;firewall-cmd --zonepublic --…...

企升编辑器word编写插件

面向用户群体招投标人员&#xff0c;用统一的模板来编写标书&#xff0c;并最终合并标书。项目经理&#xff0c;编写项目开发计划书&#xff0c;项目验收文档等。开发人员&#xff0c;编写项目需求规格说明书、设计说明书、技术总结等文档。其他文档编写工作量较多的岗位人员。…...

怎么在JMeter中的实现关联

我们一直用的phpwind这个系统做为演示系统, 如果没有配置好的同学, 请快速配置之后接着往下看哦. phpwind发贴时由于随着登陆用户的改变, verifycode是动态变化的, 因此需要用到关联. LoadRunner的关联函数是reg_save_param, Jmeter的关联则是利用后置处理器来完成. 在需要查…...

算法通关村第六关——如何使用中序和后序来恢复一颗二叉树

1 树的基础知识 1.1 树的定义 树(Tree)&#xff1a;表现得是一种层次关系&#xff0c;为 n &#xff08; n ≥ 0 &#xff09; n&#xff08;n≥0&#xff09; n&#xff08;n≥0&#xff09;个节点构成的有限集合&#xff0c;当n0时&#xff0c;称为空树&#xff0c;对于任一…...

leetcode算法题--判断是否能拆分数组

原题链接&#xff1a;https://leetcode.cn/problems/check-if-it-is-possible-to-split-array/ 一开始思路想错了。。导致浪费很多时间 其实只要能找到存在一个子数组&#xff0c;子数组长度为2&#xff0c;这个子数组符合条件就一定能拆分。。 func canSplitArray(nums []i…...

基于Flask的模型部署

基于Flask的模型部署 一、背景 Flask&#xff1a;一个使用Python编写的轻量级Web应用程序框架&#xff1b; 首先需要明确模型部署的两种方式&#xff1a;在线和离线&#xff1b; 在线&#xff1a;就是将模型部署到类似于服务器上&#xff0c;调用需要通过网络传输数据&…...

【资料分享】全志科技T507-H开发板规格书

1 评估板简介 创龙科技TLT507-EVM是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53国产工业评估板,主频高达1.416GHz,由核心板和评估底板组成。核心板CPU、ROM、RAM、电源、晶振等所有器件均采用国产工业级方案,国产化率100%。同时,评估底板大部分元器件亦采用国产…...

2023华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…...

朔州建设机械网站/中国新闻发布

如何解决动态数据表名&#xff0c;动态字段名情况下&#xff0c;由 ibatis 缓存 select 字段而引起的 字段找不到的情况&#xff1f;以下是最简单的解决办法&#xff01; 当使用动态表&#xff0c;动态字段时&#xff0c;会引起字段名的缓存&#xff0c;以下是解决办法。 先看一…...

网站开发要哪些/宁波关键词优化排名工具

python 测量对象的引用个数 sys getrefcount() 测量一个对象的引用计数的方式 import sysclass T:pass t T() sys.getrefcount(t) #输出结果 2&#xff0c;比实际多一次 tt t sys.getrefcount(t) #输出结果 3 del tt sys.getrefcount(t) #输出结果 2 del t sys.getrefcou…...

wordpress 外教 缩略图/网站搭建平台都有哪些

第二章 掌握临界知识的底层思维与方法 跳出"低水平勤奋陷阱"...

网站建设费是什么意思/太原seo计费管理

使用Git时&#xff0c;文件的生命周期如下&#xff1a; 转载于:https://www.cnblogs.com/144823836yj/p/9141260.html...

青岛网站建设东橙品牌设计/新开店铺怎么做推广

#疫情过后最想吃什么#周黑鸭鸭舌帮友们大家好&#xff0c;我是帮主阿涛。可口可乐与百事可乐味道有什么区别&#xff1f;曾经为了研究明白这件事&#xff0c;阿涛每天两罐可乐&#xff0c;最后总结出来可口可乐涩味相对明显&#xff0c;百事可乐口感更甜。不过此事的代价便是体…...

平湖市建设局网站/网站百度收录批量查询

具体详细可参考该篇博文&#xff1a;七、加载数据集 ①准备数据集 以泰坦尼克号数据集(titanic.csv)为例 下载完解压&#xff0c;将解压后得到的压缩包放到指定的路径下&#xff0c;我这边放到了我的jupyter里面了 里面有一些文本信息&#xff0c;仅使用数字信息&#xff…...