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(一)流控篇
前言: 为什么使用Sentinel,这是一个高可用组件,为了使我们的微服务高可用而生 我们的服务会因为什么被打垮? 一,流量激增 缓存未预热,线程池被占满 ,无法响应 二,被其他服务拖…...
哪种模式ip更适合你的爬虫项目?
作为一名爬虫程序员,对于数据的采集和抓取有着浓厚的兴趣。当谈到爬虫ip时,你可能会听说过两种常见的爬虫ip类型:Socks5爬虫ip和HTTP爬虫ip。但到底哪一种在你的爬虫项目中更适合呢?本文将帮助你进行比较和选择。 首先,…...
优维低代码实践:对接数据
优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 优维…...
docker 离线模式-部署容器
有网络的情况下下载需要的镜像 比如(下面以tomcat为例子,其他镜像类似) docker pull tomcat打包镜像文件到本地 docker save tomcat -o tomcat.tar将tomcat.tar 上传到内网服务器(无外网环境) 导入镜像 docker load -i tomcat.tar创建容器…...
MDN-HTTP
参考资料 文章目录 HTTP简介HTTP 和 HTTPSHTTP消息典型的HTTP会话HTTP响应状态HTTP安全HTTP CookieHTTP压缩 HTTP简介 HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络中传输超文本和其他资源的应用层协议。他是互联网的基础协议之一&#x…...
【数据库】PostgreSQL中使用`SELECT DISTINCT`和`SUBSTRING`函数实现去重查询
在PostgreSQL中,我们可以使用SELECT DISTINCT和SUBSTRING函数来实现对某个字段进行去重查询。本文将介绍如何使用这两个函数来实现对resource_version字段的去重查询。 1. SELECT DISTINCT语句 SELECT DISTINCT语句用于从表中选择不重复的记录。如果没有指定列名&…...
笔记本WIFI连接无网络【实测有效,不用重启电脑】
笔记本Wifi连接无网络实测有效解决方案 问题描述: 笔记本买来一段时间后,WIFI网络连接开机一段时间还正常连接,但是过一段时间显示网络连接不上,重启电脑太麻烦,选择编写重启网络脚本解决。三步解决问题。 解决方案&a…...
Java课题笔记~ Spring 概述
Spring 框架 一、Spring 概述 1、Spring 框架是什么 Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。 Spring…...
2022 robocom 世界机器人开发者大赛-本科组(国赛)
RC-u1 智能红绿灯 题目描述: RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的: 路的两旁设置了一个按钮,老年人希望通行马路时会…...
【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块6
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
Typescript]基础篇之 tsc 命令解析
[Typescript]基础[TOC]([Typescript]基础篇之 tsc 命令解析 tsc 命令概览编译参数说明--declaration--watch 这里是对 tsc 的一个详细介绍 tsc 命令概览 安装 Typescript 后可以使用 tsc 编译 ts 文件,tsc 命令是否支持其它参数 如果需要查看 tsc 支持的命令,或者…...
测试人员简单使用Jenkins
一、测试人员使用jenkins干什么? 部署测试环境 二、相关配置说明 一般由开发人员进行具体配置 1.Repository URL:填写git地址 2.填写开发分支,测试人员可通过相应分支进行测试环境的构建部署 当多个版本并行时,开发人员可以通过…...
使用RecyclerView构建灵活的列表界面
使用RecyclerView构建灵活的列表界面 1. 引言 在现代移动应用中,列表界面是最常见的用户界面之一,它能够展示大量的数据,让用户可以浏览和操作。无论是社交媒体的动态流、商品展示、新闻列表还是任务清单,列表界面都扮演着不可或…...
linux ubuntu安装mysql
在 Ubuntu 上安装 MySQL 的步骤如下: 更新系统软件包列表: sudo apt update 安装 MySQL 服务器: sudo apt install mysql-server 安装完成,可以使用以下命令检查 MySQL 服务器是否正在运行: sudo systemctl status mysql 如果 MyS…...
计算机网络各层的功能以及常用协议
目录 1. 物理层(Physical Layer)2. 数据链路层(Data Link Layer)3. 网络层(Network Layer)4. 传输层(Transport Layer)5. 应用层(Application Layer) 计算机网…...
M. Minimal and Maximal XOR Sum 2023“钉耙编程”中国大学生算法设计超级联赛(7)hdu7359
Problem - 7359 题目大意:给出一个n个数的排列,可以将任意区间内的所有数头尾翻转,每次操作的费用等于区间长度,要求将其变成一个递增排列,求消耗费用的异或和的最小值和最大值 1<n<1e5 思路:操作…...
C++基础篇(五)内存模型及详细示例
目录 一、内存分区模型二、内存分区代码示例三、new 运算符详解 一、内存分区模型 C程序在运行时,将内存分为四个区域,不同的区域赋予不同的生命周期,以提供强大的灵活编程。 代码区:存储程序的二进制代码,通常是只读…...
基于 JMeter API 开发性能测试平台
目录 背景: 常用的 JMeter 类和功能的解释: JMeter 编写性能测试脚本的大致流程示意图: 源码实现方式: (1) 环境初始化 (2) 环境初始化 (3) 创建测试计划 (4) 创建 ThreadGroup (5) 创建循环控制器 (6) 创建 Sampler (…...
HBase-写流程
写流程顺序正如API编写顺序,首先创建HBase的重量级连接 (1)读取本地缓存中的Meta表信息;(第一次启动客户端为空) (2)向ZK发起读取Meta表所在位置的请求; (…...
[mongo]应用场景及选型
应用场景及选型 MongoDB 数据库定位 OLTP 数据库横向扩展能力,数据量或并发量增加时候架构可以自动扩展灵活模型,适合迭代开发,数据模型多变场景JSON 数据结构,适合微服务/REST API基于功能选择 MongoDB 关系型数据库迁移 从基…...
文渊智阁:教育智能化的技术革新与实践
在人工智能技术飞速发展的今天,教育智能化已成为推动科研与教学变革的重要力量。湖北文渊智阁互联网科技有限公司(以下简称“文渊智阁”)凭借其深厚的技术积累和创新能力,在教育智能化领域取得了显著成果。本文将深入探讨文渊智阁…...
CANN Ascend C SIMT log10f函数
log10f 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…...
从数据手册到实际电路:手把手教你用ADS1120的SPI接口,避开超时和配置的那些‘坑’
ADS1120实战指南:SPI接口深度优化与异常处理全解析 当你在凌晨三点的实验室里盯着示波器上那串诡异的SPI波形时,或许会想起第一次阅读ADS1120数据手册的那个下午。这款16位ΔΣ ADC以其出色的噪声性能和灵活的配置选项,成为精密测量领域的常客…...
晶振参数深度解读与替代选型实战(55.2MHz 工业级无源晶振案例)
前言作为嵌入式 / 硬件 FAE,日常工作中晶振的参数解读、客户需求替代是高频场景。最近遇到一个典型的工业级宽温晶振客户需求,参数里藏着很多新手容易踩的坑,比如 “负频率” 的误解、负载电容不匹配、宽温范围忽略等问题。本文以客户的55.2M…...
别再死记硬背ELMo、GPT、BERT的区别了!一张图带你搞懂它们的核心差异与适用场景
一图胜千言:ELMo、GPT、BERT技术差异与实战选型指南 刚接触NLP时,我也曾被各种预训练模型绕得头晕眼花——它们看起来都能处理文本,但面试官一问"为什么用BERT不用GPT"就瞬间语塞。直到我把这些模型拆解成汽车零件,才真…...
BGA底部填充胶:嵌入式主控板可靠性设计与工艺全解析
1. 项目概述:为什么BGA底部填充胶是嵌入式主控板的“定海神针”?在嵌入式计算机主控板的设计与生产领域,尤其是那些采用高密度、细间距BGA(球栅阵列)封装芯片的板卡上,有一个工艺环节常常被新手工程师忽略&…...
告别传统打捞船:浅析‘子母船’协同算法如何解决水库、湖泊的浅水区垃圾清理难题
水域清洁革命:子母船协同算法如何重塑浅水区垃圾治理格局 清晨的阳光洒在湖面上,波光粼粼中却漂浮着刺眼的塑料瓶和食品包装——这是全球水库、湖泊管理者每天都要面对的环保噩梦。传统清漂方式在浅水区域显得力不从心,而一种融合了分布式机…...
MH2103(兆讯恒达)兼容替代 GD32F103(兆易创新)
MH2103(兆讯恒达)VS GD32F103(兆易创新)参数对比 & Pin‑to‑Pin 兼容性结论先给核心结论:同封装下,MH2103 与 GD32F103 引脚完全兼容、寄存器高度兼容,可直接 Pin‑to‑Pin 替换࿱…...
用Midas Civil搞定箱梁桥抗倾覆验算:从规范解读到多支座工况的实操避坑
用Midas Civil实现箱梁桥抗倾覆验算的工程实践指南 箱梁桥作为现代交通基础设施的重要组成部分,其抗倾覆稳定性直接关系到桥梁运营安全。2018版《公路钢混及预混桥涵设计规范》(JTG 3362-2018)首次系统性地提出了抗倾覆验算要求,…...
BUUCTF [ZJCTF 2019]NiZhuanSiWei 通关详解:从PHP伪协议到反序列化的三层渗透
1. 题目初探与源码分析 第一次看到这道题的时候,我盯着屏幕上的PHP源码看了足足五分钟。题目给出了一个简单的PHP文件,要求我们通过三个参数来获取flag。这种层层递进的题目设计在CTF中很常见,但每一步都需要仔细思考。 源码的核心逻辑是这样…...


