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

基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战

🧠 基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战


目录

  • 🧠 基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战
    • 🧰 模块结构概览
    • 📦 各模块注册代码示例
      • DomainModule
      • ApplicationModule
      • HttpApiModule
      • DbMigratorModule
    • 🧱 架构图 & 概念说明
    • ✍️ 核心代码实践
      • 1. 聚合根 & 仓储接口
      • 2. CacheKeys 常量
      • 3. 命令 + 验证器 + 幂等处理
      • 4. Pipeline 行为示意图
      • 5. ValidationBehavior + LoggingBehavior
      • 6. 查询缓存 + 布隆过滤器
      • 部署架构示意图
    • 🧪 自动化测试示例(Testcontainers)
      • 测试流程图
    • 📦 Docker Compose


🧰 模块结构概览

Abp.CqrsDemo
├── src
│   ├── Abp.CqrsDemo.Domain
│   ├── Abp.CqrsDemo.Application
│   ├── Abp.CqrsDemo.HttpApi
│   └── Abp.CqrsDemo.DbMigrator
└── tests└── Abp.CqrsDemo.Tests
  • Domain:实体、聚合根、领域事件、仓储接口
  • Application:命令、查询、MediatR 处理器、DTO、Pipeline Behaviors、CacheKeys
  • HttpApi:控制器、外部配置绑定
  • DbMigrator:数据库初始化与迁移工具

📦 各模块注册代码示例

DomainModule

[DependsOn(typeof(AbpDddDomainModule))]
public class CqrsDemoDomainModule : AbpModule
{
}

ApplicationModule

[DependsOn(typeof(CqrsDemoDomainModule))]
public class CqrsDemoApplicationModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// CQRS & Validationcontext.Services.AddMediatR(typeof(CqrsDemoApplicationModule).Assembly);context.Services.AddValidatorsFromAssembly(typeof(CqrsDemoApplicationModule).Assembly);// Pipeline Behaviorscontext.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));context.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));// 分布式缓存注册(Application 层即可依赖)context.Services.AddDistributedCache<OrderDto>();}
}

HttpApiModule

[DependsOn(typeof(CqrsDemoApplicationModule))]
public class CqrsDemoHttpApiModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){var configuration = context.Services.GetConfiguration();// Redis 连接与缓存context.Services.AddStackExchangeRedisCache(options =>{options.Configuration = configuration["Redis:Connection"];});// 控制器托管context.Services.AddControllers();}
}

DbMigratorModule

[DependsOn(typeof(AbpEntityFrameworkCoreModule))]
public class CqrsDemoDbMigratorModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){context.Services.AddAbpDbContext<CqrsDemoDbContext>(options =>{options.AddDefaultRepositories(includeAllEntities: true);});// 设置 EF Core 数据库提供者Configure<AbpDbContextOptions>(options =>{options.UseSqlServer(); // 或 UseNpgsql()});}
}

🧱 架构图 & 概念说明

Command/Query
API 控制器
MediatR Dispatcher
CommandHandler
QueryHandler
EFCore 写库
Redis 查询缓存
  • 命令 负责状态更改
  • 查询 可接入 Redis 或 读库
  • Pipeline:Validation → Logging → Handler

✍️ 核心代码实践

1. 聚合根 & 仓储接口

public class Order : AggregateRoot<Guid>
{public string ProductId { get; private set; }public int Quantity { get; private set; }protected Order() { } // EF Core 兼容public Order(Guid id, string productId, int quantity){Id = id;ProductId = productId;Quantity = quantity;}// 业务规则示例public void ChangeQuantity(int newQty){if (newQty <= 0) throw new BusinessException("Quantity must be positive");Quantity = newQty;}
}public interface IOrderRepository : IRepository<Order, Guid>
{
}

2. CacheKeys 常量

public static class CacheKeys
{public const string OrderById = "order:{0}";
}

3. 命令 + 验证器 + 幂等处理

public record CreateOrderCommand(Guid OrderId, string ProductId, int Quantity) : IRequest<Guid>;public class CreateOrderValidator : AbstractValidator<CreateOrderCommand>
{public CreateOrderValidator(){RuleFor(x => x.ProductId).NotEmpty();RuleFor(x => x.Quantity).GreaterThan(0);}
}public class CreateOrderHandler : IRequestHandler<CreateOrderCommand, Guid>
{private readonly IOrderRepository _repo;private readonly IDistributedIdempotencyService _idempotency;public CreateOrderHandler(IOrderRepository repo, IDistributedIdempotencyService idempotency){_repo = repo;_idempotency = idempotency;}public async Task<Guid> Handle(CreateOrderCommand request, CancellationToken ct){return await _idempotency.ExecuteAsync(request.OrderId.ToString(), async () =>{var order = new Order(request.OrderId, request.ProductId, request.Quantity);await _repo.InsertAsync(order, cancellationToken: ct);return order.Id;});}
}

4. Pipeline 行为示意图

Client PipelineBehaviors Handler Send Request ValidationBehavior LoggingBehavior Handle Command/Query Return Response Client PipelineBehaviors Handler

5. ValidationBehavior + LoggingBehavior

public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>where TRequest : notnull
{private readonly IEnumerable<IValidator<TRequest>> _validators;public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators) => _validators = validators;public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken ct){var context = new ValidationContext<TRequest>(request);var results = await Task.WhenAll(_validators.Select(v => v.ValidateAsync(context, ct)));var failures = results.SelectMany(r => r.Errors).Where(f => f != null).ToList();if (failures.Any()) throw new ValidationException(failures);return await next();}
}public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger) => _logger = logger;public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken ct){_logger.LogInformation("Handling {Request} with payload: {@Payload}", typeof(TRequest).Name, request);var sw = Stopwatch.StartNew();var response = await next();sw.Stop();_logger.LogInformation("Handled {Request} in {Elapsed}ms with response: {@Response}", typeof(TRequest).Name, sw.ElapsedMilliseconds, response);return response;}
}

6. 查询缓存 + 布隆过滤器

public class GetOrderByIdHandler : IRequestHandler<GetOrderByIdQuery, OrderDto>
{private readonly IOrderRepository _repo;private readonly IDistributedCache<OrderDto> _cache;private readonly IBloomFilter _bloomFilter;public GetOrderByIdHandler(IOrderRepository repo,IDistributedCache<OrderDto> cache,IBloomFilter bloomFilter){_repo = repo;_cache = cache;_bloomFilter = bloomFilter;}public async Task<OrderDto> Handle(GetOrderByIdQuery request, CancellationToken ct){if (!_bloomFilter.Contains(request.OrderId))throw new EntityNotFoundException(typeof(Order), request.OrderId);var cacheKey = string.Format(CacheKeys.OrderById, request.OrderId);return await _cache.GetOrAddAsync(cacheKey,async () =>{var order = await _repo.FindAsync(request.OrderId, ct);if (order == null) throw new EntityNotFoundException(typeof(Order), request.OrderId);return new OrderDto(order.Id, order.ProductId, order.Quantity);},options =>{options.SlidingExpiration = TimeSpan.FromMinutes(5);options.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);});}
}```markdown---## 🚀 部署与运行(Program.cs)```csharp
var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;// 外部化配置
builder.Host.ConfigureAppConfiguration((ctx, cfg) =>
{cfg.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).AddEnvironmentVariables();
});// EF Core & DbContext
builder.Services.AddAbpDbContext<CqrsDemoDbContext>(options =>
{options.AddDefaultRepositories();
});
builder.Services.Configure<AbpDbContextOptions>(options =>options.UseSqlServer(config.GetConnectionString("Default")));// Redis 缓存 & 布隆过滤器
builder.Services.AddStackExchangeRedisCache(opts =>opts.Configuration = config["Redis:Connection"]);
builder.Services.AddSingleton<IBloomFilter>(_ =>new BloomFilter(expectedItemCount: 10000, falsePositiveRate: 0.01));// Health Checks
builder.Services.AddHealthChecks().AddDbContextCheck<CqrsDemoDbContext>("Database").AddRedis(config["Redis:Connection"], name: "Redis");// Polly HTTP 客户端
builder.Services.AddHttpClient("order").AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(Math.Pow(2, i)))).AddTransientHttpErrorPolicy(p => p.CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)));var app = builder.Build();
app.MapHealthChecks("/health/live", new HealthCheckOptions { Predicate = _ => false });
app.MapHealthChecks("/health/ready");app.MapControllers();
app.Run();

部署架构示意图

HTTP
Route
Read/Write
Cache
Client
Ingress/Nginx
API Pods
PostgreSQL
Redis

🧪 自动化测试示例(Testcontainers)

using DotNet.Testcontainers.Builders;
using DotNet.Testcontainers.Containers;public class CustomWebAppFactory : WebApplicationFactory<Program>, IAsyncLifetime
{private readonly PostgreSqlTestcontainer _postgres;public CustomWebAppFactory(){_postgres = new TestcontainersBuilder<PostgreSqlTestcontainer>().WithDatabase(new PostgreSqlTestcontainerConfiguration{Database = "demo",Username = "sa",Password = "sa"}).Build();}public async Task InitializeAsync() => await _postgres.StartAsync();public async Task DisposeAsync() => await _postgres.DisposeAsync();protected override void ConfigureWebHost(IWebHostBuilder builder){builder.ConfigureAppConfiguration((ctx, cfg) =>{cfg.AddInMemoryCollection(new Dictionary<string, string>{["ConnectionStrings:Default"] = _postgres.ConnectionString});});}
}public class OrderApiTests : IClassFixture<CustomWebAppFactory>
{private readonly HttpClient _client;public OrderApiTests(CustomWebAppFactory factory) => _client = factory.CreateClient();[Fact]public async Task Should_Create_Order_Successfully(){var command = new { orderId = Guid.NewGuid(), productId = "A001", quantity = 1 };var response = await _client.PostAsJsonAsync("/api/orders", command);response.EnsureSuccessStatusCode();}
}

测试流程图

Test 初始化
启动 Postgres 容器
配置 WebHost
运行集成测试
销毁容器

📦 Docker Compose

version: "3.9"
services:api:build: .ports:- "5000:80"db:image: postgresenvironment:POSTGRES_DB: demoPOSTGRES_USER: saPOSTGRES_PASSWORD: saredis:image: redis

相关文章:

基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战

&#x1f9e0; 基于 ABP vNext CQRS MediatR 构建高可用与高性能微服务系统&#xff1a;从架构设计到落地实战 目录 &#x1f9e0; 基于 ABP vNext CQRS MediatR 构建高可用与高性能微服务系统&#xff1a;从架构设计到落地实战&#x1f9f0; 模块结构概览&#x1f4e6; 各…...

java云原生实战之graalvm 环境安装

windows环境安装 在Windows环境下安装GraalVM并启用原生镜像功能时&#xff0c;需要Visual Studio的组件支持。具体要点如下&#xff1a; 核心依赖&#xff1a; 需要安装Visual Studio 2022或更新版本&#xff0c;并确保勾选以下组件&#xff1a; "使用C的桌面开发"…...

Python 包管理工具uv依赖分组概念解析

在 Python 包管理工具 uv 中&#xff0c;依赖分组&#xff08;如 dev、prod&#xff09;是一种将项目的不同依赖按用途分类管理的机制。通过分组&#xff0c;开发者可以清晰地分离生产环境&#xff08;运行项目所需的核心依赖&#xff09;和开发环境&#xff08;仅在开发阶段使…...

C语言-9.指针

9.1指针 9.1-1取地址运算:&运算符取得变量的地址 运算符& scanf(“%d”,&i);里的&获取变量的地址,它们操作数必须是变量int i;printf(“%x”,&i);地址的大小是否与int相同取决于编译器int i;printf(“%p”,&i); &不能取的地址不能对没有地址的…...

GitHub 自动认证教程

## 简介 在使用 GitHub 时&#xff0c;为了避免每次提交代码都需要输入用户名和密码&#xff0c;我们可以使用 SSH 密钥进行自动认证。本教程将详细介绍如何设置 SSH 密钥并配置 GitHub 自动认证。 ## 步骤一&#xff1a;检查现有 SSH 密钥 首先&#xff0c;检查您的电脑是否…...

labelme的安装与使用(以关键点检测为例)、labelme格式标签转换

注&#xff1a;labelme 和 labelImg 是两款不同的数据标注工具。labelme 的 Github 官方地址&#xff1a; https://github.com/wkentaro/labelmehttps://github.com/wkentaro/labelme 参考笔记&#xff1a; Labelme标注工具安装及使用_labelme安装及使用教程-CSDN博客 学习视…...

【Git】远程操作

Git 是一个分布式版本控制系统 可以简单理解为&#xff0c;每个人的电脑上都是一个完整的版本库&#xff0c;这样在工作时&#xff0c;就不需要联网 了&#xff0c;因为版本库就在自己的电脑上。 因此&#xff0c; 多个人协作的方式&#xff0c;譬如说甲在自己的电脑上改了文件…...

密码学实验

密码学实验二 一、实验目的&#xff08;本次实验所涉及并要求掌握的知识点&#xff09; 掌握RSA算法的基本原理并根据给出的RSA算法简单的实现代码源程序,以及能够使用RSA对文件进行加密。掌握素性测试的基本原理&#xff0c;并且会使用Python进行简单的素性测试以及初步理解…...

nettrace工具介绍

简介 仓库地址&#xff1a; https://github.com/OpenCloudOS/nettrace 背景&#xff1a; 在云原生场景中&#xff0c;linux系统中的网络部署变得越来越复杂&#xff0c;一个tcp连接&#xff0c;从客户端到服务器&#xff0c;中间可能要经过复杂的NAT、GRE、IPVS等过程&#x…...

Jenkins+Docker+Harbor快速部署Spring Boot项目详解

JenkinsDockerHarbor快速部署Spring Boot项目详解 Jenkins、Docker和Harbor是现代DevOps流程中的核心工具&#xff0c;结合使用可以实现自动化构建、测试和部署。下面我将详细介绍如何搭建这个集成环境。 一、各工具的核心作用 Jenkins 自动化CI/CD工具&#xff0c;负责拉取代…...

Windows 安装Anaconda

一、下载Anaconda 1.阿里云镜像&#xff1a; https://developer.aliyun.com/mirror/ 2.中科大镜像&#xff1a; https://mirrors.ustc.edu.cn/ 二、配置环境变量 Windows‌&#xff1a; 1.右键“此电脑” → “属性” → “高级系统设置” → “环境变量”25&#xff1b…...

《微机原理与接口技术》第 8 章 常用接口芯片

8.1 可编程定时/计数器8253/8254 8.1.1 8253的外部引脚及内部结构 8.1.2 8253的工作方式 8.1.3 8253的方式控制字和读/写操作 8.1.4 8253的初始化编程及应用 8.1.5 可编程定时/计数器8254 …… 8.2 可编程并行接口8255 8.2.1 并行通信的概念 &#xff08;1&#xff09…...

upload-labs靶场通关详解:第12-13关

目录 第12关&#xff1a;get00截断 一、分析源代码 二、解题思路 三、解题步骤 第13关&#xff1a;post00截断 一、分析源代码 二、解题思路 三、解题步骤 第12关&#xff1a;get00截断 一、分析源代码 $is_upload false; $msg null; if(isset($_POST[submit])){$ex…...

YOLO模型初次训练体验(+实测)

1.训练目的 做一个简单的示例,本次训练的目的希望模型能够识别桌面的两个图标。(主要是方便准备数据) 2.数据准备 安装一个截图软件,在桌面不同分辨率,不同背景的情况下,随机调整两个图标的位置并截图保存。 原始图片: 先为截图批量重命名: 使用重命名工具,设置命…...

OSA实战笔记二

本文是我在实际项目开发中&#xff0c;总结和归纳的笔记&#xff0c;主要记录了OSA常用的参数释义。 OSA的Params 1、Scroll Sensivity 对⿏标滚轮&#xff08;或类似&#xff09;输⼊的敏感度&#xff0c;与通过滚动条拖动或滚动⽆关。 2、Scroll Sensivity On X Axis 对…...

OSI 网络七层模型中的物理层、数据链路层、网络层

一、OSI 七层模型 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 1. 物理层&#xff08;Physical Layer&#xff09; 功能&#xff1a;传输原始的比特流&#xff08;0和1&#xff09;&#xff0c;通过物理介质&#xff08;如电缆、光纤、无线电波&#xff09;…...

如何自学FPGA设计?

众所周知&#xff0c;FPGA设计自学难度不小&#xff0c;更不存在速成的捷径。这里简单说一下学习的规划&#xff0c;希望能给入门者提供一些方向。 学会相应的知识 不论是科班毕业还是理工科专业出身&#xff0c;想要入行FPGA开发&#xff0c;基础知识必须扎实。尤其是在高校…...

leetcode 合并区间 java

用 ArrayList<int[]> merged new ArrayList<>();来定义数组的list将数组进行排序 Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));如果前面的末尾>后面的初始&#xff0c;那么新的currentInterval的末尾这两个数组末尾的最大值&#xff0c;即…...

如何将内网的IP地址映射到外网?常见方法及详细步骤

自己计算机搭建网络端口服务&#xff0c;或公司内部本地服务器部署项目后&#xff0c;如果同时需要提供异地互联网上连接使用&#xff0c;就需要将内网IP地址映射到外网上。 将本地网络的内网 IP 地址映射到外网&#xff0c;通常是为了允许外部网络访问内网中的特定服务&#…...

Node.js AI 通义灵码 VSCode 插件安装与功能详解

Node.js 作为基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;使 JavaScript 成为后端开发的重要选择。 在 Node.js 开发中&#xff0c;使用高效的工具可以显著提升开发效率和代码质量。 通义灵码作为一款智能编码助手&#xff0c;为 Node.js 开发者提供了强大的支持。 …...

Linux中的 I/O 复用机制 select

第一部分&#xff1a;select 基本概念 1.1. I/O 复用的提出&#xff1a;并发处理的挑战 在传统的网络服务模型中&#xff0c;服务器为每一个客户端连接创建一个独立的线程或者进程来处理。这种模式在并发连接数量较少时或许尚能应对&#xff0c;但当并发量显著增大时&#xf…...

再议AOI算法

AOI算法优化 首先&#xff0c;需要知道AOI&#xff08;Area of Interest&#xff09;是什么。AOI通常用于游戏或者分布式系统中&#xff0c;用来管理玩家或对象的视野范围&#xff0c;只关注感兴趣区域内的其他对象&#xff0c;减少不必要的通信和数据传输。 整理思路 如文章…...

Unreal5 从入门到精通之如何实现 离线语音识别

文章目录 前言将语言服务器作为外部进程运行UE 项目设置开始捕获语音同时运行服务器进程和游戏进程将 SoundWave 而不是麦克风作为输入将数据发送到语言服务器节点的工作原理详细文档前言 今天我们要说的是一个语音转文本(STT)的插件 Offline Speech Recognition, 它支持离线…...

form-create-designer中$inject参数的数据结构及各项属性说明

FcDesigner 是一款基于Vue的开源低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 …...

WHAT - CSS 中的 min-height

文章目录 语法常见用途1. 防止元素被压缩得太小2. 配合 Flexbox 保证高度3. 用于内容区域动态撑高但不塌陷 与其他属性的区别提示 在 WHAT - CSS 中的 min-width 中我们已经详细介绍过 width。对于高度&#xff0c; CSS 同样提供一个 min-height. min-height 是 CSS 中用于设置…...

畅游Diffusion数字人(30):情绪化数字人视频生成

畅游Diffusion数字人(0)&#xff1a;专栏文章导航 前言&#xff1a;仅从音频生成此类运动极具挑战性&#xff0c;因为它在音频和运动之间存在一对多的相关性。运动视频的情绪是多元化的选择&#xff0c;之前的工作很少考虑情绪化的数字人生成。今天解读一个最新的工作FLOAT&…...

PLC系统中开关量与模拟量信号解析

引言 在现代工业自动化进程中&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;凭借其强大的功能与灵活性&#xff0c;成为工业控制系统的核心设备。PLC能够高效、精准地控制工业生产流程&#xff0c;很大程度上依赖于其对开关量和模拟量信号的处理能力。深入理解这两…...

Qt中解决Tcp粘包问题

Qt中解决Tcp粘包问题 Qt中解决Tcp粘包问题——以文件发送为例服务器端客户端效果演示注意点 Qt中解决Tcp粘包问题——以文件发送为例 创建的工程如下图所示&#xff1a; 服务器端 界面的布局以及名称如下图所示&#xff1a; 并且在Qt中增加网络模块 QT core gui n…...

Qt调用librdkafka

Qt调用librdkafka Windows系统编译Qt使用的kafka(librdkafka) VS2017编译librdkafka 2.1.0 经过上面的步骤我已经编译好了librdkafka库,我编译的主要十release版的,需要debug版的小伙伴编译的时候要留意一下。 接下来就是调用我们编译的kafka库了。 一、环境介绍 Qt:…...

深入解析Node.js文件系统(fs模块):从基础到进阶实践

文章目录 引言一、核心能力解析1.文件读写操作2.文件复制方案对比3.文件监控机制 二、扩展知识体系1.高级文件操作2.性能优化策略3.安全实践指南 三、最佳实践总结 引言 在 Node.js 生态系统中&#xff0c;fs 模块是与文件系统交互的核心工具。本文将通过代码示例和实践经验&a…...

9、AI测试辅助-代码Bug分析提示词优化

AI测试辅助-优化代码Bug分析提示词 Bug分析1、优化代码2、根据报错结果定位 Bug分析 利用AI优化代码Bug&#xff0c;有两种方式&#xff0c;一种是优化潜在的问题&#xff0c;一种是根据执行后的报错进行查找定位优化。其中如何用好提示词是关键 1、优化代码 常见需要优化的…...

AI无法解决的Bug系列(一)跨时区日期过滤问题

跨时区开发中&#xff0c;React Native如何处理新西兰的日期过滤问题 有些Bug&#xff0c;不是你写错代码&#xff0c;而是现实太魔幻。 比如我最近给新西兰客户开发一个React Native应用&#xff0c;功能非常朴素&#xff1a;用户选一个日期范围&#xff0c;系统返回该范围内…...

leetcode 153. Find Minimum in Rotated Sorted Array

题目描述 分析 可以发现一个规律&#xff1a; 假如整个数组最后一个元素是x。 最小值左侧&#xff08;不含最小值自己&#xff09;的元素全部大于x。 最小值右侧&#xff08;包含最小值自己&#xff0c;不包含x&#xff09;的元素全部小于x。 如果整个数组是有序的&#x…...

Brave 连接 Websocket 失败

前提: websocket 的服务启动正常连接的url是: ws://localhost: 15000/[子url] 在 Brave 浏览器的 console 中看到错误: WebSocket connection to ws://localhost:15000/ws failed:解决方法&#xff08;Brave 浏览器专用&#xff09; 方法 1&#xff1a;关闭 Brave 的 Shiel…...

【设计模式】基于 Java 语言实现工厂模式

目录 一、简单工厂模式 1.1 简单工厂模式的介绍 二、工厂方法模式 2.1 工厂方法模式的介绍 2.2 工厂方法模式的基本实现 2.3 工厂方法模式的应用场景 三、抽象工厂 3.1 抽象工厂的概念 3.2 抽象工厂的基本结构 3.3 抽象工厂的基本实现 3.4 抽象工厂的应用场景 四、…...

94.LabelGrid 的遍历与属性编辑 Maui例子 C#例子

for (int i 0; i < LabelGrid.Children.Count; i) {if (LabelGrid.Children[i] is Label label){await MainThread.InvokeOnMainThreadAsync(() >{label.TextColor Colors.Gray;});} } await Task.Delay(1000); // 延迟1秒 if (currentValue 0) {currentValue 16; } …...

Https流式输出一次输出一大段,一卡一卡的-解决方案

【背景】 最近遇到一个奇怪的现象&#xff0c;前端vue&#xff0c;后端python&#xff0c;服务部署在服务器上面后&#xff0c;本来一切正常&#xff0c;但公司说要使用https访问&#xff0c;想着也没什么问题&#xff0c;切过去发现在没有更改任何代码的情况下&#xff0c;ht…...

【C# 自动化测试】Selenium显式等待机制详解

Selenium显式等待机制详解 一、显式等待的概念 在自动化测试中&#xff0c;等待机制是处理页面元素加载延迟的重要手段。显式等待允许我们在继续执行代码之前等待某个条件发生&#xff0c;这比固定的强制等待更灵活高效。 二、显式等待的实现代码 1. 核心等待方法 /// <…...

【Redis】哈希表结构

目录 1、背景2、哈希表【1】底层结构【2】哈希冲突【3】链地址法【4】传统rehash【5】渐进式rehash【6】rehash触发条件【7】特性 1、背景 redis中的hashtable&#xff08;哈希表&#xff09;是一种高效的键值对存储结构&#xff0c;主要用于实现redis的字典类型&#xff0c;接…...

Redisson中为什么用lua脚本不用事务

一文详解事务和lua脚本的区别 核心问题&#xff1a; 为什么 Redisson 在实现分布式锁、信号量等复杂对象时&#xff0c;倾向于使用 Lua 脚本&#xff0c;而不是 Redis 内建的事务 (MULTI/EXEC)&#xff1f; 结论概览&#xff1a; Lua 脚本为 Redisson 提供了更强的原子性保证、…...

成功解决!!!Ubuntu系统安装包时出现:dpkg: 处理归档XXX时出错

在Ubuntu系统中在安装新的包时&#xff0c;有时会报错连环依赖问题&#xff0c;常见的报错为&#xff1a;下列软件包有未满足的依赖关系&#xff1a;XXX依赖XXX 但是它不会被安装 E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt --fix-broken install”(也可以…...

MySql数据库连接池

C数据库连接池 前言1.MySql API 函数讲解1.1 连接数据库的步骤1.2 MySQL C API1.2.1 初始化连接环境1.2.2 连接mysql服务器1.2.3 执行sql语句1.2.4 获取结果集1.2.5 得到结果集的列数1.2.6 获取表头 -> 列名(字段名)1.2.7 得到结果集中各个字段的长度(字节为单位)1.2.8 遍历…...

C++之fmt库介绍和使用(2)

C之fmt库介绍与使用(2) Author: Once Day Date: 2025年5月19日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

Python的collections模块:数据结构的百宝箱

Python的collections模块&#xff1a;数据结构的百宝箱 对话实录 小白&#xff1a;处理数据时&#xff0c;Python自带的数据结构不够用&#xff0c;有更强大的工具吗&#xff1f; 专家&#xff1a;那可不能错过collections模块&#xff0c;它提供了许多高效实用的数据结构&am…...

吃透 Golang 基础:数据结构之数组

文章目录 吃透 Golang 基础&#xff1a;数据结构之数组概述初始化访问和赋值小结参考资料 吃透 Golang 基础&#xff1a;数据结构之数组 对于 Golang 当中的顺序数据结构&#xff0c;使用频率最高的当然是切片&#xff0c;因为切片非常的灵活。与之相对比&#xff0c;数组常常会…...

第三个小程序动工:一款结合ai的菜谱小程序

1.环境搭建&#xff0c;与初步运行 安装及使用 | Taro 文档 找到一个合适的文件夹&#xff0c;cmd D:\gitee>pnpm install -g tarojs/cli╭──────────────────────────────────────────╮│ …...

小程序涉及提供提供文本深度合成技术,请补充选择:深度合成-AI问答类目

一、问题描述 最近新项目AI咨询小程序审核上线&#xff0c;按照之前小程序的流程&#xff0c;之前审核&#xff0c;提示审核不通过&#xff0c;审核不通过的原因&#xff1a;小程序涉及提供提供文本深度合成技术 (如: AI问答) 等相关服务&#xff0c;请补充选择&#xff1a;深…...

数据结构测试模拟题(1)

1、约瑟夫问题 #include<bits/stdc.h> using namespace std; const int N25; int e[N],ne[N],head-1,idx1; int n,m; void add_to_head(int x){e[idx]x;ne[idx]head;headidx; } void add(int k,int x){e[idx]x;ne[idx]ne[k];ne[k]idx; } int main(){cin>>n>>…...

Elasticsearch高级面试题汇总及答案

Elasticsearch高级面试题汇总及答案 这套Elasticsearch面试题汇总大全,希望对大家有帮助哈~ 1、什么是Elasticsearch Analyzer? 分析器用于文本分析,它可以是内置分析器也可以是自定义分析器。 2、Elasticsearch 支持哪些配置管理工具? 1、 Ansible 2、 Chef 3、 Pu…...

界面控件DevExpress WinForms v24.2——PDF Viewer功能升级

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...