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

[Spring] Sentinel详解

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (93平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(97平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(95平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482
🐰RabbitMQ(97平均质量分) https://blog.csdn.net/2301_80050796/category_12792900.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 服务雪崩
  • 2. 微服务保护
    • 2.1 服务保护方案
      • 2.1.1 请求限流
      • 1.1.2 线程隔离
      • 1.1.3 服务熔断
    • 1.2 Sentinel
      • 1.2.1 介绍和安装
      • 1.2.2 微服务整合
    • 1.3 请求限流
    • 1.4 线程隔离
      • 1.4.1 OpenFeign整合Sentinel
      • 1.4.2 配置线程隔离
    • 1.5 服务熔断
      • 1.5.1 编写降级逻辑
      • 1.5.2 服务熔断l

1. 服务雪崩

在微服务远程调用的过程中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户.如果此时商品服务查询发生故障,查询购物车列表在调用商品服务时,也会发生异常,从而导致购物车查询失败.
还有级联失败问题:
还是查询购物车的业务,加入商品服务业务并发较高,占用过多的Tomcat连接,可能会导致商品服务的所有接口响应时间增加,延迟变高,甚至是长时间的阻塞至查询失败.
此时查询购物车业务需要查询并等待商品查询结果,从而导致查询购物车列表业务的响应时间也变长,甚至也阻塞直至无法访.。而此时如果查询购物车的请求较多,可能导致购物车服务的Tomcat连接占用较多,所有接口的响应时间都会增加,整个服务性能很差, 甚至不可用.
在这里插入图片描述
以此类推,整个微服务中与购物车服务,商品服务等有调用关系的服务可能都会出现问题,最终导致整个集群不可用.
在这里插入图片描述
这就是级联失败问题,或者叫雪崩问题.那么如何解决上述问题呢?我们接下来就给出解决的方案.

2. 微服务保护

保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护,这章我们就一起来学习一下微服务保护的常见方案已经应对技术.

2.1 服务保护方案

微服务保护的方案有很多,比如:

  • 请求限流
  • 线程隔离
  • 服务熔断

这些方案或多或少都会导致服务的体验略有下降,比如请求限流,降低了并发上限,线程隔离,降低了可用资源的数量,服务熔断,降低了服务的完整度,部分服务变得不可用或者弱可用.因此这些方案都属于降级的方案,但通过这些方案,服务的健壮性得到了提升.
接下来,我们就逐一了解这些方案的原理.

2.1.1 请求限流

服务故障的最重要原因就是并发太高,为了解决这个问题,就能避免大部分的故障,当然,接口的并发不是一直很高,而是突发的.因此请求限流,就是限制或控制接口的并发访问量,避免服务因为流量激增而出现故障.
请求限流往往会有一个限流器,数量高低起伏的并发请求曲线,经过限流器就变得非常平稳.
在这里插入图片描述

1.1.2 线程隔离

当一个业务接口响应时间过长,而且并发高时,就可能耗尽服务的线程资源,导致服务内的其他接口受到影响,所以我们必须把这种影响降低,或者缩减影响的范围,线程隔离正是解决这个问题的好办法.
线程隔离的思想来自轮船的舱壁模式:
在这里插入图片描述
轮船的船舱会被隔板分割为N个相互隔离的密闭舱,加入轮船触礁进水,只有损坏的部分密闭仓会进水,而其他仓由于相互隔离,并不会进水,这样就把进水控制在了部分船体,避免了整个船仓进水而整体沉没.
为了避免某个接口故障或者压力过大导致导致了整个服务不可用,我们可以限定每个接口可以使用的资源范围,也就是将其"隔离"起来.
在这里插入图片描述
如图所示,我们给查询购物车业务限定可用线程数量上限为20,这样即便查询购物车的请求因为查询商品服务而出现故障,也不会导致服务器的资源被耗尽,不会影响到其他的接口.

1.1.3 服务熔断

线程隔离虽然避免了雪崩问题,但是故障服务(商品服务)依然会拖慢购物车服务(服务调用方)的接口响应速度,而且商品查询依然会导致查询购物车功能出现故障,购物车业务也变得不可用了.
所以我们需要做两件事情:

  • 编写服务降级逻辑: 就是服务方调用失败后的处理逻辑,根据业务场景,可以抛出异常,也可以返回友好提示或者默认数据.
  • 异常统计和熔断: 统计服务提供方的异常比例,当比例过高表明该接口会影响到其他服务,应该拒绝调用该接口,而是直接走降级逻辑.
  • 在这里插入图片描述

1.2 Sentinel

微服务保护的技术有很多,但是在国内使用较多的还是Sentinel,所以接下来我们学习Sentinel的使用.

1.2.1 介绍和安装

Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站:
https://sentinelguard.io/zh-cn/,为了方便监控微服务,我们需要先把Sentinel的控制台搭建出来.

  1. 首先下载jar包:
    https://github.com/alibaba/Sentinel/releases
    在这里插入图片描述

  2. 启动: 将jar包放在任意中文,不包含特殊字符的目录之下,重命名为sentinel-dashboard.jar

在这里插入图片描述
然后运行如下的命令启动控制台:

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
  1. 访问
    访问http://localhost:8090/
    在这里插入图片描述

需要输入账号和密码,默认都是:sentinel
登录之后,即可看到控制台,默认会监控sentinel-dashboard服务本身:
在这里插入图片描述

1.2.2 微服务整合

  1. 在想要引入限流的微服务某块引入Sentinel依赖
<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  1. 配置控制台
    修改application.yml文件,添加下面的内容:
spring:cloud: sentinel:transport:dashboard: localhost:8090
  1. 访问引入该微服务的任意端点
    Sentinel的客户端会将服务访问的信息提交到Sentinel-dashboard控制台,并展示出统计信息:
    在这里插入图片描述
    点击簇点链路菜单,就是单机调用链路,是一次请求进入服务后经过的每一个被Sentinel监控的的资源,默认情况下,Sentinel会监控SpringMVC的每一个接口.
    因此,我们看到/carts这个接口路径就是其中一个簇点,我们可以对其进行限流,熔断,隔离等保护措施.
    不过需要注意的是,我们的SpringMVC接口是按照Restful风格设计,因此购物车的查询,删除,修改等接口全部都是/carts路径:
    在这里插入图片描述
    默认情况下Sentinel会把路径作物簇点资源的名称,无法区分区分路径相同但是请求方式不同的接口,查询,删除,修改等都被识别为一个簇点资源,这显然是不合适的.
    首先,在cart-service的application.yml``中添加下面的配置:
spring:cloud:sentinel:transport:dashboard: localhost:8090http-method-specify: true # 开启请求方式前缀

然后重启服务,通过页面访问购物车的相关接口,可以看到Sentinel控制台的簇点链路发生了变化:

在这里插入图片描述

1.3 请求限流

在簇点链路后面点击留空按钮,可以对其做限流配置:
在这里插入图片描述
在弹出的菜单中可以这样填写:
在这里插入图片描述
这样就把查询购物车列表这个簇点资源的流量限制在了每秒6个,也就是QPS最大为6.
我们利用了Jemeter做限流测试,我们每秒发出10个请求:
在这里插入图片描述
最终监控结果如下:
在这里插入图片描述
可以看得出get:/carts这个接口的通过QPS稳定在6附近,而拒绝的QPS稳定在4附近,符合我们的预期.

1.4 线程隔离

限流可以降低服务器的压力,减少引并发流量引起的服务故障的概率,但是不能完全避免服务故障,但某个服务出现故障,我们必须隔离对这个服务的调用,避免发生雪崩.
比如,查询购物车的时候需要查询商品,为了避免因商品服务出现故障导致导致购物车服务级联失败,我们可以把购物车业务中查询商品的部分隔离起来,限制可用的线程资源:

在这里插入图片描述
这样即便商品服务出现了故障,最多导致查询购物车的业务故障,并且可用的线程资源也被限定在一定的范围之内,不会导致整个购物车服务崩溃.
所以我们要对查询商品的FeignClient接口做线程隔离.

1.4.1 OpenFeign整合Sentinel

修改cart-service模块的application.yml文件,开启Feign的Sentinel功能:

feign:sentinel:enabled: true # 开启feign对sentinel的支持

需要注意的是,默认情况之下SpringBoot项目的Tomcat最大线程数是200,允许的最大连接是8492,单机测试很难打满.
所以我们需要配置一下cart-service模块的application.yml文件,修改Tomcat连接:

server:port: 8082tomcat:threads:max: 50 # 允许的最大线程数accept-count: 50 # 最大排队等待数量max-connections: 100 # 允许的最大连接

然后重启car-service服务,可以看到查询商品的FeignClient自动变成了一个簇点资源:
在这里插入图片描述

1.4.2 配置线程隔离

接下来,点击查询商品的FeignClient对应的簇点资源后面的流控按钮:
在这里插入图片描述
在弹出的表单中填写下面内容:
在这里插入图片描述
注意,这里勾选的时并发线程数限制,也就是说这个查询功能最多使用5个线程,而不是5QPS.如果查询商品的接口每秒处理2个请求,则5个线程的实际QPS在10左右,而超出的请求自然会被拒绝.

在这里插入图片描述
我们使用Jemeter测试,每秒发送100个请求:
在这里插入图片描述
最终测试接口如下:
在这里插入图片描述
进入查询购物车的请求每秒在100,而在查询商品时却只剩下每秒100左右,符合我们的预期.
此时如果我们通过页面访问购物车的其他接口,例如添加购物车,修改购物车商品数量,发现不受影响:
在这里插入图片描述
响应时间非常短,这就证明线程隔离起到了作用,尽管查询购物车这个接口并发很高,但是它能使用的线程资源被限制了,因此会不会影响到其他的接口.

1.5 服务熔断

在上一个章节,我们利用了线程隔离对查询购物车业务进行了隔离,保护了购物车服务的其他接口,由于查询商品的功能耗时较高,在加上线程隔离限定了线程数为5,导致接口吞吐能力有限,最终QPS只有10 左右,这就导致了几个问题.
第一,超出的QPS上限的请求只能抛出异常,从而导致购物车的查询失败,但是从业务角度来说,即便没有查询到最新的商品信息,购物车也应该展示给用户,用户体验更好,也就是给查询失败设置一个降级处理逻辑.
第二,由于查询商品的延迟较高,从而导致 查询购物车的响应时间也变长,这样不仅拖慢了购物车服务,消耗了购物车服务的更多资源,而且用户体验也很差,对于商品服务这种不太健康的接口,我们应该直接停止调用,直接走降级逻辑,避免影响到当前服务,也就是将商品接口熔断.

1.5.1 编写降级逻辑

触发限流或熔断后的请求不一定要直接报错,也可以返回一些默认数据或者友好提示,用户体验会更好.
给FeignClient编写失败后的降级有两种方式:

  • 方式一; FallbackClass,无法对远程调用的异常做处理
  • 方式二: FallbackFactory,可以对远程调用做异常处理,我们一般选择这种方式

这里我们演示方式二的降级处理:
步骤一: 在hm-api模块中给ItemClient定义降级处理类,实现FallbackFactory:
在这里插入图片描述
代码如下:

package com.hmall.api.client.fallback;import com.hmall.api.client.ItemClient;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.exception.BizIllegalException;
import com.hmall.common.utils.CollUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;import java.util.Collection;
import java.util.List;@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);// 查询购物车允许失败,查询失败,返回空集合return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {// 库存扣减业务需要触发事务回滚,查询失败,抛出异常throw new BizIllegalException(cause);}};}
}

步骤二: 在hm-api模块中的com.hmall.api.config.DefaultFeignConfig类中将ItemClientFallback注册为一个Bean.
在这里插入图片描述
步骤三: 在hm-api模块中的ItemClient接口中使用ItemClientFallbackFactory:
在这里插入图片描述
启动后,再次测试,发现限流的请求不再报错,走了降级逻辑:
在这里插入图片描述
但是未被限流的请求延时依然很高:
在这里插入图片描述

1.5.2 服务熔断l

查询商品的RT较高,从而导致查询购物车的RT事件也变得很长,这样不仅拖慢了购物车服务,消耗了购物车很多的资源,而且用户体验也很差,对于商品服务这种不太健康的接口,我们应该停止调用,直接走降级逻辑,避免影响到当前服务,这也就是将商品查询接口熔断,当商品服务接口恢复正常之后,再允许调用,这其实就是熔断器的工作模式了.
Sentinel中的断路器不仅仅可以统计某个接口的慢请求比例,还可使统计异常请求比例,当这些比例超出阈值时,就会熔断该接口,即拦截访问接口的一切请求,降级处理,当该接口恢复正常时,再放行对于该接口的请求,断路器的工作状态切换有一个状态机来控制:
在这里插入图片描述
状态机包括是三个状态:

  • closed: 关闭状态,断路器放行所有请求,并开始统计异常比例,慢请求比例,超过阈值则切换到open状态
  • open: 打开状态,服务调用被熔断,访问被熔断的服务会拒绝访问,并快速失败,直接走降级逻辑,Open状态持续一段时间后进入half-open状态.
  • half-open: 半开状态,放行一次请求,根据执行结果来判断接下来的操作.
    • 请求成功: 则切换到closed状态
    • 请求失败: 则切换到open状态

我们可以在控制台通过点击簇点后的"熔断"按钮来配置熔断策略:
在这里插入图片描述
在弹出的表格中这样填写:
在这里插入图片描述
这种是按照慢调用比例来做熔断,上述配置的含义是:

  • RT超过200毫秒的请求就是慢调用
  • 统计最近的1000ms内的最少5次请求,如果慢调用比例不超过0.5,则触发熔断
  • 熔断持续时长20s

配置完成之后,再次利用jemeter进行测试,可以发现:
在这里插入图片描述
在一开始一段时间是允许访问的,后来触发熔断之后,查询商品服务的接口通过QPS直接为0,所有请求都被熔断了,而查询购物车的本身没有受到影响.
此时整个购物车查询服务的平均RT影响不大:
在这里插入图片描述

相关文章:

[Spring] Sentinel详解

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

让数据优雅落地:用 serde::Deserialize 玩转结构体实体

前言 想象一下,服务器突然飞来一堆 JSON 数据,就像一群无头苍蝇冲进办公室,嗡嗡作响,横冲直撞。此刻,你的任务,就是把这群“迷路数据”安置进正确的格子里,分门别类,秩序井然,不混不乱,不漏一只。 好在 Rust 早就为我们备好瑞士军刀:serde::Deserialize。它不仅刀…...

【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)

WPF中实现动态加载图片浏览器&#xff08;边滚动边加载&#xff09; 在做图片浏览器程序时&#xff0c;遇到图片数量巨大的情况&#xff08;如几百张、上千张&#xff09;&#xff0c;一次性加载所有图片会导致界面卡顿甚至程序崩溃。 本文介绍一种 WPF Prism 实现动态分页加…...

Flow原理

fun main() {runBlocking {launch {flow4.collect{println("---collect-4")}println("---flow4")}}val flow4 flow<Boolean>{delay(5000)emit(false) } 我们分析下整个流程 1.flow为什么之后在collect之后才会发送数据 2.collect的调用流程 我…...

业绩回暖、股价承压,三只松鼠赴港上市能否重构价值锚点?

在营收重返百亿俱乐部后&#xff0c;三只松鼠再度向资本市场发起冲击。 4月25日&#xff0c;这家坚果零食巨头正式向港交所递交上市申请书&#xff0c;若成功登陆港股&#xff0c;将成为国内首个实现“AH”双上市的零食品牌。 其赴港背后的支撑力&#xff0c;显然来自近期披露…...

基于大模型的胆总管结石全流程预测与临床应用研究报告

目录 一、引言 1.1 研究背景 1.2 研究目的与意义 1.3 研究方法和创新点 二、大模型在胆总管结石预测中的应用原理 2.1 大模型概述 2.2 模型构建的数据来源与处理 2.3 模型训练与优化 三、术前预测与准备 3.1 术前胆总管结石存在的预测 3.2 基于预测结果的术前检查方…...

QT—布局管理器之BoxLayout篇

1.布局管理器的概述 在Qt中&#xff0c;使用布局管理器的主要原因是它能够自动管理组件的大小和位置&#xff0c;从而实现灵活且动态的界面布局。布局管理器可以自动调整组件以适应窗口大小的变化&#xff0c;确保界面在不同分辨率和设备上都能保持良好的显示效果。这不仅减少了…...

如何在 IntelliJ IDEA 中编写 Speak 程序

在当今数字化时代&#xff0c;语音交互技术越来越受到开发者的关注。如果你想在 IntelliJ IDEA&#xff08;一个强大的集成开发环境&#xff09;中编写一个语音交互&#xff08;Speak&#xff09;程序&#xff0c;那么本文将为你提供详细的步骤和指南。 一、环境准备 在开始编…...

湖北理元理律师事务所:债务优化的法律机制与民生实践

在债务纠纷日益增多的社会背景下&#xff0c;合法、规范的债务管理服务成为民生需求的重要环节。湖北理元理律师事务所作为经国家司法局注册登记的债事服务机构&#xff0c;以法律为工具&#xff0c;探索出一套覆盖债务咨询、规划与风险防控的服务体系。 1.法律服务的专业化框…...

练习普通话,说话更有节奏

玲珑塔&#xff0c;塔玲珑&#xff0c;玲珑宝塔第一层&#xff0c;一张高桌四条腿&#xff0c; 一个和尚一本经。一个铙钹一口磬&#xff0c;一个木鱼一盏灯。 一个金玲&#xff0c;整四两&#xff0c;风儿一刮响哗愣。 玲珑塔&#xff0c;隔过两层数三层&#xff0c;三张高桌十…...

链表相关——Python实现

一、链表的创建及数据插入 示例代码&#xff1a; #1.定义一个结点类 class ListNode():def __init__(self,x,nextNone):self.valxself.nextnext #2.定义单链表 class LinkList():#2.1 创建一个头指针为空的链表def __init__(self,headNone):self.headNone#2.2 将数据插入链表…...

[OS_9] C 标准库和实现 | musl libc | offset

在你感觉有困难的时候&#xff0c;计算机 一定有解决办法 操作系统为我们提供了对象和操作它们的 API&#xff1a;我们学习了进程管理的 fork, execve, exit, waitpid&#xff1b;内存管理的 mmap&#xff1b;文件 (对象) 管理的 open, read, write, dup, close, pipe, …… 大…...

【氮化镓】质子辐照对 GaN-on-GaN PiN 二极管电导调制的影响

2025 年,中国科学技术大学的 Xuan Xie 等人采用实验研究的方法,深入探究了 10-MeV 和 50-MeV 质子辐照( fluence 最高达 11014 cm−2)对 kV 级垂直 GaN-on-GaN PiN 二极管的导电调制影响。研究背景在于空间应用中的功率电子电路易受质子、α 粒子和重离子等影响而降级甚至失…...

深入浅出限流算法(一):简单但有“坑”的固定窗口计数器

在现代分布式系统和 API 设计中&#xff0c;限流 (Rate Limiting) 是一个不可或缺的环节。它像一个尽职的门卫&#xff0c;保护着我们的服务资源&#xff0c;防止因突发流量或恶意攻击导致系统过载&#xff0c;同时也能确保资源的公平分配。 实现限流的算法多种多样&#xff0…...

项目上线流程梳理(Linux宝塔面板)

项目部署&#xff08;Linux宝塔面板&#xff09; 一、准备工作 1、 后端项目 梳理配置添加application-prod.yml使用maven进行打包生成jar包 2、前端项目 修改request.ts请求的后端端口&#xff08;服务器地址&#xff09;打包 二、服务器 1、服务器环境安装 2、初始化数…...

MCP Servers玩玩WebUI自动化

MCP Servers快速了解 一文搞懂 MCP Servers mcp server网站 https://mcpservers.orghttps://mcp.sohttps://glama.ai/mcp/servershttps://www.pulsemcp.com 一、安装&配置mcp clients mcp clients可以使用客户端&#xff08;常见claude desktop&#xff0c;但claude需…...

永磁同步电机控制算法-转速环电流环SMC控制器

一、原理介绍 为改进传统PI转速环电流环控制器易超调、抗干扰性能差的问题&#xff0c;转速环采用一阶滑模控制器&#xff0c;电流环采用二阶滑模控制器。 二、仿真验证 在MATLAB/simulink里面验证所提算法&#xff0c;采用和实验中一致的控制周期1e-4&#xff0c;电机部分计…...

Nginx支持HTTP2/HTTP3的并用CURL测试

对比HTTP2和HTTP3 HTTP/3 相比 HTTP/2 的主要优势&#xff1a; 项目HTTP/2HTTP/3传输层基于 TCP&#xff08; TLS&#xff09;基于 QUIC&#xff08;内置 TLS&#xff09;建立连接速度慢&#xff0c;至少 2~3 次握手&#xff08;TCP TLS&#xff09;快&#xff0c;只需 1 次握…...

阅读MySQL实战45讲第11天

目录 引言&#xff1a; 基本原理 排序方式 索引排序 文件排序&#xff08;File Sort&#xff09; 优化建议 一、全字段排序 二、rowid 排序 如果 MySQL 认为排序的单行长度太大会怎么做呢&#xff1f; 1. 使用磁盘临时表 2. 分阶段排序 3. 产生警告或错误 三、全字段排序 VS ro…...

linux 使用nginx部署vue、react项目

前言 本文基于&#xff1a;操作系统 CentOS Stream 8 使用工具&#xff1a;Xshell8、Xftp8 1.安装依赖 安装gcc、gcc-c yum install gcc gcc-c -y安装pcre、pcre-devel yum install pcre pcre-devel -y安装zlib、zlib-devel yum install zlib zlib-devel -y安装openssl、…...

逆向设计——CWDM_splitter

一、创建结构 switchtolayout; selectall; delete;## SIM PARAMS num_wg = 4; wg_width = 0.5e-6; out_wg_dist = 1e-6; mode_width = 3*wg_width; total_wg_h = num_wg*wg_width + (num_wg-1)*out_wg_dist;opt_size_x=6e-6; opt_size_y=6e-6;size_x=opt_size_x+1e-6; size_y=o…...

单片机-89C51部分:7、中断

飞书文档https://x509p6c8to.feishu.cn/wiki/A5gcwyL5giq1JOkkcsscn8eLnzf 一、中断的作用 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功…...

小波变换和图像的融合

看到一篇比较有趣的文章&#xff0c;是将小波变换融入到图像配准过程中。论文题目是Deformable medical image registration based on wavelet transform and linear attention。论文提出了一种基于小波变换和线性注意力的可变形医学图像配准方法&#xff0c;通过小波下采样模块…...

2799. 统计完全子数组的数目

给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序列。 示例 1&#xff…...

docker镜像构建常用参数

要退出出去ctrlpq&#xff0c;或者直接输入exit也可以直接退出 这样就生成了可以这么用&#xff0c;但安全性比较差&#xff0c;不利于审计 企业里构建的镜像这样&#xff1a; “.”是构建的地点是当前的意思&#xff1b;构建了一层在[2/2]RUN touch /leefile里面 发现有我…...

如何用postman进行批量操作

业务场景&#xff1a; 有些时候&#xff0c;我们会需要批量的将SAP B1系统中的几千条的数据删除或者取消单据&#xff0c;这个时候&#xff0c;一条条去操作&#xff0c;指定是到猴年马月了。SAP Business One本身提供了DTW这个工具&#xff0c;但是这个更新&#xff0c;可以操…...

【MCP】第三篇:Cline工具链路追踪——解码“协议引擎“的神经传导奥秘

【MCP】第三篇&#xff1a;Cline工具链路追踪——解码"协议引擎"的神经传导奥秘 一、引言二、CloudFlare AI Gateway2.1 核心定位2.2 核心能力2.3 与MCP协议逆向的深度契合 三、VSCode Cline与CloudFlare联调实战3.1 CloudFlare配置3.2 VSCode Cline配置3.3 联调实战…...

HTML标记语言_@拉钩教育【笔记】

目录 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个页面) 8.多媒体标签(音/视频) 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个…...

SDK游戏盾、高防IP、高防CDN三者的区别与选型指南

在网络安全防护领域&#xff0c;SDK游戏盾、高防IP和高防CDN是常见的解决方案&#xff0c;但各自的功能定位、技术实现和适用场景差异显著。本文将通过对比核心差异&#xff0c;帮助您快速理解三者特点并选择适合的防护方案。 一、核心功能定位 SDK游戏盾 功能核心&#xff1a…...

C++中的格式化字符串

C中的格式化字符串 fmt 库简介 {fmt}是一个开源的、现代化的C格式化库&#xff0c;由Victor Zverovich创建。它提供了一种安全、快速且方便的字符串格式化方式&#xff0c;其设计理念受到了Python的str.format()的启发 fmt库的主要特点 易用性&#xff1a;使用简洁的语法&a…...

民办生从零学C的第十二天:指针(1)

每日励志&#xff1a;拼搏十年&#xff0c;征战沙场&#xff0c;不忘初心&#xff0c;努力成为一个浑身充满铜臭味的有钱人。 一.内存和地址 1.内存 计算机内存是一系列存储单元的集合&#xff0c;每个存储单元都有唯一的地址来标识。这些存储单元用于存储程序的数据和指令。…...

复习Vue136~180

1.使用create-vue创建项目 npm init vuelatest 项目目录和关键文件&#xff1a; new Vue() 创建一个应用实例 > createApp()、createRouter() createStore() 、将创建实例进行了封装&#xff0c;保证每个实例的独立封闭性。 禁用vue2的插件vuter 使用vue3的插件volar scrip…...

高炉项目中DeviceNET到Ethernet的转换奥秘

在工业自动化的世界中&#xff0c;高炉项目中的数据通信至关重要。其中DeviceNET和Ethernet作为两种主流的网络协议&#xff0c;扮演着不可或缺的角色。它们之间的转换不仅仅是技术上的桥梁&#xff0c;更是实现信息高效传递的关键。今天&#xff0c;我们就来揭开从DeviceNET到…...

awk之使用详解(Detailed Explanation of Using AWK)

awk使用详解 1. 入门 1.1 什么是 awk&#xff1f; ①Awk是一种文本处理工具&#xff0c;适用于处理结构化数据&#xff0c;例如表格数据。 ②它可以读取一个或多个文本文件&#xff0c;并执行模式扫描和处理等指定的操作。 ③基本逻辑涉及数据的提取&#xff0c;排序和计算…...

TDR阻抗会爬坡? 别担心,不是你的错,你只是不够了解TDR!

在背板系统或任何长走线设计里&#xff0c;你大概都碰过这画面&#xff1a; TDR 曲线一开始乖乖在 92 Ω&#xff0c;但越往末端、阻抗越爬越高&#xff0c;来到最高 97 Ω&#xff0c;心里瞬间凉半截 &#x1f612; &#xff0c;「难不成... 板厂又翻车了吗&#xff1f;」 然…...

TypeScript之基础知识

基础知识 1. 基本类型 类型描述string字符串&#xff08;如 "hello"&#xff09;number数字&#xff08;整数或浮点数&#xff0c;支持二进制、八进制、十六进制&#xff09;boolean布尔值&#xff08;true/false&#xff09;null空值&#xff08;需显式声明&#x…...

SNMP协议之详解(Detailed Explanation of SNMP Protocol)

SNMP协议之详解 一、前言 SNMP&#xff0c;被形象地喻为网络世界大的工具箱&#xff0c;使他们能的“智慧守护者”&#xff0c;它为网络管理员装备了一套功能强够实现对网络设备状态的实时监控、性能数据的全面收集、远程配置的灵活管理以及故障事件的即时响应。借助SNMP&…...

机器学习-入门-线性模型(2)

机器学习-入门-线性模型(2) 3.4广义线性回归 一般形式&#xff1a; y g − 1 ( w T x b ) y g^{-1} \left( w^T x b \right) yg−1(wTxb) 单调可微的联系函数 (link function) 令 g ( ⋅ ) ln ⁡ ( ⋅ ) g(\cdot) \ln (\cdot) g(⋅)ln(⋅) 则得到对数线性回归 ln ⁡…...

【问题】docker容器修改环境变量的方式

问题 启动n8n之后&#xff0c;docker容器提示&#xff1a; There is a deprecation related to your environment variables. Please take the recommended actions to update your configuration: 2025-04-28 09:20:08 - N8N_RUNNERS_ENABLED -> Running n8n without tas…...

基于 Spring Boot 瑞吉外卖系统开发(八)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;八&#xff09; 自动填充公共字段 MyBatis-Plus公共字段自动填充&#xff0c;也就是在插入或者更新的时候为指定字段赋予指定的值&#xff0c;使用它的好处就是可以统一对这些字段进行处理&#xff0c;降低了冗余代码的数量。本…...

LeetCode热题100--560.和为K的子数组(前缀和)--中等

1.题目 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;nums […...

搭建 Spark YARN 模式集群指南

在大数据处理领域&#xff0c;Apache Spark 凭借其卓越的性能和易用性广受青睐。而 YARN&#xff08;Yet Another Resource Negotiator&#xff09;作为 Hadoop 的资源管理框架&#xff0c;能高效管理集群资源。将 Spark 与 YARN 结合&#xff0c;以 YARN 模式搭建集群&#xf…...

服务器部署,Nginx安装和配置

Nginx简介 Nginx是一款轻量级和高性能的web服务器、反向代理服务器和电子邮件代理服务器。你可以使用Nginx实现网页的部署&#xff0c;解决跨域问题实现邮件服务器&#xff0c;甚至Nginx也可以实现音视频推流拉流服务器&#xff0c;Nginx可以实现的功能远超你的想象&#xff0…...

Java后端接口调用拦截处理:注解与拦截器的实现

在Java开发中&#xff0c;对后端接口调用进行拦截处理是一种常见的需求&#xff0c;通常用于权限验证、Token校验、状态更新等操作。本文将围绕 Spring框架的拦截器&#xff08;Interceptor&#xff09;、Spring AOP&#xff08;面向切面编程&#xff09; 和 Spring Security 三…...

C++(初阶)(十四)——多态

多态 面向对象的其中一大特征。 多态多态的定义及构成多态的构成条件多态的实现条件多态的分类编译时多态性运行时的多态性 虚函数定义不能成为虚函数的函数 虚函数重写&#xff08;覆盖&#xff09;选择题虚函数重写的其他问题析构函数的重写override 和final关键字重载/重写…...

PyQt6基础_QThread

目录 前置 代码&#xff1a; 运行 正常运行 QThread运行报错 视频 前置 1 PySide6.QtCore.QThread - Qt for Python QThread官方文档 2 长时间任务可以放到QThread中执行&#xff0c;避免占用主线程导致界面卡顿无法操作 代码&#xff1a; import traceback,sys fro…...

工业通讯现场中关于EtherCAT转TCPIP网关的现场应用

在当今工业自动化的浪潮中&#xff0c;EtherCAT技术以其高效、实时的特性成为了众多制造业的首选。然而&#xff0c;随着工业互联网的发展&#xff0c;对于数据的远程访问和云平台集成的需求日益增长&#xff0c;这就需要将EtherCAT协议转化为更为通用的TCP/IP协议。于是开疆智…...

vite创建vue3项目并进行配置

创建项目 方式一 执行以下命令 之后输入项目名称 选择框架 选择语言 例如 pnpm create vite此方式创建的项目较为干净 0手起步 只包含一些基础依赖 例如vue vite等 项目目录如下 "scripts": {"dev": "vite","build": "vue-tsc -…...

LeetCode 热题 100_最小路径和(92_64_中等_C++)(多维动态规划)

LeetCode 热题 100_最小路径和&#xff08;92_64&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;多维动态规划&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;多维动态规划&…...

关于常量指针和指向常量的指针

关于指针&#xff0c;对于常量指针和指向常量的指针也是傻傻分不清。看到定义时&#xff0c;不知道是指针不能变&#xff0c;还是指针指向的内容不能变量。 先看形式&#xff1a; const char * A; char * const B; 这两种有什么区别&#xff1f;傻傻分不清。 A这种定义&am…...