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

设计一个高性能的分布式限流系统

设计一个高性能的分布式限流系统

在现代分布式系统中,流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化,系统往往需要面对突发流量或恶意攻击等场景,这就对限流机制提出了更高的要求。一套高性能的分布式限流系统,不仅能够精准控制流量,防止系统过载,还需要在高并发场景下具备低延迟、高吞吐的能力,同时满足多样化的业务需求。

从需求出发,我们需要明确限流的目标,例如按用户、接口或IP维度限制访问频率,确保系统资源的公平使用。其次,选择合适的限流算法至关重要,例如固定窗口计数、滑动窗口、令牌桶或漏桶算法,它们各有优缺点,需要结合业务场景选择合适的方案。同时,分布式场景中的限流不同于单机限流,需要应对多节点协同的问题,这就涉及到分布式存储和一致性方案的设计,比如借助 Redis 或 ZooKeeper 实现全局限流。

需求分析

设计一个高性能的分布式限流系统,需求分析是关键的起点,它直接决定了系统的功能范围、实现方案以及性能要求。

1. 限流目标
  • 保护系统稳定性:避免突发流量(如流量洪峰或恶意攻击)导致系统过载、服务不可用。
  • 优化资源利用:通过限流保证公平分配资源,避免某些用户或接口占用过多系统资源。
  • 提升用户体验:在限流情况下,提供平滑的降级策略,防止用户体验断崖式下滑。
2. 应用场景
  • 接口调用限制:对特定接口的访问频率进行限制,如限制每秒的请求数。
  • 用户行为控制:按用户ID、IP等维度限制访问频率,防止恶意用户滥用服务。
  • 业务场景保护:对热点商品抢购、秒杀活动等场景进行限流,确保核心业务的稳定运行。
  • 分布式服务协调:在多服务协作的场景下,进行全局限流,避免某个服务成为瓶颈。
3. 限流粒度
  • 全局限流:针对系统整体进行流量控制,防止某一类请求占用全部资源。
  • 单服务限流:针对单一服务或接口进行限流,避免资源争夺。
  • 细粒度限流:按用户ID、IP、会话或业务标签设置限流规则,实现个性化限制。
4. 性能要求
  • 高并发支持:在高流量场景下,限流系统需要能够承载数万甚至数十万的并发请求。
  • 低延迟响应:限流判断需要快速完成,避免成为系统瓶颈。
  • 扩展性强:系统需要支持动态扩容,适应流量变化。
5. 功能需求
  • 动态规则配置:限流策略需要支持动态调整,以应对业务变化。
  • 实时监控:需要对限流效果进行可视化展示,提供流量统计、限流次数、超限情况等数据。
  • 支持多种算法:根据业务场景选择固定窗口、滑动窗口、令牌桶、漏桶等限流算法。
  • 分布式协同:支持跨节点的流量控制,保证多节点环境下一致性的限流行为。
6. 可靠性和容错性
  • 限流数据持久化:对于需要长期跟踪的数据(如用户行为记录),支持可靠存储。
  • 故障隔离:限流系统本身不能成为系统的单点故障,需要具备高可用性。
  • 降级策略:当限流系统发生异常时,应提供降级模式,确保核心服务运行。
7. 可扩展性
  • 多租户支持:允许为不同的业务或用户群体设置独立的限流策略。
  • 高并发扩展:系统需要能够通过增加节点或资源来支持更高的并发需求。
  • 规则多样性:支持组合限流规则,如同时对用户、IP、接口进行多维度限制。

限流算法选择

限流算法是分布式限流系统的核心,它直接决定了限流的精准性、性能以及适用场景。选择合适的限流算法需要根据业务需求、系统负载特性和性能指标综合考虑。

1. 固定时间窗口算法
  • 原理:将时间划分为固定的窗口(如1秒、1分钟),统计窗口内的请求数。如果超过限流阈值,直接拒绝超出的请求。
  • 优点:实现简单,适用于大多数限流场景。请求统计只在当前时间窗口内,内存占用小。
  • 缺点:存在突发流量问题:在两个窗口的交界点可能会有瞬时流量激增。
  • 适用场景:接口调用频率控制,如每秒允许最多100次调用。
  • 实现难点:如何高效处理窗口边界的请求统计,避免出现数据竞争。
2. 滑动时间窗口算法
  • 原理:与固定时间窗口类似,但通过在固定时间内动态统计请求数量实现更平滑的限流效果。统计时间窗口是“滑动”的,不会因窗口边界导致瞬时突发。
  • 优点:更精准的限流,无突发流量问题。对流量平滑的控制效果更好。
  • 缺点:实现复杂,需要对时间窗口内的请求进行动态统计(如基于环形数组或时间分片)。内存和计算资源占用较高。
  • 适用场景:高并发场景下对流量平稳性的要求较高的接口。
  • 实现难点:如何实现高效的时间窗口滑动统计,避免引入性能瓶颈。
3. 令牌桶算法
  • 原理:系统以固定速率向令牌桶中添加令牌,请求只有在获取到令牌时才被允许通过。令牌桶容量限制了可处理的突发流量。
  • 优点:支持突发流量:在突发情况下允许短时间内消耗桶中累积的令牌。易于实现平滑的限流控制。
  • 缺点:需要额外的机制来处理令牌的生成和分发。
  • 适用场景:支持短时间突发请求的业务场景,例如电商促销接口、抢购系统。
  • 实现难点:在分布式场景中,需要一致性的令牌分发机制。如何动态调整令牌生成速率以应对流量变化。
4. 漏桶算法
  • 原理:请求被以固定速率处理,不允许突发流量超过预设容量(桶的大小)。请求按顺序进入“漏桶”,多余的请求被丢弃。
  • 优点:保证流量的稳定输出,适合对下游系统有固定流量要求的场景。易于实现流量整形,避免突发对下游系统的冲击。
  • 缺点:不支持突发流量,即使桶内有空间,请求仍需要等待固定速率处理。
  • 适用场景:严格限制流量的场景,如第三方服务调用、带宽限制等。
  • 实现难点:需要精确的计时器或调度器来控制漏桶的出水速率。
5. 基于计数器的限流
  • 原理:通过简单的计数器记录单位时间内的请求数,超出阈值后拒绝请求。
  • 优点:实现简单,性能高,适合轻量级限流。
  • 缺点:存在临界问题:如在单位时间的边界处突发流量仍可能超过设定值。
  • 适用场景:小型系统或流量模式较为稳定的场景。
  • 实现难点:如何精确统计请求数,避免计数器竞争。
6. 动态限流算法
  • 原理:结合实时监控与机器学习,动态调整限流规则,适应流量变化。
  • 优点:自动化限流策略优化,避免人为干预。更精准的流量预测和控制。
  • 缺点:实现复杂,需要依赖数据分析和实时反馈。
  • 适用场景:复杂业务场景和高动态负载环境,如在线游戏、直播平台。
  • 实现难点:需要可靠的实时数据采集和预测模型。如何快速调整限流策略以避免滞后影响。
7. 分布式限流算法
  • 原理:将限流逻辑分布到多节点,通过集中协调(如基于Redis、ZooKeeper、Consul)或去中心化方式实现全局限流。
  • 优点:支持高并发和高可用,适用于分布式系统。
  • 缺点:需要解决分布式环境中的一致性和性能问题。
  • 适用场景:多机房、跨地域的分布式微服务场景。
  • 实现难点:如何在节点间同步限流状态,降低网络开销和一致性问题。
选择算法的关键因素
  1. 流量特性:如是否存在突发流量、请求的分布特性。
  2. 业务优先级:是否需要动态调整限流规则或根据业务维度限流。
  3. 实现复杂度:考虑实现的难度和对系统性能的影响。
  4. 分布式需求:是否需要全局限流及一致性。

分布式架构设计

设计一个高性能的分布式限流系统,需要从分布式架构的特点出发,解决限流过程中遇到的高并发、数据一致性、低延迟等问题。

1. 分布式限流的核心需求
  • 全局限流:在分布式环境中对整个系统的请求进行统一限流控制。
  • 节点级限流:对单个服务节点进行流量控制,避免单点过载。
  • 动态配置:支持限流规则的实时变更,无需重启服务。
  • 高可用性:系统在部分节点故障时仍能稳定运行。
  • 低延迟:限流逻辑不能成为高并发系统的性能瓶颈。
2. 分布式限流的架构设计原则
  • 去中心化:限流逻辑尽量分布到各服务节点,减少集中式瓶颈。
  • 一致性:确保分布式系统中节点共享的限流信息同步一致。
  • 高扩展性:支持动态添加或移除节点,系统性能随之扩展。
  • 容错性:即使某些节点失败,限流机制依然可以发挥作用。
  • 幂等性:限流请求重复处理时,结果保持一致。
3. 分布式限流的关键技术
  1. 分布式存储
    • Redis:使用Redis作为共享存储实现限流的计数器。
      • 实现:Lua脚本保证限流操作的原子性。
      • 优势:性能高,支持数据持久化。
      • 缺点:单点Redis可能成为瓶颈,需设计分布式部署。
    • Consul/Nacos:通过KV存储共享限流规则。
  1. 一致性协议
    • Paxos/Raft:用于分布式节点间的状态同步,保证限流策略的一致性。
    • Redis Cluster:分布式Redis集群保证高可用与一致性。
  1. 分布式锁

利用分布式锁(如基于Redisson)对共享资源进行保护,避免多个节点重复计算限流逻辑。

  1. 消息队列

使用Kafka或RabbitMQ控制流量,消息队列天然具有削峰限流的特性。

    • 适合异步流量限流场景,避免高并发直接冲击核心服务。
  1. API 网关

在网关层(如Spring Cloud Gateway、Nginx)设置限流规则,对外部请求进行预处理,减少后端压力。

  1. 缓存与本地计数
    • 在服务节点中结合本地计数器(如Guava RateLimiter)与分布式缓存。
    • 优势:降低分布式存储的请求频率。
    • 缺点:需解决本地计数器与全局计数器的一致性问题。
  1. 动态配置管理

使用配置中心(如Apollo、Nacos)实现限流规则的动态下发和更新,结合实时监听机制(如WebSocket、长轮询)使配置变更无缝生效。

4. 限流架构的核心模块
  1. 规则管理模块

提供限流规则的配置、存储和动态更新。支持按API、用户、IP、时间窗等维度设置规则。

  1. 流量监控模块

实时统计请求量、平均响应时间、失败率等指标。提供仪表盘监控,方便运维人员查看限流效果。

  1. 限流决策模块

根据规则判断请求是否被允许。提供快速判定逻辑,避免高并发场景下的性能瓶颈。

  1. 存储与同步模块

共享计数器的存储(如Redis)和限流策略的分发(如MQ或配置中心)。确保数据一致性和系统扩展性。

  1. 降级与告警模块

超出限流阈值时触发降级逻辑,如返回错误提示、限速或排队机制。异常流量触发告警,通知运维及时干预。

5. 典型的分布式限流架构实现
  1. 集中式限流
    • 所有流量先经过网关或集中限流服务。
    • 优点:便于管理和维护,限流规则统一。
    • 缺点:集中式服务可能成为性能瓶颈和单点故障。
  1. 分布式限流
    • 各节点独立执行限流逻辑,利用分布式存储同步状态。
    • 优点:高可用、低延迟。
    • 缺点:实现复杂,需解决节点间一致性问题。
  1. 混合式限流

网关层负责全局限流,服务节点负责局部限流。综合利用集中式和分布式的优势。

6. 常见的优化策略
  1. 局部限流优先

请求优先在本地节点执行限流逻辑,减少分布式存储访问压力。使用本地缓存或计数器结合布隆过滤器过滤无效流量。

  1. 流量预估

对历史流量数据进行建模,预测未来流量峰值,动态调整限流阈值。

  1. 层级限流

在网关、应用服务、数据库等不同层级分别设置限流规则,避免流量集中在某一层。

  1. 熔断与降级

限流规则触发后,快速熔断异常请求,并提供降级服务,避免整体服务被拖垮。

  1. 削峰填谷

通过队列缓冲高峰流量,延迟处理请求。

核心技术选型

在设计高性能分布式限流系统时,核心技术选型直接影响系统的性能、可用性和复杂度。技术选型需要结合业务需求、流量规模以及团队技术栈。

1. 存储层选型
  1. Redis
    • 适用场景:高并发流量计数器、全局限流状态存储。
    • 优势
      • 高性能,支持百万级QPS。
      • Lua脚本可以实现计数器的原子性操作。
      • 分布式支持(Redis Cluster)保证高可用性和扩展性。
    • 劣势
      • Redis单实例易成为瓶颈,需搭建分布式集群。
      • 对超高并发场景下的写入压力需结合本地缓存优化。
  1. MongoDB/Cassandra
    • 适用场景:大规模规则存储或需要历史请求记录的场景。
    • 优势:支持分布式存储和查询,扩展性强。
    • 劣势:性能相对Redis较低,适合规则配置存储而非实时计数。
  1. 内存型数据库
    • 如Aerospike、Memcached。
    • 适用场景:低延迟请求限流。
    • 优势:更低的访问延迟。
    • 劣势:功能不如Redis丰富,生态较小。
  1. 分布式文件系统
    • 如HDFS。
    • 适用场景:批量限流记录存储(不适合实时限流)。
    • 优势:适合大数据场景。
    • 劣势:高延迟,不适合实时性要求高的限流。
2. 限流算法选型
  1. 固定窗口算法
    • 简单易实现,适用于低并发或流量较均匀的场景。
    • 缺点:可能产生“临界突发”。
  1. 滑动窗口算法
    • 优势:流量统计更平滑,适用于高并发业务。
    • 实现:结合Redis或本地缓存存储时间窗口内的请求数据。
  1. 令牌桶算法
    • 优势:控制流量速率,支持流量突发。
    • 实现:本地计数+分布式同步,或基于Redis的Lua脚本。
  1. 漏桶算法
    • 优势:平滑请求流量,适用于流量稳定的场景。
    • 实现:在服务端队列中模拟漏桶逻辑。
  1. 混合算法
    • 应用场景:不同层级的限流需求。
    • 实现:结合滑动窗口统计+令牌桶速率控制。
3. 通信与同步选型
  1. 配置中心
    • 技术选型:Nacos、Apollo、Consul。
    • 适用场景:限流规则的动态下发与更新。
    • 优势:支持动态刷新、分布式管理。
    • 实现
      • 配置中心存储限流规则。
      • 服务节点实时监听配置变更并同步应用。
  1. 分布式一致性协议
    • 技术选型:Raft、Paxos、Zookeeper。
    • 适用场景:限流计数器的分布式同步。
    • 优势:数据一致性高。
    • 劣势:增加同步延迟,不适用于极高并发的实时限流场景。
  1. 消息队列
    • 技术选型:Kafka、RabbitMQ、RocketMQ。
    • 适用场景:流量削峰填谷,异步限流。
    • 优势
      • 高效缓冲流量。
      • 可扩展性强,支持高并发。
    • 劣势:适用于异步场景,不适合对响应时间要求高的同步限流。
4. 网关选型
  1. Spring Cloud Gateway
    • 适用场景:基于Spring生态的微服务限流。
    • 优势:与Spring生态无缝集成,支持动态路由和内置限流。
    • 劣势:性能不如专用网关。
  1. Nginx
    • 适用场景:流量入口的全局限流。
    • 优势:成熟高效,支持Lua扩展实现自定义限流。
    • 劣势:复杂限流逻辑需要结合后端实现。
  1. Envoy
    • 适用场景:Service Mesh中实现流量控制。
    • 优势:轻量、高性能,支持分布式限流策略。
    • 劣势:配置和调试复杂度高。
  1. API Gateway 服务
    • 技术选型:AWS API Gateway、Kong。
    • 适用场景:云原生架构中统一的限流与流量控制。
    • 优势:开箱即用的限流功能。
    • 劣势:与自定义业务逻辑的集成能力有限。
5. 本地优化技术选型
  1. 缓存技术
    • 技术选型:Guava Cache、Caffeine。
    • 适用场景:减少分布式存储的频繁访问。
    • 优势:本地限流性能高,延迟低。
    • 实现
      • 本地计数器结合布隆过滤器,过滤大部分无效流量。
      • 配合全局限流计数,解决数据一致性问题。
  1. 线程池管理
    • 技术选型:Java自带的线程池、Disruptor。
    • 适用场景:流量整形、异步处理。
    • 优势:提高吞吐量,避免服务崩溃。
    • 实现:为每个请求分配线程池,动态调整线程池大小。
6. 监控与日志技术选型
  1. 实时监控
    • 技术选型:Prometheus + Grafana。
    • 适用场景:实时查看限流效果和流量状态。
    • 优势:实时性强,支持多维度数据展示。
    • 实现:将限流数据通过Exporter暴露给Prometheus。
  1. 分布式链路跟踪
    • 技术选型:SkyWalking、Zipkin、Jaeger。
    • 适用场景:分析限流瓶颈,优化系统性能。
    • 优势:清晰的调用链路,快速定位问题。
    • 实现:在限流逻辑中埋点,监控关键流程。
  1. 日志系统
    • 技术选型:ELK Stack、Fluentd。
    • 适用场景:记录限流规则的执行日志。
    • 优势:高效存储和检索,便于问题追踪。

系统实现与优化

构建一个高性能分布式限流系统,除了理论设计外,还需要注重实际的系统实现和运行中的性能优化。限流系统不仅要确保流量控制的精准性,还要尽量减少对业务系统性能的影响。

系统实现
  1. 架构实现
    • 分层设计
      • 入口层限流:在网关(如Nginx、Spring Cloud Gateway)中实现全局限流,对流量进行第一层拦截。
      • 服务层限流:在具体服务内进行更细粒度的接口或用户级限流。
      • 客户端限流:将部分限流逻辑前移到客户端,减少服务端压力(如请求前置校验)。
    • 分布式架构:通过Redis Cluster或分布式数据库存储限流状态,确保多节点间的限流规则一致性。使用分布式锁或一致性协议(如Raft)确保多实例限流逻辑同步。
  1. 限流规则存储
    • 动态配置:使用配置中心(如Nacos、Apollo)动态存储限流规则,支持规则实时下发与更新。
    • 规则分级:按用户、IP、接口、服务等维度设置多级限流规则。支持静态规则和动态规则(如流量峰值预测调整)。
  1. 核心限流逻辑
    • 限流计数器:使用Redis的原子操作(如INCR和Lua脚本)实现分布式计数器。滑动窗口限流通过将请求时间存储为有序集合,按窗口边界动态计算请求总量。
    • 令牌桶算法实现:使用Redis的GETSET结合Lua脚本实现令牌生成与消费的原子操作。本地实现令牌桶算法,通过定时任务为桶添加令牌。
    • 漏桶算法实现:实现漏桶队列,按照固定速率处理队列中的请求。
  1. 网关限流
    • 静态限流:配置固定的限流规则(如Nginx的限流模块、Spring Cloud Gateway的内置限流过滤器)。
    • 动态限流:使用网关的自定义过滤器,通过实时监控和配置中心动态调整限流规则。
系统优化
  1. 性能优化
    • 缓存机制:使用本地缓存(如Caffeine)减少频繁访问分布式存储。结合布隆过滤器过滤无效请求,减少限流计数器的压力。
    • 批量操作:限流计数器的更新采用批量操作(如每秒一次批量写入Redis),降低分布式存储的写操作频率。
    • 减少网络通信开销:在本地缓存部分限流状态,优先进行本地校验,减少与分布式存储之间的通信。
  1. 高可用优化
    • 分布式存储高可用性:Redis集群启用主从模式与哨兵机制,确保节点故障时自动切换。
    • 服务降级与熔断:在限流系统本身发生故障时,启用服务降级逻辑,确保业务系统的核心功能可用。
    • 限流规则冗余备份:将重要的限流规则以静态配置备份至各服务节点,在配置中心不可用时启用本地规则。
  1. 系统弹性扩展
    • 动态扩展节点:使用容器编排工具(如Kubernetes)自动扩展限流服务节点,平衡流量压力。
    • 限流分片:按用户或接口分片,将限流逻辑分布到多个节点,避免单点过载。
  1. 监控与预警
    • 实时监控:通过Prometheus采集限流指标(如请求通过率、拒绝率)并在Grafana中可视化。
    • 日志分析:使用ELK Stack记录限流日志,分析限流拒绝请求的分布与原因。
    • 动态调整:根据监控数据,动态调整限流策略。例如,当流量峰值时,适当放宽限流规则以提高系统吞吐量。
  1. 用户体验优化
    • 限流提示:在拒绝请求时返回详细的错误信息(如“请求过多,请稍后再试”),优化用户体验。
    • 排队机制:实现请求排队,当请求超出限流阈值但仍在服务容量内时,将请求进入排队队列而非直接拒绝。
优化后的优势
  1. 高性能:结合本地缓存和分布式存储,确保系统处理海量并发请求的能力。
  2. 高可用性:通过冗余设计和故障切换机制,避免限流系统成为单点故障。
  3. 弹性与灵活性:支持动态调整规则和弹性扩展节点,应对流量峰值。
  4. 可观测性:通过实时监控和日志分析,快速定位性能瓶颈并优化。

想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长

Java技术小馆官网https://www.yuque.com/jtostring

相关文章:

设计一个高性能的分布式限流系统

设计一个高性能的分布式限流系统 在现代分布式系统中,流量控制是保障系统稳定性和高可用性的关键技术之一。随着用户规模的增长和业务需求的复杂化,系统往往需要面对突发流量或恶意攻击等场景,这就对限流机制提出了更高的要求。一套高性能的…...

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯(飞控部分)六.移植2.4g通讯(遥控部分)七.通讯模块的完成(遥控部分) 一.Si24Ri原理图 S…...

【Android】RuntimeShader 应用

1 简介 RuntimeShader 是 Android 13(T)中新增的特性,用于逐像素渲染界面,它使用 AGSL(Android Graphics Shading Language)编写着色器代码,底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…...

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...

jQuery从入门到应用:选择器、DOM与Ajax综合指南

文章目录 前言jQuery对象1、jQuery的使用在需要使用jQuery的页面引入Js文件使用jQuery选择页面元素并获取其文本内容 2、jQuery包装集与Dom对象DOM对象和jQuery对象的选择及互相转换 jQuery对象关键点说明: jQuery选择器1、基础选择器关键点说明 2、层次选择器关键点…...

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…...

手搓智能音箱——语音识别及调用大模型回应

一、代码概述 此 Python 代码实现了一个语音交互系统&#xff0c;主要功能为监听唤醒词&#xff0c;在唤醒后接收用户语音问题&#xff0c;利用百度语音识别将语音转换为文本&#xff0c;再调用 DeepSeek API 获取智能回复&#xff0c;最后使用文本转语音功能将回复朗读出来。 …...

Modbus通信协议基础知识总结

1. 数据类型与存储区分类 Modbus协议将数据分为四类存储区&#xff0c;通过存储区代号区分&#xff1a; 输出线圈&#xff08;0x&#xff09;&#xff1a;可读写&#xff0c;对应二进制开关量&#xff08;如继电器状态&#xff09;&#xff0c;地址范围000001-065536&#xff…...

vue3 + css 列表无限循环滚动+鼠标移入停止滚动+移出继续滚动

1.动画文件.vue <template><div class"dashboard" click"setFullScreen"><div class"warp-box"><el-scrollbar ref"scrollRef" height"100%" scroll"handelScroll"><div class"…...

使用 CryptoJS 实现 AES 解密:动态数据解密示例

在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...

Go语言对于MySQL的基本操作

一.下载依赖 终端中输入&#xff1a; go get -u github.com/go-sql-driver/mysql 导入包 import ("database/sql"_ "github.com/go-sql-driver/mysql" ) 二.案例 package main//go get-u github.com/go-sql-driver/mysql 获取驱动 import ("databa…...

AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)

AndroidStudio下载安装&#xff0c;环境部署以及常见问题解决&#xff01;&#xff01;&#xff01; 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …...

开源免费一句话生成儿童故事视频核心思想解析

再看一个演示视频&#xff0c;学会核心思想后&#xff0c;可以打造自己的内容生成工具&#xff0c;后文有基于飞书多维表格的实现效果&#xff1a; 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具&#xff0c;可根据用户输入的主题&#xff0c;快速…...

数据结构——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型&#xff1a; 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…...

Kali Linux汉化教程:轻松设置中文界面

1.打开终端 2.输入sudo dpkg-reconfigure locales&#xff0c;回车&#xff0c;输入密码&#xff0c;回车 sudo dpkg-reconfigure locales 3.往下滑&#xff0c;滑到底&#xff0c;找到‘zh_CN.UTF-8 UTF-8’,回车 4.选择‘zh_CN.UTF-8’,回车 5.没有 ‘zh_CN.UTF-8’选项的特…...

分布式锁: 并发时,redis如何避免删别人的锁

在使用Redis实现分布式锁的时候&#xff0c;如何避免在并发情况下误删别人的锁。首先&#xff0c;分布式锁的基本概念&#xff1a;是多个客户端在访问共享资源时&#xff0c;通过某种机制来确保同一时间只有一个客户端能持有锁。 Redis通常用SET命令加上NX选项来创建锁&#xf…...

Leetcode 160 Intersection of Two Linked Lists

题意 给定两个链表&#xff0c;找这两个链表第一个公共节点&#xff0c;如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表&#xff08;记录为表A&#xff0c;表B&#xff09;的表…...

【八股文】从浏览器输入一个url到服务器的流程

1.url解析与DNS解析 浏览器解析用户输入的URL&#xff0c;提取协议&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路径等信息 浏览器首先检查本地DNS缓存和系统DNS缓存&#xff0c;若未命中&#xff0c;查询本地hosts文件 最后递归查询向本地DNS服务器发起请求&#xff…...

C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval

目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…...

[HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议

由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理 源码分析 定位到代码 isset($_GET[wrappers]) ? include("php://".$_GET[wrappers]) : ; 与前几关发生变化的就是 php:// 解题分析 这一关要求我们使用 php协议 php:// 协议 php://filte…...

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…...

cmake结合qt开发界面程序实例

在使用 CMake 构建 Qt 界面应用程序时&#xff0c;你需要设置 CMakeLists.txt 文件来指定项目配置、源文件、库依赖等。以下是一个简单的示例&#xff0c;展示了如何创建一个包含 Qt 界面&#xff08;使用 QWidget&#xff09;的 Qt 项目&#xff0c;并使用 CMake 进行构建。 …...

vue3二次封装tooltip实现el-table中的show-overflow-tooltip效果

开发过程中遇到需要根据后端返回的数据长度来判断是否需要使用el-tooltip的情况&#xff0c;想到el-table里面就有这种交互效果&#xff0c;如果不论文字是否超出容器长度都展示tooltip的话&#xff0c;交互效果难免会差很多&#xff0c;所以二次封装了这个组件&#xff1a; 给…...

如何创建并保存HTML文件?零基础入门教程

原文&#xff1a;如何创建并保存HTML文件&#xff1f;零基础入门教程 | w3cschool笔记 本文将以Windows系统为例&#xff0c;教你用最简单的记事本创建并保存第一个HTML网页。 &#x1f4dd; 第一步&#xff1a;准备工具 文本编辑器&#xff1a;使用系统自带的记事本&#xff…...

React19源码系列之FiberRoot节点和Fiber节点

在上一篇文章&#xff0c;看了createRoot函数的大致流程。 createContainer函数创建并返回了FiberRoot 。FiberRoot是由createFiberRoot函数创建&#xff0c; createFiberRoot函数还将 FiberRoot和 根Fiber 通过current属性建立起了联系。将FiberRoot作为参数传给 ReactDOMRoo…...

每天看一篇漏洞报告

前言&#xff1a; 内容来源于乌云漏洞 今日思考xss漏洞&#xff0c; 今天看到一篇文章&#xff0c;里面详细说了xss的绕过技巧&#xff0c;虽然时间久了&#xff0c;没有去尝试&#xff0c;待会有时间去测试一下 以下是整理后的文章&#xff0c;原文在下面 文章链接&#…...

采用贝塞尔函数,进行恒定束宽波束形成算法

matlab采用贝塞尔函数&#xff0c;进行恒定束宽波束形成算法 beselle.m , 1452 20191225160928.png , 43700 20191225160935.png , 45238 20191225161010.png , 76862...

TCP协议的多线程应用、多线程下的网络编程

DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式&#xff0c;一个服务端对应一个客户端&#xff0c;实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类&#xff0c;多线程接收socket对象 public class ServerSocketNable implements Run…...

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…...