尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
spring cloud alibaba (4)-sentinel实现容错
0.背景Sentinel 是由阿里巴巴中间件团队开发的开源项目是一种面向分布式微服务架构的轻量级高可用流量控制组件。Sentinel是对 Hystrix的进一步优化和Sentinel的对比如下Sentinel 分为两个部分:核心库Java 客户端 不依赖任何框架/库能够运行于所有 Java 运行时环境同时对 Dubbo / Spring Cloud 等框架也有较好的支持。控制台Dashboard 基于 Spring Boot 开发打包后可以直接运行不需要额外的 Tomcat 等应用容器。1.Sentinel的安装与使用sentinel下载地址https://github.com/alibaba/Sentinel/releases如果上面下载比较慢的话可以用下面的网盘(1) 百度网盘通过网盘分享的文件sentinel-dashboard-1.8.6.jar链接: https://pan.baidu.com/s/1e2EYtHBcCnAjX2y4HuB2GQ?pwdfiae 提取码: fiae2夸克网盘我用夸克网盘给你分享了「sentinel-dashboard-1.8.6.jar」点击链接或复制整段内容打开「夸克APP」即可获取。/50a33b6kh1链接https://pan.quark.cn/s/b3d407a865c9?pwdUBqv提取码UBqv下载后我们来到下载后的目录在这个目录中 shift右击 打开powershell窗口然后输入下面的指令java-jarsentinel-dashboard-1.8.6.jar注意这个jar包用的8080端口其他项目不要占用8080端口。然后浏览器里输入 http://localhost:8080 打开sentinel 窗口。用户名和密码都是sentinel。 登录成功看到下面界面2.创建演示模块我们在原来的项目上单独创建一个新模块用来演示sentinel的功能。我们首先在 父模块引入sentinel!-- sentinel依赖 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactIdversion2021.0.5.0/versiontypepom/typescopeimport/scope/dependency然后我们创建一个新的module命名为sentinel。POM文件参考如下?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIds-cloud-alibaba/artifactIdgroupIdsite.longkui/groupIdversion0.0.1-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdsentinel/artifactIddependencies!--spring boot web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--nacos服务发现--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdexclusionsexclusiongroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId/exclusion/exclusions/dependency!--openfeign --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!--引入sentinel--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency/dependencies/project在resources下创建application.yml文件里面内容参考如下server: port:8400#服务的端口#spring相关配置spring: application: name: service-sentinel#服务的名称cloud: nacos: discovery: server-addr: localhost:8848 sentinel: transport: dashboard: localhost:8080#配置Sentinel dashboard地址#应用与Sentinel控制台交互的端口应用本地会起一个该端口占用的HttpServer,#默认8719端口假如被占用会自动从8719开始依次1扫描,直至找到未被占用的端口port:8719创建主启动类packagesite.longkui;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;EnableDiscoveryClientSpringBootApplicationpublicclasssentinel{publicstaticvoidmain(String[]args){SpringApplication.run(sentinel.class,args);}}创建controller层代码packagesite.longkui.controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/sentinel)publicclassSentinelController{GetMapping(/testA)publicStringtestA(){returnIm testA;}GetMapping(/testB)publicStringtestB(){returnIm testB;}}然后启动模块首先看一下是否在nacos注册成功。然后访问一下我们创建的测试接口 localhost:8400/sentinel/testA然后我们访问sentinel控制台可以看到正常监控3.测试流控规则我们点击 流控规则创建一个新规则。创建成功对于上面出现的内容的解释如下1.资源名 唯一名称默认请求路径表示对该资源进行流控2.针对来源 Sentinel可以针对调用者进行限流填写微服务名默认default不区分来源3.阈值类型/单击阈值 QPS每秒钟的请求数量当调用该api的QPS达到阈值时进行限流 线程数当调用该线程数达到阈值的时候进行限流4.是否集群不需要集群5.流控模式 直接 api达到限流条件时直接限流 关联 当关联的资源达到阈值时就限流自己 链路 只记录指定链路上的流量指定资源从入口资源进来的流量如果达到阈值就进行限流6.流控效果 快速失败 直接失败抛异常 Warm Up 根据codeFactor冷加载因子默认3的值从阈值/codeFctor经过预热时长才达到设置的QPS阈值 排队等待 匀速排队让请求以匀速的速度通过阈值类型必须设置为QPS否则无效关于QPS和线程数的解释QPS是每秒钟的请求数量而线程数是每秒钟的线程数。举个银行的例子银行要受理业务如果按QPS来说就是每秒让1个客户进门受理按线程数来说就是每秒可以让很多客户进门并且办理业务但是银行只开了1个窗口办理业务(1)流控模式—直接我们上面创建的就是 直接模式1秒钟只能访问一次。如果超过阈值则直接快速失败。上面的效果我们首先慢点击一次发现接口正常然后快速点击发现接口失败最后超过1秒点击发现接口又正常了。2流控模式—关联我们把上面的流控规则改为下面这样上面表示当我们访问testA这个接口时如果超过阈值则testB进行限流。效果如下3流控模式—链路链路表示只从某一条路进行控制。比如下面这样。假设我们创建一个CommonService里面有个findGoods方法。controller层里testA和testB都能访问此方法但是我们只对testA方法进行控制和限流。SentinelResource(goods)public voidfindGoods(){System.out.println(找到货物);}service层全部代码packagesite.longkui.service;importcom.alibaba.csp.sentinel.annotation.SentinelResource;importorg.springframework.stereotype.Service;ServicepublicclassCommonService{//默认情况下是不被Sentinel监控的需要我们自己通过注解来标记要监控SentinelResource(goods)publicStringfindGoods(Stringid){return找到货物id;}}controller层改成下面这样packagesite.longkui.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importsite.longkui.service.CommonService;RestControllerRequestMapping(/sentinel)publicclassSentinelController{AutowiredCommonServicecommonService;GetMapping(/testA)publicStringtestA(){StringinfocommonService.findGoods(1);returnIm testA-info;}GetMapping(/testB)publicStringtestB(){StringinfocommonService.findGoods(2);returnIm testB-info;}}然后我们需要修改一下application.yml文件加上下面这样的代码将其配置为 false 即可根据不同的URL 进行链路限流如果不配置将不会生效。web-context-unify:false然后新建 一个规则分别从/sentinel/testA和/sentinel/testB访问goods看下是否进行限制。可以看到/sentinel/testA 接口访问findGoods方法时进行了限流操作直接出现了Whitelabel Error Page而/sentinel/testB接口访问findGoods方法一直刷新的情况下没有出现限流操作。(4)流控效果—warm up上面测试流控模式是结果都是直接失败我们也来测试一下warm up效果。warm up一般指的是 冷/热启动方式或者你理解成高速低速模式就像你在开车一样一开始低速行驶然后突然把油门踩到底那么有可能把车搞坏。正确的做法应该是一步一步提速。我们新建一个接口来测试warm upGetMapping(/testC)publicStringtestC(){System.out.println(newDate());returnIm testC;}然后新建一个规则根据公式我们可以得到开始的阈值是 9/33。也就是1秒3次。然后一开始一秒超过3次就会限流在3秒之内慢慢提升到1秒9次。效果如下可以看到经过3秒余热后再刷新也不能达到1秒9次那接口返回就一直是正常的。(5)流控效果—排队等待排队等待效果会设定 一段时间并发阈值这个方式会严格控制请求通过的间隔时间也就是让请求均匀的通过起到一个整形的作用。我们新增一个流控规则如下上面表示2秒内至多能处理5个请求。我们用接口测试工具间隔100ms一次也就是2秒超过了5次。然后我们看一下后台接口监控情况可以看到在一段时间内的最大峰值就是5。3.测试熔断规则慢调用比例 (SLOW_REQUEST_RATIO)选择以慢调用比例作为阈值需要设置允许的慢调用 RT即最大的响应时间请求的响应时间大于该值则统计为慢调用。当单位统计时长statIntervalMs内请求数目大于设置的最小请求数目并且慢调用的比例大于阈值则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断若大于设置的慢调用 RT 则会再次被熔断。异常比例 (ERROR_RATIO)当单位统计时长statIntervalMs内请求数目大于设置的最小请求数目并且异常的比例大于阈值则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求成功完成没有错误则结束熔断否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0]代表 0% – 100%。异常数 (ERROR_COUNT)当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态HALF-OPEN 状态若接下来的一个请求成功完成没有错误则结束熔断否则会再次被熔断。1测试慢调用比例新建一个熔断规则设置为慢调用比例表示1秒的QPS大于5 并且 这些请求的RT0.1(即最大响应时间) 并且大于比例阈值0.1(10%)的时候触发熔断。且熔断持续2秒。我们每隔100ms请求接口一次查看效果后台监控效果2测试异常比例我们修改测试代码Integerid0;GetMapping(/testC)publicStringtestC(){idid1;if(id5){id0;thrownewRuntimeException(测试异常);}System.out.println(newDate());returnIm testC;}上面的代码表示当id大于5时直接抛出异常然后把id重置为0此时如果没有使用熔断策略那么再次请求这个接口应该是正常返回的但是我们参考下面设置测试异常比例这个表示1秒内超过3秒就会出现异常。并且在达到熔断时长时恢复接口访问。可以看到一开始接口访问正常然后id累计到5开始抛出异常同时id重置为0此时访问页面显示的是Whitelabel Error Page (一闪而过)因为id重置为0的原因此时应该 是访问正常但是我们增加了熔断策略当我们异常比例数据过高时接口开始限流出现Blocked by sentinel。经过熔断时长后接口又可以正常访问了。3异常数异常数表示当单位统计时长内的异常数目超过阈值之后会自动进行熔断。和上面的测试过程没有太大区别一个表示比例一个表示数量。4.测试热点规则参数类型是参数索引对应的类型。比如我们访问/sentinel/testC?id1。这个id就是类型比如常见的int、string等参数值就是对参数的某个值进行参数限流比如nametom表示只对这个tom进行限流其余的不限流。限流阈值在统计时长内超过设定设定值就会被限流。参数索引表示第一个参数默认从下标0开始不考虑参数名字。我们新建一个接口参考如下SentinelResource(testD)GetMapping(/testD)publicStringtestD(RequestParam(name)Stringname){returnIm testD---name;}然后新建一个热点规则其中单机阈值设置10表示testD这个接口不论参数是什么都有一个限制是10在这个基础上分别对两个参数进行限制tom限制阈值是3abc这个参数阈值设置是5。我们分别测试一下可以看到tom和abc分别进行了限制但是ok这个参数没有进行限制。5.系统规则系统保护规则是从应用级别的入口流量进行控制从单台机器的 LOAD、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。如果配置了系统规则所有的接口都会被限流。
RELATED

相关推荐

地质公园网站建设避坑指南:源码下载前必看的5个成本细节

地质公园网站建设避坑指南:源码下载前必看的5个成本细节

地质公园网站建设避坑指南:源码下载前必看的5个成本细节 自己不会代码想做网站,第一反应往往是去网上找【源码下载】,觉得有代码就能跑。但在地质公园这类对合规性、视觉表现力要求极高的项目中,直接套用通用模板或廉价源码,往往导致后期备案受阻、加载…

📅 2026/9/27 9:29:34
网络销售公司经营范围避坑指南与前端最佳实践

网络销售公司经营范围避坑指南与前端最佳实践

网络销售公司经营范围避坑指南与前端最佳实践 网站被黑挂马不知道怎么办?别慌,这种惨痛经历我见过太多。很多老板以为只要服务器安全就行,结果发现根源出在“网络销售公司经营范围”没写全,导致备案审核时埋下隐患,甚至因为业务与资质不符被搜索引擎降权…

📅 2026/9/27 9:24:34
防抖量产实战02:EIS裁切与FOV生死博弈|大广角+强防抖无法共存?揭秘OEM批量翻车的隐形根源

防抖量产实战02:EIS裁切与FOV生死博弈|大广角+强防抖无法共存?揭秘OEM批量翻车的隐形根源

运动相机防抖量产实战(三连专题第二篇) 深耕运动相机OEM量产20年,我敢说一句最真实的量产实话:90%的防抖客诉、验收扯皮、项目返工,全部来自FOV与防抖的矛盾冲突。 几乎所有客户在立项阶段,都会提出两个硬性…

📅 2026/9/27 9:24:34
MORE NEWS

更多资讯

📰

线下攻防 CTF 实战指南:Flag 提交、GameBox 监控与 Patch 防御操作全解

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 线下攻防(Attack & Defense,AWD)是 CTF 线下决赛最常见的赛制&#…

📰

wordpress采集小红书做SEO要多少钱才不踩坑

wordpress采集小红书做SEO要多少钱才不踩坑 找建站公司最怕啥?怕报价虚高,怕技术拉胯,更怕做完网站排名还是零。很多老板问wordpress采集小红书这种需求,到底 多少钱…

📰

STM32 SBUS解析:IDLE中断+DMA循环模式实战指南

1. 为什么SBUS解析不能只靠普通串口中断——从遥控器抖动说起我第一次在飞控项目里接SBUS信号时,用的是最常规的HAL_UART_Receive_IT方式。结果一上电,遥控器油门杆稍微一动,飞控就疯狂报“接收超时”、“帧校验失败”。当时以为是硬件接触不…

📰

UVM Virtual Sequence机制详解:从单接口到系统级协同验证

做验证这几年,但凡接触过UVM,基本绕不开Sequence机制。很多刚入行的朋友能把uvm_do宏用得很溜,单个sequencer驱动一个agent也跑得顺,但一碰到系统级验证、多接口协同仿真的场景,就开始抓瞎了。这时候主角就不再是普通的…

📰

厦门半匙星烘焙教室用预拌面团上曲奇课,学员还能学到什么?

厦门半匙星烘焙教室用预拌面团上曲奇课,学员还能学到什么?厦门思明区莲坂附近的半匙星烘焙教室开设一节 100 分钟的黄油曲奇体验课。每位学员拿到的面团,已经由老师配料并搅拌完成;课上由学员擀面团、压模、烘烤和包装。原料称量、…

📰

2026最新手机网页如何制作:告别模板丑陋,SEO实战指南

2026最新手机网页如何制作:告别模板丑陋,SEO实战指南 还在为模板网站的丑和僵化头疼?很多老板看着网上那些千篇一律的模板,心里直嘀咕:这玩意儿根本没法用,既显不出公司实力,又抓不住用户。 2026年的移动端流量竞争已经卷到了极致,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬