SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控
SpringCloudAlibaba–Sentinel
Sentinel被称为分布式系统的流量防卫兵,是阿里开源流量框架,从服务限流、降级、熔断等
多个纬度保护服务。Sentinel同时提供了简洁易用的控制台,可以看到接入应用的秒级数据,并可以在控制台设置一些规则保护应用。它比Hystrix支持的范围广泛,如Spring Cloud、Dubbo、gRPC都可以整合。集成简单,只需少量的配置和代码就可以完成,容易完成自己定制化的逻辑。
-
资源
是Sentinel最关键的概念,遵循Sentinel API的开发规范定义资源,就能将应用保护起来。 -
而
规则
可以通过控制面板配置,也可以和资源联合起来,规则可以在控制台修改并且即时生效。
名词解释
- 限流:对某个资源的访问数量做限制,不让流量一窝蜂地挤进资源访问
- 降级:即使系统出现问题情况下,也要尽可能提供服务,在可用和完全不可用之间找一个平衡点,如返回友好提示。
- 熔断:是一种资源访问的状态,熔断状态时,直接拒绝所有的访问,返回友好提示
同类产品对比
基础特性 | Sentinel | Hystrix | Resilience4j |
---|---|---|---|
限流 | QPS、线程数、调用关系 | 有限的支持 | Rate Limiter |
注解支持 | 支持 | 支持 | 支持 |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持数据源 |
熔断降级策略 | 平均响应时间、异常比例、异常数 | 异常比例 | 平均响应时间、异常比例 |
控制台 | 配置各种规则 | 简单监控 | 无控制台 |
常用适配框架 | Servlet、SpringCloud、Dubbo、gRPC | Servlet、Spring CloudNetflix | SpringBoot、Cloud |
Resilience4j在国外使用较多,而Hystrix框架已经停止更新进入维护了。
下载和运行
按照笔者之前的笔记,SpringCloudAlibaba是选择的2021.0.4.0
版本的,那么可以看下它们之间的版本对应关系
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
选择这个1.8.5
版本即可,到sentinel的下载页面选择即可https://github.com/alibaba/Sentinel/releases
下载完毕后的jar包启动即可
java -jar sentinel-dashboard-1.8.5.jar
默认的端口是8080
,如需更改命令行添加即可
java -jar -Dserver.port=9090 sentinel-dashboard-1.8.5.jar
启动后,打开http://localhost:8080/,账号和密码都是sentinel
进入后发现没有任何的资源可以进行规则控制。sentinel是采用的懒加载的方式,当使用时才会进行加载。
集成Sentinel
生产者
项目中引入依赖
<dependencies><!-- 服务注册 服务发现需要引入的 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--健康监控--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--SpringBoot web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--sentinel依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency></dependencies>
bootstrap.yml
中做配置
server:port: 8002
spring:application:name: provider # 应用名cloud:nacos:discovery:server-addr: localhost:8848 # nacos服务地址sentinel:transport:port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描dashboard: 127.0.0.1:8080 # 仪表版访问地址
java controller做个资源
@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {@RequestMapping("/test")public String test() {return "sentinel-provider8002 test()" + RandomUtils.nextInt(0, 1000);}
}
消费者
同生产者引入依赖,做好配置,再到controller做个资源
使用RestTemplate+Ribbon做远程调用,添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
javaConfig配置
@Configuration
public class GenericConfiguration { // 常规配置类@LoadBalanced // 标注此注解后,RestTemplate就具有了客户端负载均衡能力@Beanpublic RestTemplate restTemplate(){ // 创建RestTemplate,并交个Spring容器管理return new RestTemplate();}
}
@RestController // @RestController注解是@Controller+@ResponseBody
public class TestController {private final String SERVER_URL = "http://provider";@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/test")public String test() {return restTemplate.getForObject(SERVER_URL + "/test", String.class);}@RequestMapping("/sentinelTest")public String sentinelTest() {return "sentinel-consumer9001 sentinelTest" + RandomUtils.nextInt(0, 1000);}}
完成后,启动项目调用生产者的test
接口,然后到sentinel控制台。
curl localhost:9001/test
==> sentinel-provider8002 test()599
两个服务都出现在了控制台上。
Sentinel常用控制规则
我们需要对接口进行压测,所以使用jmeter吧,到jmter官方下载即可。
流控规则
流控主要是设置QPS或线程数等参数保护应用,针对某个资源的设置,下面操作sentinel控制台设置一些规则。
注意:要先调用接口后,才能添加规则(s加载)
QPS–直接–快速失败
QPS:(Query Per Second)指每秒可处理的请求数
在簇点链路–>列表视图–>到/sentinelTest
资源点击流控
,阈值选择QPS
,单机阈值1
,新增。
打开jmeter压测:
查看执行结果
10个请求也就两个成功了,其他都被限流了,直接blocked
QPS–直接–WarmUp
数据预热,即初始请求QPS等于阈值/codeFactor,codeFactor默认值3,经过预热时长1s后单机阈值变为100
压测数量100
看结果
前期接口正常返回,当访问量越来越多时,请求QPS=codeFactor(3)时,其他访问直接回绝,经过1s的预热,QPS变成了100后,后面的的所有请求全部正常访问。
QPS–直接–排队等待
让请求全部均匀访问通过,如果请求量超过阈值就等待,若等待超时就返回失败。
虽然QPS单机阈值是1,但是我们的超时时间为15s
,所以等得起访问全部成功。
QPS–关联–快速失败
如果访问B接口到达了阈值,那么就让A接口返回失败。适用于资源之间有资源竞争或依赖关系。
再写一个接口sentinelTestB
@RequestMapping("/sentinelTestB")
public String sentinelTestB() {return "sentinel-consumer9001 sentinelTestB" + RandomUtils.nextInt(0, 1000);
}
设置规则,要注意当我们重启项目后,这些接口需要重新访问一遍才会出现在sentinel的簇点链路中
jmter不停访问/sentinelTestB
,让B接口超过达阈值,然后在去调用/sentinelTest
时直接回绝访问
因为sentinelTestB是没有做流控的,所以请求都是成功的,但是因为访问B接口的请求数是超过QPS阈值的,那么A接口则直接失败。
curl localhost:9001/sentinelTest
Blocked by Sentinel (flow limiting)
线程数–直接
限制处理请求的业务线程数,达到阈值就限流
可以看到很多请求都被限流了,这个跟服务器的配置有关,当服务器的配置较好时,可以适当将阈值设置的高一些,保证资源的访问情况。
控制台几个关键词
- 资源名:就是接口的资源,名称唯一即可
- 针对来源:此资源对调用者进行限流,默认defatult,对所有客户端限流;可填写调用者的
spring.application.name
指定对某个客户端进行限流。 - 阈值类型:QPS:每秒能接受的请求数量,线程数:能够使用的业务线程数(服务器内部的线程数)
- 流控模式:
- 直接:达到条件,直接执行某个流控效果
- 关联:如果关联资源达到条件,直接限流自身
- 链路:记录从入口资源的流量,达到条件也只限流入口资源
- 流控效果:
- 快速失败:达到条件,直接返回失败
- WarmUp:预热,给一个缓冲时间,缓慢增加阈值
- 排队等待:让系统匀速处理请求,其他请求进入等待,超时后未被处理的请求直接返回失败
相关文章:

SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控
SpringCloudAlibaba–Sentinel Sentinel被称为分布式系统的流量防卫兵,是阿里开源流量框架,从服务限流、降级、熔断等多个纬度保护服务。Sentinel同时提供了简洁易用的控制台,可以看到接入应用的秒级数据,并可以在控制台设置一些…...
mybatis - no getter for property,以及@JsonIgnore
There is no getter for property named user_full_name in class com.book.erp.entity.user.QueryUser Mybatis 配置错误,XML配置文件有Java对象以及数据库字段,配置时需要小心 user_full_name是数据库字段,不需要有get 和 set方法…...
云原生周刊:K8s v1.28 中的结构化身份验证配置
开源项目推荐 KubeLinter KubeLinter 是一种静态分析工具,用于检查 Kubernetes YAML 文件和 Helm 图表,以确保其中表示的应用程序遵循最佳实践。 DB Operator DB Operator 减轻了为 Kubernetes 中运行的应用程序管理 PostgreSQL 和 MySQL 实例的痛苦…...

支持向量机概述
支持向量机在深度学习技术出现之前,使用高斯核的支持向量机在很多分类问题上取得了很好的结果,支持向量机不仅用于分类,还可以用于回归问题。它具有泛化性能好,适合小样本和高维特征的优点。 1. SVM引入 1.1支持向量机分类 支持向量机的基本模型是定义在特征空间上的间隔…...
安装x265
一、编译libx265源码 libx265是用CMAKE编译的,故先下cmake,我是centos系统,命令: yum install cmake -y进入目录./x265_1.9/build/linux/下,执行脚本: sh make-Makefiles.bash选择好之后,输入…...
设计模式-观察者模式
一.观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern&…...

K8s使用Ceph作为后端存储
Ceph概述 部署Ceph集群 Ceph存储使用 Pod使用Ceph持久化数据 Ceph监控 Rook部署Ceph 1❖ Ceph概述 Ceph介绍 Ceph架构 Ceph核心概念 Ceph介绍 Ceph是一个开源的分布式存储系统,具有高扩展性、高性能、高可靠性等特点,提 供良好的性能、可靠性和可扩展…...

hive整合es,详细过程。
参考官网 Apache Hive integration | Elasticsearch for Apache Hadoop [7.17] | Elastic 官网的介绍很简单,我看了很多博客,写的也很简单,但是我搞了半天才勉强成功,分享下,免得各位多走弯路。 环境准备 官网也很…...

vue中tab隐藏display:none(v-show无效,v-if有效)
目录 背景 原因:display: table-cell>display:none 解决: 方法A.获取元素设置display(适用于 简单场景) 方法B.自定义tabs (适用于 复杂场景) 背景 内联样式(style“ ”) /this.$…...

2023年进阶测试,从接口测试到接口自动化测试总结,一篇彻底打通...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 json模块的使用 …...

客户支持工具从被动到主动的演变
在当日新月异的商业环境中,企业需要适应不断增长的客户需求,优质的客户支持变得越来越重要。客户支持工具从传统系统到尖端 AI驱动解决方案的演变具有变革性,增强了主动和无缝的支持体验。所以,使用正确的客户服务工具很重要&…...

网络安全行业相关证书
一:前言 对于考证这个话题,笔者的意见是:“有比没有好,有一定更好,但不一定必须;纸上证明终觉浅,安全还得实力行”。很多人对于各种机构的考证宣传搞得是云里雾里,不知道网络安全行业…...

[内网渗透]SUID提权
文章目录 [内网渗透]SUID提权0x01.什么是SUID?0x02.如何设置SUID?0x03.查找属主为root的SUID文件0x04.进行SUID提权1.find提权2.vim/vi/vim.tiny 以root权限修改文件3.bash提权4.less/more执行系统命令5.nano以root权限修改文件6.awk执行系统命令7.cp以r…...
clang 编译器前端 分析
clang 编译器前端 分析 clang的python接口教程(二) Python接口clang解析C语言AST抽象语法树 clang static analyzer源码分析 clang静态代码分析是clang相对于gcc一个比较能够引起关注的点,特别是clang静态代码分析基于checker的架构和大部…...
3个月精通Python(基础篇)——第1天:Python和Vscode环境安装
安装 Python: 访问 Python 官网 下载 ,下载最新的 Python 安装程序。 双击安装程序,按照提示进行安装设置即可。 在安装过程中,请勾选“Add Python X.X to PATH”选项,这样安装后 Python 会被自动添加到系统的环境变量…...
react native web RN webpack nginx 部署
# nginx配置 location /app {root html;index index.html;# url 切换时始终返回index.htmltry_files $uri /app/index.html; } # 图片样式缓存1年 location ~* /app.*\.(js|css|png|jpg)$ {access_log off;expires 365d; } # html/xml/json 文件不缓存 location ~* /app.…...
Jmeter性能测试之Beanshell解析并提取json响应
1:前置条件 将fastjson-1.2.49.jar包置于jmeter的lib目录下,并将该jar包添加到测试计划的Library中;否则会报:Typed variable declaration : Class: JSONObject not found in namespace的错误 2:解析思路 利用beansh…...

vue-echarts配置项详解
起因 最近接手了一个vue3项目,echarts用的是"vue-echarts": “^6.0.0”,每次查看文档的时候痛苦不已,找一个配置要花费大量时间,所以这篇文章,主要就是为了记录比较常见的一些配置。 主要会写三种图的配置…...

两个csv进行根据相同字段进行合并
源文件,第一列,编号0 目标文件, 编号3 根据社区名称进行匹配,然后将第一个csv文件的经纬度添加到第二个文件中。 import csvsource r"D:\000datasets\链家房价数据\2020去重后社区名称地理编码.csv" target r"…...

SolidWorks绘制Maxwell仿真用带桥接的三维平板螺旋线圈
文章目录 前言一、建立涡状线二、拉伸方法1(建立工作面,较复杂)三、拉伸方法2(穿透,较简单)四、建立桥接 前言 在使用Maxwell进行电磁场仿真时,经常需要绘制各种异形线圈,由于Maxwel…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...