大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Sentinel的控制台,在可视化界面进行配置,我们把这些保护策略可以称为规则,配置的这些保护规则也可以存储到Zookeeper、Nacos等等具有配置中心功能的中间件中,而且Sentinel还配置了多种微服务架构,比如SpringCloud、Dubbo等,如下图所示:
我们可以看一下Sentinel的工作原理,加上分布式系统中有很多微服务,每个微服务中都有很多资源需要我们进行保护,什么是资源呢,其实万物皆可为资源,它可以是一个HTTP请求,也可以是一个远程调用,或者是一段业务逻辑代码,也可以是访问数据库的一些方法,每个应用都有非常多的资源,我们只需要引入Sentinel客户端,这些客户端就可以连上Sentinel的控制台,在Sentinel控制台里面可以对每一种资源的规则进行定义,比如限流规则,熔断降级规则,黑白名单等等,当然这些规则一般由运维人员进行定义,定义的这些规则可以存储到Nacos、Zookeeper等这些配置中心,当然存在内存也没问题,只不过重启就失效了,而且如果这些规则发生了变更,Sentinel控制台还可以实时把这些规则推送给每个微服务,这样我们每次访问资源的时候,Sentinel客户端就会来检测每种资源的规则,然后判断是不是违背这些规则,如果没有违背则放行,如果违背就拒绝服务,通过这种手段来保护系统的稳定性,架构原理图如下:
在这个图里面和我们编码相关的就两个,一个是资源,一个是规则。
而使用Sentinel想要定义一个资源也非常简单:
定义好了资源,就需要在Sentinel的控制台来定义保护这些资源的规则,Sentinel提供了上面的规则,第一种流量控制,就是我们常说的限流,比如请求量一大,如果我们把所有请求都接收过来在后台进行处理,有可能导致这个微服务所在的机器资源耗尽,所以可以对请求进行限流,比如每秒只允许通过100个请求,超出的请求全部拒绝掉,这样的话,即使上万并发,后台也只处理100个,不至于后台崩了。第二种规则叫熔断降级,这就是防服务雪崩的,而且在OpenFeign的时候也演示了一旦远程调用失败去走兜底数据。第三种规则叫系统保护,可以根据当前机器是CPU负载、内存使用率,看到CPU太忙了,可以限制请求流量进入。第四种规则叫来源访问控制,只允许哪些上游来访问下游资源。第五种规则叫定义热点参数,这个后面细说。
总之一句话,想要使用Sentinel,你要想清楚要保护哪些资源,这些资源怎么找到,是通过自动适配发现的还是通过编程定义的还是声明式的。有了这些资源后,再定义各种保护规则,当这两个定义好后,Sentinel就可以进行工作了。
它的工作原理是,用户去来访问一个资源,比如访问一个HTTP请求,假设就是创建订单,而这些资源我们给它定义了一个规则,每次访问的时候Sentinel就会检查这些规则,假设我们定义一个流量控制规则,每秒只能通过一个请求,对于这个规则的检查就会出现两种情况,是否违法了这些规则,如果没有违法这次请求就放行,如果违反了这些规则,Sentinel就会抛出异常,对于这个异常我们就要进行针对性的处理,这就要看我们有没有编写兜底处理的方法,如果没有就抛出错误,如果编写了兜底处理,比如OpenFeign的fallback兜底回调,就会返回兜底数据。详细流程如下图:
通过这个原理图我们知道,在Sentinel的使用中我们关注三点,第一点怎么定义一个资源,第二点定义资源的保护规则,第三点一旦违反了规则,怎么处理异常。
整合-基础场景
先做第一步,启动一个Sentinel Dashboard控制台,方便我们在控制台定义控制资源的一些规则,在官网下载sentinel-dashboard-1.8.8.jar ,然后启动 sentinel-dashboard:
启动后访问:
默认账号和密码都是sentinel。
因为还没有任何微服务接入sentinel,所以在控制台里面没有显示任何数据,接入后就会有所有的微服务列表。
第二步,给微服务整个sentinel场景,并配置链接上sentinel控制台,那这个应用的所有资源,通过注解或代码埋点的这些资源,都可以在控制台定义它们的规则。
我们之前在学习OpenFeign的时候,由于已经整合了sentinel,只不过当时sentinel依赖只放到了order里面,由于每个微服务都需要被保护起来,所以我们直接在services里面统一引入sentinel依赖。引入好依赖,这样每个微服务都需要配置连接上sentinel控制台,我们在order配置文件中配置连接sentinel的地址:
由于sentinel默认用的是懒加载机制,整合之后,只有我们访问了请求,控制台才能显示出应用的信息,所以为了方便起见,可以让它提前加载,在sentinel配置中把eager设置为true,就可以项目一启动,自动连上sentinel控制台:
spring:cloud:openfeign:client:config:default:logger-level: fullconnect-timeout: 1000read-timeout: 2000service-product:logger-level: fullconnect-timeout: 3000read-timeout: 5000sentinel:transport:dashboard: localhost:8080eager: true
# response-interceptor:
# com.example.order.interceptor.XTokenRequestInterceptor
# retryer: feign.retryer.Defaultfeign:sentinel:enabled: true
每个服务都配置好即可。
然后我们启动订单和商品两个微服务。首先看它们能不能连上sentinel控制台,将自己的应用信息正确显示,启动后刷新控制台:
这样在这个控制台里面就可以配置很多的规则,但是这些规则都是对资源配置的,那什么是资源呢?我们一起来看看它的默认行为,它把系统所有web接口都认为的资源,包括openfeign的远程调用也认为的一个资源,或者我们用注解和编程的方式都可以定义资源,那么接下来就以创建订单为例,由于创建订单是一个web请求,所以谁来发送web请求,会走创建订单服务,创建订单服务里面又会远程调用查询商品,假设认为创建订单这个方法是一个资源,我将来想保护它,对它进行一些流控等一些设置,那么可以用最简单的方式,使用一个注解叫@SentinelResource(value = “createOrder”)
重新启动订单服务,然后发送一个创建订单的请求:
在sentinel控制台有个簇点链路就会看到这个调用过程:
首先我们发送了一个create请求,它认为create是一个资源,create里面又调用了createOrder,它认为这个也是一个资源,这个资源是我们通过注解定义的,而create请求是sentinel自动勘测的一个web接口,而在createOrder里面又调用了商品的接口,也是可以被控制的资源。只要有了这些资源,我们可以对任意资源进行控制各种规则,我们先来测试流控:
点击新增后就可以在流控规则中看到了:
我们先测试一下,如果刷慢一点,每秒访问一个,发现都正常:
如果我刷新快一点,就返回一个默认错误:
异常处理-web接口
从上面可以看到sentinel每秒只会放行1个请求,放行的请求才会执行目标方法的创建订单,而被阻塞的请求,目标方法是不会被执行的,这样就不会占用系统资源,即使高并发的请求,只有少量的目标方法执行,那就不会导致服务雪崩的问题,但是现在还有一个问题,如果一旦请求被限制后,返回的是默认sentinel错误提示页,而我们一般大型的系统都是前后分离的,后台微服务要给前端返回json数据,这就牵扯到sentinel的异常处理机制,在sentinel里面异常处理是一个比较复杂的流程,
如果我们想要改掉默认的web页面显示的异常信息,就要自定义一个BlockExceptionHandler,我们先来解决web接口的异常处理方式。我们自己写一个BlockExceptionHandler,只要把它放到容器中就可以生效:
我们先在model模块中自定义一个通用的返回对象R:
package com.example.common;import lombok.Data;@Data
public class R {private Integer code;private String msg;private Object data;public static R ok() {R r = new R();r.setCode(200);return r;}public static R ok(String msg, Object data) {R r = new R();r.setCode(200);r.setMsg(msg);r.setData(data);return r;}public static R error() {R r = new R();r.setCode(500);return r;}public static R error(Integer code, String msg) {R r = new R();r.setCode(
相关文章:

大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...

DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门
1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second,每秒浮点运算次数,用来衡量硬件性能。 FLOPs:floating point of operations,是浮点运算次数,用来衡量算法、模型的复杂度。 GFLOPSÿ…...

SprutCAMX16数控软件介绍
SprutCAM X 16 是一款功能强大的CAM(计算机辅助制造)软件,专为数控机床编程和制造过程优化设计。它广泛应用于机械加工、模具制造、3D打印等领域,支持多轴加工、车铣复合、机器人加工等多种加工方式。以下是SprutCAM X 16的主要特…...

Miniconda + VSCode 的Python环境搭建
目录: 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接:Visual Studio Code - Code Editing. Redefined 下载得到:,双击安装。 安装成功…...
TRELLIS 部署笔记
目录 依赖项安装 kaolin安装: 安装和运行报错解决 u2net.onnx 下载 解决方法,就是自行下载,然后拷贝到目录/root/.u2net bash测试u2net: 报错GaussianRasterizationSettings.__new__() got an unexpected keyword argument…...

深入解析Qt事件循环
在Qt开发中,QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作?为何耗时操作会导致界面冻结?本文将以事件循环为核心,揭示Qt高效运转的底层逻辑,探讨其设计哲学与最…...

Visual Studio Code 集成 Baidu Comate
文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…...

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件
PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件,以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性,如颜色、字体大小、样式和粗细。…...
Kafka消息服务之Java工具类
注:此内容是本人在另一个技术平台发布的历史文章,转载发布到CSDN; Apache Kafka是一个开源分布式事件流平台,也是当前系统开发中流行的高性能消息队列服务,数千家公司使用它来实现高性能数据管道、流分析、数据集成和关…...
迪威模型网:免费畅享 3D 打印盛宴,科技魅力与趣味创意并存
还在为寻找优质3D打印模型而发愁?快来迪威模型网(https://www.3dwhere.com/),一个集前沿科技与无限趣味于一体的免费3D打印宝藏平台! 踏入迪威模型网,仿佛开启一场未来科技之旅。其“3D打印”专区ÿ…...
ECharts极简入门
ECharts 是一个基于 JavaScript的开源可视化图表库,广泛应用于数据可视化的场景中,支持多种图表类型,如柱状图、折线图、饼图、散点图、雷达图等,且具有强大的自定义功能。 1. ECharts 基本使用 首先需要引入 ECharts 库…...

PHP培训机构教务管理系统小程序源码
🔑 培训机构教务管理系统——智慧教育,高效管理新典范 🚀 这款教务管理系统,是基于前沿的ThinkPHP框架与Uniapp技术深度融合,匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙,专为…...

JAVA学习第五天
接口的变量定义固定为静态变量 接口里面只能有抽象方法,且不能有构造方法 如果不重写tostring方法,会打印没有价值的信息...
pnpm和npm安装TailwindCss
npm下载及初始化来自Tailwind官方文档 npm下载: npm install -D tailwindcss npm初始化Tailwind: npx tailwindcss init pnpm下载: pnpm add -D tailwindcss3.4.1 postcss autoprefixer pnpm初始化Tailwind: pnpm exec tailwindc…...

【云安全】云原生-K8S(四)安全问题分析
Kubernetes(K8S)因其强大的容器编排能力成为了云计算和微服务架构的首选,但同时也带来了复杂的安全挑战。本文将概述K8S的主要安全问题,帮助安全工程师理解潜在威胁,并采取相应的防护措施。 K8S 攻击面概览 下面两张…...

Cloud之快照存储(Cloud Snapshot Storage)
Cloud之快照存储 一、什么是快照 1. 快照的定义 快照(Snapshot)是一种记录某一时刻数据状态的技术。在计算机存储和虚拟化环境中,快照能够将文件系统或虚拟机的状态保存下来,以便以后能够回溯到某一特定时间点。快照通常用于备…...
cs106x-lecture11(Autumn 2017)-SPL实现
打卡cs106x(Autumn 2017)-lecture11 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) 1、diceRolls Write a recursive function named diceRolls accepts an integer representing a number of 6-sided dice to roll, and output all possibl…...

负载均衡集群( LVS 相关原理与集群构建 )
目录 1、LVS 相关原理 1.1、LVS集群的体系结构以及特点 1.1.1 LVS简介 1.1.2 LVS体系结构 1.1.3 LVS相关术语 1.1.4 LVS工作模式 1.1.5 LVS调度算法 1.2 LVS-DR集群介绍 1.2.1 LVS-DR模式工作原理 1.2.2 LVS-DR模式应用特点 1.2.3 LVS-DR模式ARP抑制 1.3 LVS – NA…...

【分布式】Hadoop完全分布式的搭建(零基础)
Hadoop完全分布式的搭建 环境准备: (1)VMware Workstation Pro17(其他也可) (2)Centos7 (3)FinalShell (一)模型机配置 0****)安…...

基于Java+Swing+Mysql实现人事管理信息系统
基于JavaSwingMysql实现人事管理信息系统 一、系统介绍二、功能展示1.用户登陆2.用户注册3.员工信息添加、删除4.员工信息查询、修改5.部门管理6、员工考核 三、数据库四、其它1.其他系统实现五.获取源码 一、系统介绍 系统功能:用户登陆、用户注册、员工信息添加、…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...