性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断

🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断


📚 目录

  • 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 实现性能可视化诊断
    • 一、为什么选择 MiniProfiler? 🧐
    • 二、集成 MiniProfiler 到 ABP 项目 🛠️
      • 1️⃣ 安装 NuGet 包
      • 2️⃣ 在 `MyProjectWebModule.cs` 中注册
        • 集成流程示意图
      • 3️⃣ 在中间件中启用(仅限开发环境)
        • 中间件流程图
    • 三、前端页面嵌入 Profiler UI 🎨
      • 1️⃣ Razor Pages / MVC
      • 2️⃣ Blazor Server
        • 前端嵌入流程图
    • 四、实战演示:控制器或应用服务中标记关键耗时段 ⏱️
    • 五、进阶实践 🚀
      • 1️⃣ AOP 拦截全站性能
        • 自定义拦截器:`MiniProfilerInterceptor`
        • 注册拦截器并应用(示例:拦截所有应用服务)
        • AOP 拦截流程图
      • 2️⃣ HttpClient 自动打点
        • HttpClient 打点流程图
      • 3️⃣ 健康检查接口打点
        • 健康检查打点流程图
    • 六、安全与生产建议 🔒
    • 七、示例项目与复现方式 🏗️
      • 快速启动步骤


一、为什么选择 MiniProfiler? 🧐

在 ABP 应用开发中,很容易遇到以下性能难题:

  • 调用链复杂:控制器 → 应用服务 → 领域服务 → 仓储,每层调用都可能出现瓶颈。
  • EF Core 查询慢:未加索引、N+1 查询或大表扫描,经常导致数据库成为性能瓶颈。
  • 第三方 API 响应慢:调用外部服务时耗时不可见,无法快速定位是哪一步出现问题。

我们需要一个能快速诊断性能瓶颈零侵入前端可视化的工具。
MiniProfiler 正符合这些需求:

  • 轻量嵌入式性能分析器;对代码几乎零改动即可集成
  • 支持 SQL、服务方法、HttpClient 等多种调用的耗时可视化
  • 前端浮窗展示;无需跳转后台即可查看 Profiling 结果

二、集成 MiniProfiler 到 ABP 项目 🛠️

下面演示如何在 ABP vNext 项目中集成 MiniProfiler。请确保您的项目满足“适用环境”所列版本要求。

1️⃣ 安装 NuGet 包

dotnet add package MiniProfiler.AspNetCore.Mvc --version 5.0.2
dotnet add package MiniProfiler.EntityFrameworkCore --version 5.0.2

📌 建议使用 5.x 或更高版本,兼容 .NET 6/7/8、EF Core 6/7/8。如果未来 MiniProfiler 发布 6.x 以上大版本,也请以最新稳定版为准。
📌 若您的项目使用 EF Core 5 或 ABP v6,请访问 MiniProfiler GitHub 查询对应版本。

2️⃣ 在 MyProjectWebModule.cs 中注册

using Microsoft.Extensions.Configuration;
using StackExchange.Profiling;
using StackExchange.Profiling.Storage;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity;
using Volo.Abp.AspNetCore.Mvc;[DependsOn(typeof(AbpAspNetCoreMvcModule),typeof(AbpDynamicProxyModule) // 确保启用了动态代理
)]
public class MyProjectWebModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){var services = context.Services;var configuration = context.Services.GetConfiguration();services.AddMiniProfiler(options =>{// 路由前缀,访问地址为 /profileroptions.RouteBasePath = "/profiler";options.ColorScheme = StackExchange.Profiling.ColorScheme.Auto;options.EnableServerTimingHeader = true;options.TrackConnectionOpenClose = true;// 🔐 安全控制:仅允许拥有 "Admin" 角色的用户访问options.Authorize = request =>request.HttpContext.User?.IsInRole("Admin") == true;// 👥 多用户区分:从 HttpContext.User 提取用户名options.UserProvider = request =>{var user = request.HttpContext.User;return user?.Identity?.IsAuthenticated == true? user.Identity.Name: "Anonymous";};// 💾 持久化存储(可选):将 Profiling 数据保存到 SQL Server// 请先在 appsettings.json 中添加连接字符串 "ProfilerDb"// options.Storage = new SqlServerStorage(configuration.GetConnectionString("ProfilerDb"), maxStoredResults: 100);// 🔴 或者使用 Redis 存储(适合高并发、多实例环境)// options.Storage = new RedisStorage(configuration.GetConnectionString("RedisConnection"));})// EF Core 6/7/8 推荐 .AddEntityFramework(); 如果报错则改为 .AddEntityFrameworkCore().AddEntityFramework();}
}
集成流程示意图
安装 NuGet 包
在 MyProjectWebModule 配置 AddMiniProfiler
配置安全与存储选项
注册 AOP 拦截器(可选)
启用中间件:UseMiniProfiler()

3️⃣ 在中间件中启用(仅限开发环境)

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;public class MyProjectWebModule : AbpModule
{public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();if (env.IsDevelopment()){// ⚠️ 请务必将 UseMiniProfiler 放在 UseRouting 之前,才能捕获整个请求管道的耗时app.UseMiniProfiler();}app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseConfiguredEndpoints();}
}

💡 提示:

  • 如果使用的是 ABP v6 或更早版本,请将 app.UseConfiguredEndpoints() 替换为:
    app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
    
  • 确保先调用 app.UseAuthentication()app.UseAuthorization(),否则 HttpContext.User 中信息可能为空,影响 AuthorizeUserProvider 的逻辑。
中间件流程图
开发环境
生产环境
请求进来
环境检测
UseMiniProfiler
跳过 UseMiniProfiler
UseRouting
UseAuthentication → UseAuthorization → UseEndpoints

三、前端页面嵌入 Profiler UI 🎨

后端功能集成完成后,需要在前端布局页插入 MiniProfiler 的渲染代码,才能看到浮窗效果。以下示例展示了 Razor Pages/MVC 与 Blazor Server 的差异。

1️⃣ Razor Pages / MVC

_Layout.cshtml 的末尾(即 </body> 之前)插入:

@using StackExchange.Profiling<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><title>MyProject</title><!-- … 其他头部内容 … -->
</head>
<body>@RenderBody()@* 如果当前请求中有 MiniProfiler,则渲染浮动窗口 *@@if (MiniProfiler.Current != null){@await MiniProfiler.Current.RenderIncludes()}
</body>
</html>

📌 注意:

  • 确保在 _ViewImports.cshtml 中添加 @using StackExchange.Profiling,否则会提示找不到 MiniProfiler
  • 如果布局页与 _ViewImports.cshtml 不在同一路径,需在布局页最顶部手动引入 @using StackExchange.Profiling

2️⃣ Blazor Server

_Host.cshtml 的末尾(即 </body> 之前)插入:

@using StackExchange.Profiling<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><base href="~/" /><title>MyBlazorApp</title><!-- … 其他头部内容 … -->
</head>
<body><app><component type="typeof(App)" render-mode="ServerPrerendered" /></app>@* 如果当前请求中有 MiniProfiler,则渲染浮动窗口 *@@if (MiniProfiler.Current != null){@await MiniProfiler.Current.RenderIncludes()}<script src="_framework/blazor.server.js"></script>
</body>
</html>

🔔 提示:

  • Blazor Server 环境下同样需要引入 @using StackExchange.Profiling;如果未能渲染浮窗,可检查 CORS 配置是否允许跨域访问 /profiler/includes.js
前端嵌入流程图
不为空
为空
前端布局加载
检查 MiniProfiler.Current
渲染浮动窗口
不渲染
显示调用树、SQL、HTTP 等信息

四、实战演示:控制器或应用服务中标记关键耗时段 ⏱️

集成并渲染 UI 后,我们可以在业务代码里手动打点,直观查看各步骤耗时。下面示例展示在应用服务(ApplicationService)中如何妥善使用 Step 与异常处理。

using System;
using System.Threading.Tasks;
using StackExchange.Profiling;
using Volo.Abp.Application.Services;public class OrderAppService : ApplicationService
{private readonly IOrderRepository _orderRepository;public OrderAppService(IOrderRepository orderRepository){_orderRepository = orderRepository;}public async Task<OrderDto> GetAsync(Guid id){// 获取当前请求的 Profiler 实例,若在生产环境关闭则 profiler == nullvar profiler = MiniProfiler.Current;IDisposable step = null;try{// 第一层打点:🔍 查询订单数据step = profiler?.Step("🔍 查询订单数据");var order = await _orderRepository.GetAsync(id);// 第二层打点:📦 映射 Order → DTOusing (profiler?.Step("📦 映射 Order → DTO")){return ObjectMapper.Map<Order, OrderDto>(order);}}catch (Exception ex){// 在异常发生时新增一个标记,记录错误信息profiler?.Step($"❌ 查询订单数据失败: {ex.Message}");throw;}finally{// 无论成功或异常,都要关闭第一层 Stepstep?.Dispose();}}
}

🧠 建议:

  • 只对关键步骤进行打点,避免在每一行都嵌套 Step,否则 UI 层次过多、可读性下降。
  • 在异常处理时,要确保前面的 step?.Dispose() 能在 finally 中执行,不要在捕捉异常后忘记关闭先前 Step。

五、进阶实践 🚀

1️⃣ AOP 拦截全站性能

如果不想在每个方法都手动写 Step,可利用 ABP vNext 的动态代理拦截器,为所有应用服务或 Controller 自动打点。

自定义拦截器:MiniProfilerInterceptor
using System.Threading.Tasks;
using Castle.DynamicProxy;
using StackExchange.Profiling;public class MiniProfilerInterceptor : IAsyncInterceptor
{public async Task InterceptAsync(IInvocation invocation){var profiler = MiniProfiler.Current;using (profiler?.Step($"[Profiling] {invocation.TargetType.Name}.{invocation.Method.Name}")){await invocation.ProceedAsync();}}// 如果还需要拦截同步方法,可实现 IInterceptor:// public void Intercept(IInvocation invocation) { … }
}
注册拦截器并应用(示例:拦截所有应用服务)
using Volo.Abp;
using Volo.Abp.Modularity;
using Volo.Abp.DynamicProxy;[DependsOn(typeof(AbpDynamicProxyModule) // 确保动态代理功能可用
)]
public class MyProjectWebModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// … 前面已有 MiniProfiler 注册代码 …// 1. 注册拦截器到依赖注入容器context.Services.AddTransient<MiniProfilerInterceptor>();// 2. 配置动态代理:拦截所有继承自 ApplicationService 的类方法Configure<AbpDynamicProxyOptions>(options =>{options.Interceptors.Add<MiniProfilerInterceptor>(Predicates.ForService(type =>type.IsAssignableTo<AbpApplicationService>()));});// 如果要拦截 MVC Controller,也可使用:// Configure<AbpAspNetCoreMvcOptions>(options =>// {//     options.ConventionalControllers.Interceptors.AddService<MiniProfilerInterceptor>();// });}
}

✅ 这样,所有继承 ApplicationService 的服务方法都会被 Profiler 自动包裹,无需手动在每个方法中写 Step

💡 如果只想拦截某个特定命名空间的应用服务,可在 Predicates.ForService(...) 中提供更精准的匹配条件,例如:

Predicates.ForService(type => type.Namespace.Contains("MyProject.Application.Orders"))
AOP 拦截流程图
是应用服务
否则
应用服务/Controller 方法调用
动态代理拦截
Profiler.Step 包裹调用
直接执行
执行方法体
结束并返回

2️⃣ HttpClient 自动打点

在分布式或微服务场景下,调用第三方 API 也可能成为瓶颈。MiniProfiler 支持在 HttpClient 上自动打点。以下示例展示如何配置带打点功能的 HttpClient

using Microsoft.Extensions.DependencyInjection;
using StackExchange.Profiling;
using StackExchange.Profiling.Http;// 在 ConfigureServices 中:
services.AddHttpClient("ThirdParty")// 使用 ProfilingHandler 自动捕获 HttpClient 请求耗时.AddHttpMessageHandler(() => new ProfilingHandler(new HttpClientHandler()));// 在应用服务或 Controller 中注入 IHttpClientFactory:
public class ExternalService : IExternalService
{private readonly IHttpClientFactory _httpClientFactory;public ExternalService(IHttpClientFactory httpClientFactory){_httpClientFactory = httpClientFactory;}public async Task<string> GetExternalDataAsync(){var client = _httpClientFactory.CreateClient("ThirdParty");// 此次请求将被 Profiler 记录var response = await client.GetAsync("https://api.example.com/data");return await response.Content.ReadAsStringAsync();}
}
HttpClient 打点流程图
应用发起 HttpClient 请求
ProfilingHandler 拦截
记录请求开始时间
发送实际 HTTP 请求
记录响应结束时间
Profiler UI 显示耗时

3️⃣ 健康检查接口打点

如果项目有健康检查(Health Checks)端点,也可以为其打点,帮助监控该接口的执行耗时。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using StackExchange.Profiling;
using System.Threading.Tasks;[ApiController]
[Route("api/health")]
public class HealthController : ControllerBase
{private readonly HealthCheckService _healthCheckService;public HealthController(HealthCheckService healthCheckService){_healthCheckService = healthCheckService;}[HttpGet]public async Task<HealthReport> CheckAsync(){// 为健康检查整体逻辑打点using (MiniProfiler.Current?.Step("Health Check")){return await _healthCheckService.CheckHealthAsync();}}
}
健康检查打点流程图
客户端调用 /api/health
MiniProfiler.Step('Health Check')
执行数据库/Redis/外部接口检查
返回 HealthReport
Profiler UI 显示耗时

六、安全与生产建议 🔒

场景建议与示例
生产环境- 禁止启用 app.UseMiniProfiler(),避免将 SQL、堆栈信息暴露给最终用户。
- 持久化存储:使用 options.Storage 将 Profiling 数据保存到数据库/Redis,然后离线分析。例如:
csharp<br/>options.Storage = new SqlServerStorage(configuration.GetConnectionString("ProfilerDb"), maxStoredResults: 100);<br/>
多用户区分- 配置 options.UserProvider,让不同用户的 Profiling 数据能单独查看。例如:
csharp<br/>options.UserProvider = request =><br/>{<br/> var user = request.HttpContext.User;<br/> return user?.Identity?.IsAuthenticated == true<br/> ? user.Identity.Name<br/> : "Anonymous";<br/>};<br/>
认证保护- 设置 options.Authorize = request => request.HttpContext.User.IsInRole("PerfAdmin"); 限制只有“PerfAdmin”角色可访问 /profiler 路由。
- 注意:务必先在管道中调用 app.UseAuthentication()app.UseAuthorization(),否则 HttpContext.User 可能为空。
路由隐藏- 修改默认路由前缀:options.RouteBasePath = "/internal/profiler";
- 在 Nginx/IIS 层做 IP 白名单,仅允许公司内网访问。例如:
nginx<br/>location /internal/profiler {<br/> allow 192.168.1.0/24;<br/> deny all;<br/> proxy_pass http://localhost:5000/internal/profiler;<br/>}<br/>
跨域场景- 若前后端分离(UI 与 API 跨域),需在 API 项目中配置 CORS 以允许加载 Profiler 脚本。例如:
csharp<br/>services.AddCors(options =><br/>{<br/> options.AddPolicy("AllowProfiler", builder =><br/> {<br/> builder.WithOrigins("http://localhost:5001")<br/> .AllowAnyHeader()<br/> .AllowAnyMethod()<br/> .AllowCredentials();<br/> });<br/>});<br/>app.UseCors("AllowProfiler");<br/>
健康检查- 如果健康检查接口需监控耗时,可在 Controller 中添加 using (MiniProfiler.Current?.Step("Health Check")) { … },便于快速定位健康检查性能瓶颈。

🔒 提示:

  • 在生产环境仅保留“持久化存储”功能,关闭浮动窗口和即时展示,避免敏感信息泄露。
  • 确保在 Program.csStartup.cs 中先调用 app.UseAuthentication()app.UseAuthorization(),再调用 app.UseMiniProfiler()(开发环境)或 app.UseCors()

七、示例项目与复现方式 🏗️

以下示例仓库演示了如何在 ABP 项目中完整集成 MiniProfiler,涵盖开发环境打点、AOP 拦截、HttpClient 打点、持久化存储、健康检查打点等功能。

abp-miniprofiler-demo/
├── src/
│   ├── MyProject.Web/                   # Web 层(含 MiniProfiler 注册、中间件、UI、CORS)
│   ├── MyProject.Application/           # 应用服务层(示例 OrderAppService、ExternalService、HealthController)
│   ├── MyProject.EntityFrameworkCore/   # EF Core 层(DbContext、Migration、配置 ProfilerDb)
│   └── MyProject.Domain/                # 领域层(聚合、实体)
├── profiler-ui.png                      # Profiler UI 截图示例
├── README.md                            # 快速启动说明
└── appsettings.json                     # 包含 ProfilerDb、RedisConnection、CORS Origins 等配置

快速启动步骤

  1. 配置数据库
    • 打开 appsettings.json,在 "ConnectionStrings" 节点中填入:
     "ConnectionStrings": {"Default": "Server=.;Database=MyProjectDb;Trusted_Connection=True;","ProfilerDb": "Server=.;Database=ProfilerDb;Trusted_Connection=True;","RedisConnection": "localhost:6379"}
  • 如果您使用 SQLite、MySQL 或 PostgreSQL,可在 MyProject.EntityFrameworkCoreDbContext 配置中修改 UseSqlServer 为对应方法,例如 UseSqliteUseMySqlUseNpgsql
  1. 运行数据库迁移
   dotnet tool install --global dotnet-ef   # 如果尚未安装dotnet ef migrations add InitialCreate --project src/MyProject.EntityFrameworkCoredotnet ef database update --project src/MyProject.EntityFrameworkCore

如果使用 Redis 存储 Profiler 数据,请确保本地或容器中已启动 Redis,例如:

docker run -d --name redis -p 6379:6379 redis
  1. 恢复依赖并运行项目
   dotnet restoredotnet run --project src/MyProject.Web
  1. 访问应用并查看 Profiler
    • 浏览器打开:http://localhost:5000
    • 在页面右下角会出现 MiniProfiler 浮窗,点击即可展开 Profiling 详情,包括:
      • 请求链路总耗时
      • EF Core SQL 查询耗时与详细信息
      • HttpClient 调用耗时
      • 健康检查接口耗时
    • 如果配置了持久化存储,可登录后台管理页面或直接查询 ProfilerDb 数据库中的 MiniProfilers 表,离线分析历史数据。

🔍 线上对比:

  • MiniProfiler 适用于“开发/测试环境”快速定位性能瓶颈。
  • 生产环境若想做全面链路追踪,可结合 Elastic APM、Application Insights 等 APM 平台。
  • 生产环境仅保留“持久化存储”功能,关闭浮动窗口和即时展示,避免敏感信息泄露。

✅ 强烈建议:在所有 ABP 项目中默认集成 MiniProfiler,并按需启用 AOP 打点与 HttpClient 自动打点,让性能瓶颈无处藏身!

🔗 更多资源

  • MiniProfiler 官方文档:https://miniprofiler.com/dotnet/
  • ABP vNext 官方指南:https://docs.abp.io/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32 在Arduino开发环境中,如果程序运行报错如何定位程序报错是哪行代码

在开发中&#xff0c;我们常常会遇到编译正常&#xff0c;但是运行过程中程序报错&#xff0c;然后重启&#xff0c;在这种情况下&#xff0c;又没法知道是哪段程序引起的&#xff0c;现在我们就来解决这个问题。 其实ESP32的SDK中已经附带这些debug的工具了。 首先如果我们程…

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…

win10启动时小键盘灯默认不亮怎么办

第一步&#xff0c;按winR&#xff0c;打开运行。 第二步&#xff0c;输入regedit&#xff0c;打开注册表。 第三步&#xff0c;在注册表编辑器中,依次展开HKEY_ USERS --》.DEFAULT --》Control Panel --》Keyboard &#xff0c; 第四步&#xff0c;选中Keyboard 之后在右侧窗…

C盘的“下载”修改位置时出错了,怎么还原

本来想修改“下载”的位置&#xff0c;结果直接成D盘的快捷键了。 正常应该是D盘里面的一个文件夹&#xff0c;而不是D盘。 而且打开D盘&#xff0c;里面的文件夹&#xff0c;全部按照时间分区显示了&#xff0c;而不是正常的文件显示。 解决办法&#xff1a; 1、还原下载路…

量化面试绿皮书:7. 100的阶乘中有多少个尾随零

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 7. 100的阶乘中有多少个尾随零 Q: 100 ! 100! 100!&#xff08;100 的阶乘&#xff09;中有多少个尾随零&#xff1f; A: 100 ! 100! 100…

Java 常用 API 分类总结(算法竞赛考前速记篇)- 适用于算法竞赛(如 CCF CSP、蓝桥杯、NOI)

以下是Java 常用 API 的系统性总结&#xff0c;特别适用于算法竞赛&#xff08;如 CCF CSP、蓝桥杯、NOI&#xff09;场景。按照功能分类&#xff0c;并给出代表性方法及简要用法说明&#xff0c;方便复习与带入考场&#xff1a; ✅ Java 常用 API 分类总结&#xff08;算法竞赛…

重复文件管理 一键清理重复 图片 文档 免费 超轻量无广告

各位电脑小卫士们&#xff01;今天给你们介绍一款超厉害的软件——ZZYDupFile&#xff0c;它是专门搞重复文件管理的轻量级工具&#xff0c;能帮咱快速找到并清理电脑里的重复文件。接下来我就详细说说它的那些优点。 软件下载地址安装包 首先说说它的核心功能。它查重有好几…

本地部署企业邮箱,让企业办公更安全高效

在当今数字化办公时代&#xff0c;企业邮箱作为企业沟通协作的重要工具&#xff0c;承载着企业业务往来和办公协同的重要职能。基于安全性、个性化需求、系统集成等方面的考量&#xff0c;越来越多的企业倾向于选择本地部署企业邮箱&#xff0c;本地化部署不仅能够有效守护企业…

基于深度强化学习的智能机器人导航系统

前言 随着人工智能技术的飞速发展&#xff0c;机器人在日常生活和工业生产中的应用越来越广泛。其中&#xff0c;机器人导航技术是实现机器人自主移动的关键。传统的导航方法依赖于预设的地图和路径规划算法&#xff0c;但在复杂的动态环境中&#xff0c;这些方法往往难以适应。…

gorm 配置数据库

介绍 GORM 是 Go 语言中最流行的 ORM&#xff08;对象关系映射&#xff09;库之一&#xff0c;基于数据库操作的封装&#xff0c;提供类似 Django ORM / SQLAlchemy 的开发体验。 特性描述支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自动迁移自动根…

k8s4部署

configMap configmap概述&#xff1a;数据会存储在etcd数据库&#xff0c;其应用场景主要在应用程序的配置 configmap支持的类型&#xff08;1&#xff09;键值对&#xff08;2&#xff09;多行数据 pod使用configmap资源有两种常见的方式&#xff08;1&#xff09;变量注入&a…

2025HNCTF - Crypto

Crypto lcgp 题目&#xff1a; from Crypto.Util.number import * import gmpy2 import random n getPrime(1024) flag bH&NCTF{ str(uuid.uuid4()).encode() b} flagbytes_to_long(flag) e 2024 cpow(e, flag, n)class LCG:def __init__(self, seed, a, b, m):sel…

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…

前后端分离开发 和 前端工程化

来源&#xff1a;黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;_哔哩哔哩_bilibili 前后端混合开发&#xff1a; 需要使用前端的技术栈开发前端的功能&#xff0c;又需要使用Java的技术栈…

QT线程同步 QReadWriteLock并发访问

QT多线程专栏共有17篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、QReadWriteLock、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池、ObjectThread多线程操作、 moveToThread等…

【物联网-ModBus-RTU

物联网-ModBus-RTU ■ 优秀博主链接■ ModBus-RTU介绍■&#xff08;1&#xff09;帧结构■&#xff08;2&#xff09;查询功能码 0x03■&#xff08;3&#xff09;修改单个寄存器功能码 0x06■&#xff08;4&#xff09;Modbus RTU 串口收发数据分析 ■ 优秀博主链接 Modbus …

03.数据类型

数据类型 数据长什么样数据需要多少空间来存放系统内置数据类型用户定义数据类型 选择正确的数据类型对于获得高性能至关重要 三大原则: 更小的通常更好&#xff0c;尽量使用可正确存储数据的最小数据类型简单就好&#xff0c;简单数据类型的操作通常需要更少的CPU周期尽量…

达梦数据库字段类型 varchar 转 text

达梦数据库字段类型 varchar 转 text 业务场景问题浮现问题处理方式一 总结 业务场景 在初次创建达梦数据库表的时候&#xff0c;仅仅设定了基础的表字段。然而&#xff0c;在预估字段值的长度时&#xff0c;常常会出现不够准确的情况。例如&#xff0c;我创建了一张参数配置表…

MyBatis 缓存机制源码深度解析:一级缓存与二级缓存

MyBatis 缓存机制源码深度解析&#xff1a;一级缓存与二级缓存 一、一级缓存1.1 逻辑位置与核心源码解析1.2 一级缓存容器&#xff1a;PerpetualCache1.3 createCacheKey 方法与缓存命中1.4 命中与失效时机1.5 使用方式 二、二级缓存2.1 逻辑位置与核心源码解析2.2 查询流程、命…

【题解-Acwing】1097. 池塘计数

题目&#xff1a;1097. 池塘计数 题目描述 农夫约翰有一片 N∗M 的矩形土地。 最近&#xff0c;由于降雨的原因&#xff0c;部分土地被水淹没了。 现在用一个字符矩阵来表示他的土地。 每个单元格内&#xff0c;如果包含雨水&#xff0c;则用”W”表示&#xff0c;如果不含…