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

Gateway怎么实现限流的

Gateway怎么实现限流的

在API网关(如Spring Cloud Gateway、Kong、Nginx等)中实现限流是为了控制服务请求的频率,从而避免系统过载,确保稳定性和可用性。限流可以通过多种策略实现,常见的方法包括基于请求次数、时间窗口、IP地址等方式进行限制。下面是 Spring Cloud Gateway 实现限流的一些常见方式:

1. 基于请求次数的限流

这种方法通过限制单位时间内的请求次数来防止过多的请求访问服务。例如,限制每秒钟只能处理最多100个请求。

  • Spring Cloud Gateway实现: Spring Cloud Gateway提供了内置的限流功能,可以通过RequestRateLimiter过滤器来实现基于请求次数的限流。
示例配置:
spring:cloud:gateway:routes:- id: rate_limiter_routeuri: http://example.compredicates:- Path=/api/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10  # 每秒钟请求的数量redis-rate-limiter.burstCapacity: 20  # 突发容量,即短时间内允许的最大请求数
  • replenishRate: 每秒钟允许的请求数。
  • burstCapacity: 突发容量,表示短时间内可以处理的最大请求数,超过该数的请求会被丢弃或拒绝。

2. 基于令牌桶算法(Token Bucket)限流

令牌桶算法是一种平滑请求流量的算法,它通过固定的速率生成令牌并将其存放在桶中,请求到达时需要获取令牌才能处理,如果令牌桶为空,则请求被拒绝。

  • Spring Cloud Gateway实现: 使用RequestRateLimiter实现基于令牌桶的限流。
示例配置:
spring:cloud:gateway:routes:- id: token_bucket_routeuri: http://example.compredicates:- Path=/api/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10  # 每秒生成的令牌数redis-rate-limiter.burstCapacity: 20  # 令牌桶的容量

这里的配置和上面的请求次数限制类似,但背后实现的是令牌桶算法。

3. 基于IP限流

可以根据客户端IP地址来限制每个IP的请求频率,避免某个客户端过度访问服务。通常使用Redis来实现基于IP的限流。

示例配置(使用Redis):
spring:cloud:gateway:routes:- id: ip_rate_limiter_routeuri: http://example.compredicates:- Path=/api/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20redis-rate-limiter.requestedTokens: 1redis-rate-limiter.keyResolver: "#{@ipKeyResolver}"

在这个例子中,keyResolver 指定了如何基于客户端 IP 地址来限流,可以自定义一个IP解析器ipKeyResolver,这样每个IP的请求次数会被限制。

4. 基于时间窗口的限流

时间窗口限流是按照固定的时间窗口(如每分钟、每小时等)来限制请求的数量。通过时间窗口来控制单位时间内的最大请求数。

示例配置:
spring:cloud:gateway:routes:- id: time_window_routeuri: http://example.compredicates:- Path=/api/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 5  # 每秒钟请求的数量redis-rate-limiter.burstCapacity: 10  # 突发容量redis-rate-limiter.requestedTokens: 1  # 每次请求消耗的令牌数

这种方式将请求限制在一定的时间窗口内,如果在窗口内的请求数量超过限制,将拒绝额外的请求。

5. 自定义限流策略

Spring Cloud Gateway 还允许通过自定义KeyResolverRateLimiter等来实现更灵活的限流策略。例如,基于用户的ID、API路径等来做不同的限流策略。

自定义 KeyResolver 示例:
@Bean
public KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostString());
}

这个例子通过客户端IP地址进行限流。

6. 其他网关限流工具

除了Spring Cloud Gateway,其他网关如 KongNginx 等也提供了丰富的限流功能:

  • Kong 使用插件机制实现限流,支持基于请求次数、IP、API Key等的限流。
  • Nginx 可以通过 limit_req 和 limit_conn 模块来进行限流控制。

总结

Spring Cloud Gateway 中,常见的限流方式包括:

  • 基于请求次数的限流(Rate Limiting)
  • 基于令牌桶算法的限流(Token Bucket)
  • 基于IP的限流
  • 基于时间窗口的限流

可以通过RequestRateLimiter过滤器实现这些策略,结合 Redis 等存储技术来共享和持久化限流状态。在选择限流策略时,需要根据业务需求、流量模式、以及系统的负载能力来决定。

分析Gateway 限流代码


@Component
public class RateLimitConfig {@BeanKeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("token"));}@BeanKeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());}@BeanKeyResolver apiKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getPath().value());}@Primary@BeanKeyResolver appIpKeyResolver() {return exchange -> {Route route = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);return Mono.just(exchange.getRequest().getRemoteAddress().getHostName().concat(route.getUri().getHost()));};}
}

这段代码实现了Spring Cloud Gateway的限流配置,具体的实现通过不同的KeyResolver来为请求提供唯一的标识,用于区分不同的请求来源或策略。KeyResolver是限流的核心组成部分,它决定了限流的“键”(即每个请求的唯一标识),从而确保不同的请求按照不同的规则被限流。

以下是对代码的详细分析:

1. KeyResolver 的作用

KeyResolver 是 Spring Cloud Gateway 中限流机制的一部分,用来生成与请求相关的唯一“键”。在限流时,基于这些“键”来计算每个限流单元(例如每个用户、每个IP、每个API等)的请求次数。限流规则会依据这些键来进行流量控制。

2. userKeyResolver

 

java

@Bean KeyResolver userKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("token")); }

  • 功能:该 KeyResolver 基于请求的查询参数 token 生成唯一的限流键。
  • 应用场景:当客户端使用 token 参数(可能是API Key或用户身份标识符)时,可以基于该 token 对每个用户进行限流。每个用户(或每个 token)的请求次数将被单独计数。
  • 具体实现:从请求的查询参数中获取 token 参数的第一个值。如果没有这个参数,返回 null 或空值会导致限流功能不生效。

3. ipKeyResolver

 

java

@Bean KeyResolver ipKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); }

  • 功能:该 KeyResolver 基于客户端的 IP 地址生成限流键。
  • 应用场景:当需要限制每个IP地址的请求频率时,使用此 KeyResolver。例如,可以限制每个IP在一定时间窗口内的请求次数,从而避免单个IP的过多请求对系统造成压力。
  • 具体实现:通过 exchange.getRequest().getRemoteAddress() 获取客户端的远程IP地址,然后使用 getHostName() 获取IP的主机名。理论上,getHostName() 会尝试解析IP地址为主机名,但在某些情况下,可能直接返回IP地址。

4. apiKeyResolver

 

java

@Bean KeyResolver apiKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getPath().value()); }

  • 功能:该 KeyResolver 基于请求的API路径生成唯一的限流键。
  • 应用场景:当需要限制某个API路径的请求频率时,使用此 KeyResolver。例如,限制 /api/v1/login 或 /api/v1/register 路径的访问频率,可以防止某个特定API被过度访问。
  • 具体实现:通过 exchange.getRequest().getPath().value() 获取请求的路径。这个路径通常是 URI 的路径部分,如 /api/v1/resource

5. appIpKeyResolver

 

java

@Primary @Bean KeyResolver appIpKeyResolver() { return exchange -> { Route route = (Route) exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); return Mono.just(exchange.getRequest().getRemoteAddress().getHostName().concat(route.getUri().getHost())); }; }

  • 功能:该 KeyResolver 综合了客户端的 IP 地址和路由的 URI 来生成限流键。
  • 应用场景:当希望根据客户端 IP 和访问的具体服务进行限流时,使用此 KeyResolver。例如,可以限制每个IP对特定API的访问频率。
  • 具体实现
    • 通过 exchange.getRequest().getRemoteAddress().getHostName() 获取客户端的 IP 地址。
    • 通过 exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR) 获取当前请求的路由信息。
    • route.getUri().getHost() 获取请求目标服务的主机名(或域名),并将其与客户端IP拼接,作为限流的唯一键。
    • 使用 concat() 方法将客户端IP与目标服务主机名合并为一个字符串,以保证限流的独立性。

6. @Primary 注解

 

java

@Primary @Bean KeyResolver appIpKeyResolver() { ... }

  • 作用:在有多个相同类型的 @Bean 时,@Primary 注解表示优先使用该 Bean。如果在其他地方有 KeyResolver 的注入需求,Spring 将默认使用 appIpKeyResolver() 方法返回的实例。
  • 场景:当存在多个 KeyResolver 时,如果没有明确指定使用哪个 KeyResolver,Spring 会自动选择标记为 @Primary 的那个。这里标记了 appIpKeyResolver 为默认的 KeyResolver

总结

这段代码定义了多个 KeyResolver,并为不同的限流策略提供了可选择的实现:

  1. userKeyResolver:基于请求的 token 限流,适用于基于用户或身份的限流。
  2. ipKeyResolver:基于客户端 IP 地址限流,适用于限制每个IP的请求次数。
  3. apiKeyResolver:基于请求路径限流,适用于限制某个特定API的访问。
  4. appIpKeyResolver:基于客户端 IP 地址和路由的 URI 组合限流,适用于更细粒度的限流需求,确保同一IP对不同API的请求可以独立计数。

@Primary 注解确保 appIpKeyResolver 是默认的限流键生成器,除非特别指定,否则会优先使用它。

这些 KeyResolver 会与 RequestRateLimiter 等限流功能配合使用,从而在 API 网关层实现精细化的限流控制。

怎么没有指定限流的量,每秒允许访问的量

在这段代码中,虽然定义了不同的 KeyResolver 来生成限流的标识符(如 tokenIPAPI路径),但确实没有指定实际的限流规则(例如每秒允许的访问量)。限流的具体控制是通过 Spring Cloud Gateway 的 RequestRateLimiter 过滤器来实现的,而这个过滤器是用来根据指定的规则对请求进行限流的。

要实现每秒允许的访问量,你需要配置 RequestRateLimiter 过滤器,并为它指定限流规则(如每秒最大访问量和最大突发流量)。

完整的限流配置示例

首先,你需要创建一个 RequestRateLimiter 过滤器,并在过滤器中配置限流策略。通常,你可以通过如下方式来配置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.filter.ratelimit.RequestRateLimiter;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.cloud.gateway.config.GlobalFilterAutoConfiguration;@Configuration
public class GatewayConfig {@Beanpublic RequestRateLimiter filter(KeyResolver keyResolver) {// 配置限流:每秒最多允许 10 次请求,突发流量最多为 20 次return new RequestRateLimiter().setRateLimiter(new MyRateLimiter(10, 20))  // 每秒 10 次请求,突发流量最多 20 次.setKeyResolver(keyResolver); // 设置限流的 KeyResolver}// 自定义一个简单的 RateLimiter 实现类public static class MyRateLimiter implements RateLimiter {private final int replenishRate;private final int burstCapacity;public MyRateLimiter(int replenishRate, int burstCapacity) {this.replenishRate = replenishRate;this.burstCapacity = burstCapacity;}@Overridepublic boolean isAllowed(String key) {// 此处实现你自己的限流逻辑,可以借助令牌桶算法、漏桶算法等return true;  // 只是示例,实际需要实现限流逻辑}// 配置每秒最大请求数(每秒 10 次)public int getReplenishRate() {return replenishRate;}// 配置突发容量public int getBurstCapacity() {return burstCapacity;}}
}

如何将限流规则与 KeyResolver 配合?

在这段代码中,RequestRateLimiter 的限流规则(如每秒允许 10 次请求,突发容量为 20)会与之前定义的 KeyResolver 配合,限制特定 token、IP 或 API 路径的访问频率。

  1. KeyResolver 选择:可以使用你之前定义的 userKeyResolveripKeyResolverapiKeyResolver 来作为限流的依据。

  2. 限流逻辑:通过 MyRateLimiter 类实现限流逻辑(如令牌桶、漏桶等算法)。每个限流的“key”(例如 tokenIP)会根据配置的规则(如每秒 10 次、突发流量 20 次)进行访问次数的限制。

示例配置:按 token 限流

假设你想基于 token 进行限流,你可以这样配置:

@Bean
public RequestRateLimiter filter(KeyResolver userKeyResolver) {return new RequestRateLimiter().setRateLimiter(new MyRateLimiter(10, 20))  // 每秒 10 次请求,突发流量最多 20 次.setKeyResolver(userKeyResolver);  // 使用之前定义的基于 token 的 KeyResolver
}

限流的配置项

  1. replenishRate:每秒允许的请求数。例如,10 表示每秒最多可以处理 10 个请求。

  2. burstCapacity:突发容量,表示在短时间内可以允许的最大请求数。例如,20 表示最多允许瞬间访问 20 次,但通常会平滑地恢复到正常的请求速率。

  3. KeyResolver:你已经定义了多个 KeyResolver,它们决定了限流的粒度。你可以按用户(token)、IP 地址、路径等来分别限流。

总结

这段代码本身只是定义了限流的标识符(通过 KeyResolver)。真正的限流控制需要通过 RequestRateLimiter 过滤器来实现,并在其中指定限流的具体限制量(如每秒允许多少次请求)。你可以使用 replenishRateburstCapacity 来配置每秒允许的访问量及突发流量。

相关文章:

Gateway怎么实现限流的

Gateway怎么实现限流的 在API网关(如Spring Cloud Gateway、Kong、Nginx等)中实现限流是为了控制服务请求的频率,从而避免系统过载,确保稳定性和可用性。限流可以通过多种策略实现,常见的方法包括基于请求次数、时间窗…...

OpenCV实现Kuwahara滤波

Kuwahara滤波是一种非线性的平滑滤波技术,其基本原理在于通过计算图像模板中邻域内的均值和方差,选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明: 一、基本思想 Kuwahara滤波的基本思想…...

【DevOps】Jenkins使用Pipeline构建java代码

使用Pipeline发布java项目 文章目录 使用Pipeline发布java项目资源列表基础环境一、准备gitlab1.1、部署gitlab1.2、创建chinanews项目1.3、提交代码1.4、查看上传的代码 二、准备Jenkins2.1、部署Jenkins2.2、安装maven2.3、修改Maven源2.4、准备chinanews 三、Jenkins配置工具…...

【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题

文章目录 选择题理论题 解释RIP协议中的“水平分割”机制,并说明其目的。 可以防止路由器错误地将从邻居学到的路由再发送回给该邻居,从而避免路由环路的发生。实操题 【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论…...

Entity 的材质(棋盘、条纹、网格)

Entity 的材质 普通物体的材质 import { nextTick, onMounted, ref } from vue import * as Cesium from cesium // console.log(Cesium, Cesium)const viewer ref<any>(null)onMounted(() > { ... })let material Cesium.Color.YELLOW.withAlpha(0.5)Cesium.Colo…...

shell脚本编写练习3

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 #!/bin/bash # 定义文件路径变量 file_path"/tmp/size.log"# 使用if语句检查文件是否存在 if [ -e "$file_path" ] # 检查变量file_path…...

事务的隔离级别和MDL

文章目录 说明不同隔离级别可能发生的现象关键现象解释MDL&#xff08;元数据锁&#xff0c;Metadata Lock&#xff09;MDL 的作用MDL 的工作原理MDL 锁的常见场景如何避免 MDL 阻塞 说明 本文章由大模型对话整理而来&#xff0c;如果有错误之处&#xff0c;请在评论区留言指正…...

用户界面软件05

已知应用 几乎所有的流行的用户界面架构都使用这种模式。我在这里举三个例子&#xff1a; 1. Seeheim 用户界面架构的特点是有一个应用核心的领域层和一个用户界面层。后者 被分为两层&#xff0c;叫做表示层和对话控制层。因为这个架构和面向事务系统有渊源&#xff0c;没有…...

基于Springboot + vue实现的办公用品管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…...

17_Redis管道技术

Redis管道(Pipeline)技术是一种在 Redis 客户端与服务器之间进行高效数据交互的技术。 1.Redis管道技术介绍 1.1 传统请求响应模式 在传统的请求-响应模式下,客户端每发送一个命令后会等待服务器返回结果,然后再发送下一个命令。这种方式在网络延迟较高的情况下会导致性…...

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…...

​Vue虚拟DOM:如何提高前端开发效率

前言 随着前端技术的不断发展&#xff0c;越来越多的框架和库涌现出来&#xff0c;其中Vue.js成为了最受欢迎的前端框架之一。Vue.js采用了响应式数据绑定和组件化的思想&#xff0c;让开发者可以更加高效地构建交互式的用户界面。而Vue.js的底层原理涉及到许多概念和技术&…...

【C】预处理详解

在上一篇文章中&#xff0c;简单讲解了一个C程序是如何从一句句C代码变为一个个二进制指令&#xff0c;并最终变成可执行程序成功运行。在预处理、编译、汇编、链接四个步骤中&#xff0c;预处理阶段做的事情特别多&#xff0c;接下来我们就来讲解一下在预处理阶段处理的一些预…...

CES Asia 2025:VR/AR/XR引领科技新潮流

在全球科技领域蓬勃发展的大背景下&#xff0c;CES Asia 2025&#xff08;赛逸展&#xff09;即将在京盛大开幕&#xff0c;VR/AR/XR技术作为前沿科技的代表&#xff0c;将在本次展会上大放异彩&#xff0c;展现出令人瞩目的发展趋势和巨大潜力&#xff0c;同时政策优势也将为其…...

Lua调用C#

目录 创建C#入口 Lua调用类 Lua调用枚举 Lua调用数组&#xff0c;列表&#xff0c;字典 Lua调用C#拓展方法 Lua调用C#Ref与Out知识 Lua调用C#函数重载 Lua调用C#委托与事件 Lua调用C#二维数组 Lua调用C#中nil与null的差距 Lua调用C#中让系类型与lua能够互相访问 Lua调用…...

EdgeOne安全专项实践:上传文件漏洞攻击详解与防范措施

靶场搭建 当我们考虑到攻击他人服务器属于违法行为时&#xff0c;我们需要思考如何更好地保护我们自己的服务器。为了测试和学习&#xff0c;我们可以搭建一个专门的靶场来模拟文件上传漏洞攻击。以下是我搭建靶场的环境和一些参考资料&#xff0c;供大家学习和参考&#xff0…...

springboot使用Easy Excel导出列表数据为Excel

springboot使用Easy Excel导出列表数据为Excel Easy Excel官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write 主要记录一下引入时候的pom&#xff0c;直接引入会依赖冲突 解决方法&#xff1a; <!-- 引入Easy Excel的依赖 -->&l…...

现代 CPU 的高性能架构与并发安全问题

现代 CPU 的设计&#xff08;如多级缓存、指令重排&#xff09;为了提升性能&#xff0c;引入了许多优化机制&#xff0c;但这些机制可能导致并发场景下的安全性问题。并发安全性主要体现在三个方面&#xff1a;原子性、有序性 和 可见性。这些问题在底层通过 CAS&#xff08;C…...

【数模学习笔记】插值算法和拟合算法

声明&#xff1a;以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料&#xff0c;仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…...

JavaScript 数组及其常用方法

1. JavaScript 数组概述 数组是 JavaScript 中用于存储多个值的数据结构。它可以存储不同类型的元素&#xff0c;并提供强大的方法来操作和管理数据。数组的元素按索引&#xff08;从 0 开始&#xff09;进行访问。 2. 数组的创建方式 1) 使用数组字面量 let fruits [&quo…...

SQL HAVING 子句深入解析

SQL HAVING 子句深入解析 介绍 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统的标准编程语言。在SQL中&#xff0c;HAVING子句是与GROUP BY子句一起使用的&#xff0c;用于筛选分组后的数据。它根据聚合函数的结果对组进行条件过滤…...

vue3+ts的几个bug调试

由于编译问题&#xff0c;把几个type检查给关闭了&#xff0c;否则错误太多。 1&#xff09;第一个检查出的问题&#xff0c;拼写错误数组的length&#xff0c;写成了lengh。 2&#xff09;数组的对象引用。 torStatus Array(8).fill({ ...defaultStatus }) as TorStatus[]…...

git: hint:use --reapply-cherry-picks to include skipped commits

问&#xff1a; 当我在feture分支写完功能&#xff0c;切换到dev更新了远端dev代码&#xff0c;切回feture分支&#xff0c;git rebase dev分支后出现报错&#xff1a; warning skipped previously applied commit 709xxxx hint:use --reapply-cherry-picks to include skippe…...

Microsoft Sql Server 2019 数据类型

数据类型 bigint、int、smallint、tinyint 使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数 据类型。 例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上。 但对于建筑物的 年龄,tinyint 就不再适应,因为建…...

C++实现设计模式---代理模式 (Proxy)

代理模式 (Proxy) 代理模式 是一种结构型设计模式&#xff0c;它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问&#xff0c;通常用于在不改变目标对象的情况下&#xff0…...

微信小程序用的SSL证书有什么要求吗?

微信小程序主要建立在手机端使用&#xff0c;然而手机又涉及到各种系统及版本&#xff0c;所以对SSL证书也有要求&#xff0c;如果要小程序可以安全有效的访问需要满足以下要求&#xff1a; 1、原厂SSL证书&#xff08;原厂封&#xff09;。 2、DV单域名或者DV通配符。 3、兼…...

Flutter中Get.snackbar和Get.dialog关闭冲突问题记录

背景&#xff1a; 在使用GetX框架时&#xff0c;同时使用了Get.snackbar提示框和Get.dialog加载框&#xff0c;当这两个widget同时存在时&#xff0c;Get.dialog加载框调用Get.back()无法正常关闭。 冲突解释&#xff1a; 之所以会产生冲突&#xff0c;是因为Get.snackbar在关…...

命令模式-Command Pattern

什么是命令模式 命令模式是一种行为类设计模式&#xff0c;核心是将每种请求或操作封装为一个独立的对象&#xff0c;从而可以集中管理这些请求或操作&#xff0c;比如将请求队列化依次执行、或者对操作进行记录和撤销。 命令模式通过将请求的发送者(客户端)和接收者(执行请求…...

【Linux笔记】Day1

基于韩顺平老师课程记录&#xff1a; https://www.bilibili.com/video/BV1Sv411r7vd 安装CentOS 给CentOS手动分区 分为三个区&#xff1a; boot分区&#xff08;给1G就行&#xff09; 交换分区&#xff08;和内存相关&#xff0c;这里和虚拟机的内存2G一致&#xff09; …...

如何明智地提问

如何明智地提问的重要总结&#xff0c;让我为主要观点添加一些具体的实践建议&#xff1a; 提问前的准备工作 尝试在 Google、Stack Overflow 等平台搜索相似问题阅读相关文档和错误日志尝试自己调试和排查问题记录下已尝试过的解决方案 选择合适的提问平台 Stack Overflow…...

【大前端】Vue3 工程化项目使用详解

目录 一、前言 二、前置准备 2.1 环境准备 2.1.1 create-vue功能 2.1.2 nodejs环境 2.1.3 配置nodejs的环境变量 2.1.4 更换安装包的源 三、工程化项目创建与启动过程 3.1 创建工程化项目 3.2 项目初始化 3.3 项目启动 3.4 核心文件说明 四、VUE两种不同的API风格 …...

window.print()预览时表格显示不全

问题描述&#xff1a;使用element的table组件&#xff0c;表格列宽为自适应&#xff0c;但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示&#xff0c;造成表格可能的显示不全问题 解决方法&#xff1a;添加如下样式 media print {::v-deep {// 表头…...

《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》

在当今数字化时代&#xff0c;鸿蒙Next系统与人工智能的融合为开发者带来了前所未有的机遇&#xff0c;开发一款人工智能语音助手应用更是备受关注。以下是在鸿蒙Next系统上开发人工智能语音助手应用的关键步骤&#xff1a; 环境搭建与权限申请 安装开发工具&#xff1a;首先需…...

计算机网络之---MAC协议

MAC协议的作用 在数据链路层中&#xff0c;MAC&#xff08;媒介访问控制&#xff09;协议负责控制设备如何访问共享的通信介质&#xff08;如以太网、无线电波等&#xff09;&#xff0c;确保在多台设备共享同一传输媒介时能够有效地进行数据传输&#xff0c;避免冲突、控制流…...

系统思考—要素连接

“改变你的思维&#xff0c;就能改变你的世界”— 诺曼皮尔 世界上的所有事物&#xff0c;都在规律的支配下&#xff0c;以系统的方式运转。显性的部分是我们能看到的“要素”&#xff0c;而那些看不见的力量&#xff0c;正是推动系统运作的要素之间的相互作用。更隐秘的&…...

influxdb 采集node_exporter数据

一、打开Scrapers添加 node_exporter地址&#xff1a;http://192.168.31.135:9100/metrics 查看数据...

数据链路层-STP

生成树协议STP&#xff08;Spanning Tree Protocol&#xff09; 它的实现目标是&#xff1a;在包含有物理环路的网络中&#xff0c;构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机&#xff1a; 选举根端口&#xff1a; 选举指定端口&#xff1a; 端口名字&…...

学技术学英语:ELK是什么

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a; 先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 aggregate 聚合 /ˈɡrɪɡeɪt/ analytics 分析学 /ˌnəˈl…...

快速实现一个快递物流管理系统:实时更新与状态追踪

物流管理是电商、仓储和配送等行业的重要组成部分。随着电子商务的快速发展&#xff0c;快递物流的高效管理和实时状态更新变得尤为关键。本文将演示如何使用Node.js、Express、MongoDB等技术快速构建一个简单的快递物流管理系统&#xff0c;该系统支持快递订单的实时更新和追踪…...

android分区和root

线刷包内容&#xff1a; 线刷包是一个完整的android镜像&#xff0c;不但包括android、linux和用户数据&#xff0c;还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区&#xff0c;包括linux下主要的二进制程序。 boot.img…...

【Go】:深入解析 Go 1.24:新特性、改进与最佳实践

前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新&#xff0c;并通过具体示例展示这些变化如何影响日常开发工作&#xff0c;确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...

Vue3组件通讯——自定义事件(子->父)

需求如下&#xff1a; 1.在子组件中&#xff0c;当用户点击提交按钮后&#xff0c;更新数据库 2.数据更新成功后&#xff0c;子组件通知父组件getUserInfo函数&#xff0c;重新获取数据&#xff0c;同步更新 3.子组件等待getUserInfo函数执行完毕后&#xff0c;调用init函数…...

【Rust自学】12.2. 读取文件

12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print)&#xff0c;是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步&#xff1a; 接收命令行参数读…...

《OpenCV计算机视觉实战项目》——银行卡号识别

文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像&#xff0c;预处理找到数字边框使用模版匹配&#xff0c;计算匹配得分 画出并打印结果 项目任务及要求 任务书&#xff1a; 要为某家银行设计一套…...

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …...

OpenCV的一种改进型的素描特效算法

实现素描特效的原理主要基于图像处理中的边缘检测和灰度反转等技术。边缘检测能够突出图像中的轮廓信息&#xff0c;而灰度反转则用于增强对比&#xff0c;使图像看起来更像手绘素描。 1 素描特效的常规算法 图像读取与预处理 使用图像处理库&#xff08;如OpenCV&#xff09;…...

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…...

LeetCode 283题:移动零

LeetCode 283题&#xff1a;移动零 (Move Zeroes) LeetCode 第283题要求将数组中的所有零移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有的 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序…...

常见的开源协议及注意事项【精简版】

注&#xff1a; 以下内容出自Github Copilot。 常见的开源协议有以下几种&#xff0c;每种协议都有其特定的使用场景和注意事项&#xff1a; MIT许可证&#xff1a; 特点&#xff1a;非常宽松&#xff0c;允许用户自由使用、复制、修改、合并、发布、分发、再许可和/或销售软件…...

【Oracle专栏】2个入参,生成唯一码处理

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 业务需要&#xff1a;2个参数&#xff0c;如 aidbankid &#xff0c;两个值是联合主键&#xff0c;需要生成一个固定唯一码&#xff0c;长度有限制32位&#xff0c;为了…...